通俗理解Vuex:状态管理、集中式存储管理。把需要多个组件共享的变量全部存储在一个对象里面,这个对象放置在顶层的vue实例中让其他组件都可以使用,并且是响应式的。
Vuex核心概念
State—保存共享状态,单一状态树
Getters—类似组件里的计算属性
Mutations—操作状态
Actions—用于进行异步操作
Modules—划分模块
介绍
Vuex是一个专门为vue.js应用程序开发的状态管理模式,是一个多组件共享状态的插件
它采用集中式存储管理应用的所有组件状态,并以相应的规则保证状态以一种可预测的方式发生变化。
Vuex也集成到Vue的官方调试工具devtools extension,提供了诸如零配置的time-travel调试、状态快照导入导出等高级调试功能。
状态管理、集中式存储管理:把需要多个组件共享的变量全部存储在一个对象里面,这个对象放置在顶层的vue实例中让其他组件都可以使用,并且是响应式的。
提示:以下是本篇文章正文内容,下面案例可供参考
npm安装Vuex
#运行时依旧依赖,因此不加--save-dev
npm install vuex -save
简单使用(理解就好):main.js导入使用
//main.js导包安装插件
import Vuex from 'vuex'
Vuex.use(Vuex);
//以上虽可以,但是容易污染main.js
真实开发
A、src下独立创建store文件夹,编写逻辑代码
//src下创建新文件夹store,创建index.js文件
import Vue from 'vue'
import Vuex from 'vuex'
//1.安装插件
Vue.use(Vuex)
//2.创建对象
const store =new Vuex.store({
state:{
},
mutations:{
},
actions:{
},
getters:{
},
modules:{
}
})
//3.导出对象
export default store;
B、main.js导入
4.回main.js导入
import store from './store'
new Vue({
el:'#app',
store, //在这里才能通过原型链让所有组件通过$store用到
render:h => h(App)
})
C、使用共享状态
//5.使用
$store.state.变量名
//尽量不要自己直接引用后改数据,如$store.state.变量名++;这种。
//我们用mutations来提供改数据的方法
全局单例模式(大管家),将共享的状态抽取出来,交给大管家统一管理
每个视图,按照规定好的规则,进行访问和修改操作
这才是Vuex背后的思想
vue-devtools是一个浏览器插件,装了便于查看Vuex的各种数据变动
安装devtools安装插件
浏览器->扩展->搜索devtools->找到Vue.js devtools
之前我们说过,不推荐直接改Vuex里的数据,因为Vuex能更好跟踪数据变化,按操作来更好
通过mutation里定义方法,来实现对Vuex里的数据来修改
A、定义操作数据的mutations
//1、设置mutation
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const store =new Vuex.store({
state:{
counter:100
},
mutations:{
//方法
increment(state){
state.counter++;
},
decrement(state){
state.counter--;
}
},
actions:{
},
getters:{
},
modules:{
}
})
通过$store.commit传入定义好的方法名的字符串,来完成调用
2、组件中使用mutation
//2、调用
//定义点击事件@click,通过commit去调用
methods:{
addition(){
this.$store.commit('increment')
},
subtraction(){
this.$store.commit('decrement');
}
}
关于Vuex的入门到此就好,准备好了吗,现在我们开始冲刺了
英文名:Single Source Truth,单一数据源
总结:即使你有多个数据,也只创建一个store对象
毕竟 Vue.p原型链.$store=store 全局挂载-后面好用
Vuex核心概念
State---保存共享状态,单一状态树
Getters---类似组件里的计算属性
Mutations---操作状态
Actions---用于进行异步操作
Modules---划分模块
getters类似于计算属性,话不多说,上代码演示
//1、定义
const store =new Vuex.store({
state:{
},
mutations:{
},
actions:{
},
getters:{
powerCounter(state){
return state.counter * state.counter;
}
},
modules:{
}
})
//2、使用
//直接当属性用,不用加小括号
$store.getters.powerCounter;
//也可以当函数,传参给它,但此时getters定义的需要rturn function(参数){}
getters:{
aaa(state){
rturn function(参数){
}
}
}
$store.getters.powerCounter(参数);
Vuex的store状态更新的唯一方式:提交Mutations
Vue要求用同步方法,因为mutations里进行异步操作,devtools不能捕捉它
Mutations主要包括两部分
1、字符串的事件类型(type)
2、一个回调函数(handler),该回调函数的第一个参数就是state
A、定义
mutations:{
increment(state){
state.counter++;
}
}
B、调用
使用mutations更新state,利用commit传入mutation字符串
btnclick:function(){
this.$store.commit("increment")
}
使用mutations带参数,参数要是多可以考虑传递对象。
A、普通提交风格
mutations:{
incrementCounter(state,count){
state.counter+=count;
}
}
btnclick:function(count){
this.$store.commit("incrementCounter",count)
}
//上述传什么就是什么
B、特殊风格提交
该方法传的都是一个对象
btnclick:function(count){
this.$store.commit({
type:'incrementCounter',
count,
})
}
mutations:{
incrementCounter(state,payload){
state.counter+=payload.count;
}
}
Vuex的store中的state是响应式的,当state中的数据发生改变时,Vue组件会自动更新
这就要求我们必须遵守一些Vuex对应的规则
1、提前在store中初始化好所需的属性
2、当给state中的对象添加新属性时,使用下面方式
01、使用Vue.set(obj,'newProp',123)
02、用新对象给旧对象重新赋值
通俗点讲:
1、初始化的都有响应式;
2、未初始化的,在mutation初始化定义,是没有响应式的。
3、后初始化的通过Vue提供的方法,思考借鉴Vue数组。
mutations的类型常量。。。。。暂时先过,官方推荐这种做法
Action类似于Mutation,但是是用来代替Mutation进行异步操作的。
在改state时,不能在actions里直接改,需要用commit去调mutations修改。代码规范吧。
//vuex代码
mutations:{
updateInfo(){
}
}
//注意这个context
actions:{
aupdateInfo(context){
setTimeout(()=>{
//不能直接在这里改state,需要用commit去调mutations
context.commit('updateInfo');
},1000)
}
}
//调用:
//dispatch区别commit;
methods:{
btnclick(){
this.store.dispatch('aupdateInfo');
}
}
coderWhy老师讲的promise 非常高端。p139集的promise使用太牛了,调用actions成功并返回数据,actions里的方法return promise,然后dispatch调接上.then
将store分割成模块,使得每个模块都有自己的state、mutations、actions、getters
//模块a、b可以在外面定义,然后es6语法你懂的,更简约
modules:{
a:{
state:{
},
mutations:{
},
actions:{
},
getters:{
}
},
b:{
state:{
},
mutations:{
},
actions:{
},
getters:{
}
}
}
使用:
this.$store.state.a.变量名
this.$store.commit('mutations')
this.$getters.方法名
单例模式–大官家。
state–全局变量
mutations–提供操作全局变量的方法
getters–类似全局属性
actions–异步mutations
modules–套娃
注意代码和文件结构,共同创建文明和谐vuex。
谢谢阅读