什么叫vuex?
官网地址
官方解释: Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。通俗的说就是一个仓库管理系统,一个对数据动态管理的仓库。你可以存储数据,可以改变数据,可以读取数据,还可以监控数据的变化,总之,它比之前的事件总线更强大。
安装方式
如果你没有安装它可以用npm这样安装
npm install --save vuex
配置vuex
首先我们创建一个文件store.js,随便放在那个地方,我的放在assets目录下,其内容是
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
//数据的仓库
const state = {
items:[],
mg:'1',
flag:'2'
}
//对数据的简单处理,相当于computed,但不能改变state内数据的值
const getters = {
mg(state){
return state.mg;
}
}
//改变数据的唯一方式
const mutations = {
//第一个参数是默认的state,第二个参数是页面传过来的(即可以修改或是保存)
increment(state,list){
state.mg = list;
},
add(state,dat){
state.flag = dat;
}
}
//Action类似于mutation, Action提交的是mutation,而不是直接变更状态Action是异步的mutation是同步的。
const actions = {
//
}
const store = new Vuex.Store({
state,
getters,
mutations,
actions
})
export default store
state, getters, mutations,actions是构造器(vuex.store)的四个最重要的,也是最主要的参数。强调一下,改变数据(修改,存储)只有一种方式,那就是通过mutations,其他的都不可以。
vuex的配置文件store.js写完后,到main.js中注册一下,所有的组件就都可以使用了。
然后我们来看看各个组件及内容(还是之前的示例)
donghua组件
<template>
<div id="thirdchild">
<h2>donghua</h2>
<p>{{mg}}</p>
<!-- <p>{{$store.state.mg}}</p> -->
<button @click='action'>改变数值</button>
<button @click='handleIncrement'>点击事件</button>
{{flag}}
</div>
</template>
<script>
export default {
data () {
return {
msg: 'Welcome to Your Vue.js App',
dat:''
}
},
computed:{
/* mg(){
return this.$store.state.mg;
},*/
mg(){
return this.$store.getters.mg;
},
flag(){
return this.$store.state.flag;
}
},
methods:{
action(){
//改变state中的值或者说将值存入state中,关注commit的两个参数
this.$store.commit('increment',10);
this.$router.push('/firstchild');
},
handleIncrement(){
this.$store.commit('add',10);
}
}
}
</script>
<style type="text/css">
#thirdchild{
width: 400px;
height: 300px;
border:solid red 1px;
}
</style>
firstchild组件
<template>
<div id="firstchild">
<h2>firstchild</h2>
<p>{{mssg}}</p>
{{mg}}
<button v-on:click='sendMsg'>firstchild组件传值</button>
</div>
</template>
<script>
// import store from '../assets/donghua'
export default {
data () {
return {
mssg:''
}
},
computed:{
mg(){
return this.$store.state.mg;
}
},
methods:{
sendMsg:function(){
this.$router.push('/second');
}
}
}
</script>
<style type="text/css">
#firstchild{
width: 400px;
height: 140px;
border:solid #000000 1px;
}
</style>
路由
我们的目的是将donghua组件中的某个值改变后传到firstchild组件并显示出来。npm run dev 打开服务器后,首页(donghua.vue)
第一个组件firstchild
当我们点击“改变数值”的按钮后,它跳转到了firstchild组件并且它的值已经从1变成了10,说明我们使用vuex通信成功了。
我们来看看它的过程
donghua组件中我们通过按钮事件,将state的值改成了10,组件里想要存储值到state的唯一方法是mutations,我们说过,而操作mutations的方式就是commit('xx','yy')提交,第一个参数就是mutations里面的方法名称,第二个就是你想要改变的值。
firstchild组件接收到值后,通过计算属性的简单处理后,直接就可以用{{}}的语法表示出来,其实是可以直接读出state里的值的,就像这样
{{$store.state.mg}},但是为了更优雅一点就可以用计算属性处理下再表示,之前的vuex.store的四大核心之一的getters选项功能就是和computed的是一样的。
当然还有其他的一些函数和方式来使我们的代码更简洁,如mapState ,mapMutations,mapActions辅助函数及扩展运算符等,他们的用法官网上有辅助函数,也很简单,就不多说了。
简单的总结下,
vuex核心的四个参数,state是数据仓库,所有要用的数据都放在这里;getters作用相当于计算属性computed,在数据放在dom中之前做一些简单的处理;Mutation 是改变state中数据的方法,所有的逻辑业务都可以放在这里处理它,而操作Mutation是通过commit方法;Action是类似于Mutation的,其内容是一样的,不同的是Action是处理异步的业务逻辑,像ajax,settimerout定时器等,且Action 提交的是 mutation,而不是直接变更状态官方解说。本节代码有需要的可以downloadGitHub。