State:不用多说,就是我们的状态。(姑且可以当做就是data中的属性)
View:视图层,可以针对State的变化,显示不同的信息。
Actions:这里的Actions主要是用户的各种操作:点击、输入等等,会导致状态的改变。
chrome网上应用商店搜索:vue.js devtools
实现一下之前简单的案例:
存放Vuex代码:创建一个文件夹store,并且在其中创建一个index.js文件,在index.js文件中写入如下代码。
有时候,我们需要从store中获取一些state变异后的状态,比如下面的Store中:
我们可以在Store中定义getters
如果我们已经有了一个获取所有年龄大于20岁学生列表的getters, 那么代码可以这样来写
getters默认是不能传递参数的, 如果希望传递参数, 那么只能让getters本身返回另一个函数
store/index.js:
import Vue from 'vue'
import Vuex from 'vuex'
import mutations from './mutations'
import actions from './actions'
import getters from './getters'
import moduleA from './modules/moduleA'
// 1.安装插件
Vue.use(Vuex)
// 2.创建对象
const store = new Vuex.Store({
state: {
counter: 1000,
students: [
{ id: 110, name: 'why', age: 18 },
{ id: 111, name: 'kobe', age: 24 },
{ id: 112, name: 'james', age: 30 },
{ id: 113, name: 'curry', age: 10 }
],
},
mutations: {
// 方法
increment(state) {
state.counter++;
},
decrement(state) {
state.counter--;
}
},
actions,
getters: {
powerCounter(state) {
return state.counter * state.counter
},
more20stu(state) {
return state.students.filter(s => s.age > 20)
},
more20stuLength(state, getters) {
return getters.more20stu.length
},
moreAgeStu(state) {
return function (age) {
return state.students.filter(s => s.age > age)
}
// 不推荐下面写法,阅读性太差
/* return age => {
return state.students.filter(s => s.age > age)
} */
}
},
modules: {
a: moduleA
}
})
// 3.导出store独享
export default store
// 对象的解构
const obj = {
name: 'why',
age: 18,
height: 1.88,
address: '洛杉矶'
}
const { name, height, age } = obj;
App.vue:
------APP中的内容------
{{ message }}
{{ $store.state.counter }}
------APP中的内容:getters相关信息------
{{ $store.getters.powerCounter }}
{{ $store.getters.more20stu }}
{{ $store.getters.more20stuLength }}
{{ $store.getters.moreAgeStu(12) }}
------Hello Vuex中的内容------
HelloVuex.vue:
我是vuex组件
{{ $store.state.counter }}
{{ $store.getters.powerCounter }}
{{ $store.getters.more20stu }}
结果:
Vuex的store状态的更新唯一方式:提交Mutation
通过mutation更新:
Vuex的store状态的更新唯一方式:提交Mutation
通过mutation更新:
在通过mutation更新数据的时候, 有可能我们希望携带一些额外的参数
但是如果参数不是一个呢?
上面的通过commit进行提交是一种普通的方式
Vue还提供了另外一种风格, 它是一个包含type属性的对象:
Mutation中的处理方式是将整个commit的对象作为payload使用, 所以代码没有改变, 依然如下:
Vuex的store中的state是响应式的, 当state中的数据发生改变时, Vue组件会自动更新
当我们点击更新信息时, 界面并没有发生对应改变。
让它改变的方法:
下面代码的方式一和方式二,都可以让state中的属性是响应式的
项目过大时,可以使用常量替代Mutation事件的类型
创建一个文件: mutation-types.js, 并且在其中定义我们的常量.
定义常量时, 我们可以使用ES2015中的风格, 使用一个常量来作为函数的名称
某些情况, 我们确实希望在Vuex中进行一些异步操作, 比如网络请求。此时就用到了action
Action类似于Mutation, 但是用来代替Mutation进行异步操作的
Action的基本使用代码如下:
在Vue组件中, 如果我们调用action中的方法, 那么就需要使用dispatch:
同样的, 也是支持传递payload:
在Action中, 我们可以将异步操作放在一个Promise中, 并且在成功或者失败后, 调用对应的resolve或reject:
注意:虽然,我们的doubleCount和increment都是定义在对象内部的。但是在调用的时候,依然是通过this.$store
来直接调用的。
actions的写法呢? 接收一个context参数对象
局部状态通过 context.state 暴露出来,根节点状态则为 context.rootState
如果getters中也需要使用全局的状态, 可以接受更多的参数
当我们的Vuex帮助我们管理过多的内容时, 好的项目结构可以让我们的代码更加清晰