Vuex
Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。
它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化
状态存储是响应式的
适用于大型的单页面应用,多人协作开发
下载:npm install vuex
引入:
improt Vuex from ‘vuex’
Vue.use(Vuex);
创建一个仓库:
const store= new Vuex.Store({
})
vuex组成:
state:状态,可以使用this.$store.state.xxx
getters :获取最新值,或者取值的时候做取值前的一些操作,拿到的是被操作后的值
mutations:修改器(行为集合),用于修改state中的状态变量,唯一修改方式
actions:动作,去触发异步后改变store值的时候,先经过actions,再由actions触发mutations
module:模块,向store注入其他子模块,用于多人开发多模块(namespaced:是否全局)
strict:true,代表只能通过mutations修改状态
plugin:用于向Vuex加入运行期的插件
vuex工作流程:
1,首先会先创建一个公共的容器,存放供组件使用的公共状态
new Vuex.store({
state:{ //初始状态,state中存放供所有组件使用的状态
xxx:'111'
}
})
1-1:把store注入到vue根实例上
2, 组件中要使用容器中的状态
this.$store.state.xxx
3, 组件中想要改变容器中的状态
3-1: mutations是同步操作,不支持异步
mutations:{
add(state,val){//例如在mutations中添加了一个add行为,第一个形参是自动获取的state,第二个参数是获取的值
state.xxx='222' || val;
}
}
在组件中触发mutations中的add行为
$store.commit('add',333)
为什么要使用mutations修改状态?
store里面存的是公共状态,页面中有100个组件,每一个组件都有可能改变公共状态,
如果改变状态不经过mutations,a组件改变状态的时候让xxx=444,而b组件改变状态的时候,
让xxx={},这个时候使用到公共状态中的xxx的组件都会受到影响,所以,要给一个规则去改变xxx,
不能随意改,要根据一个规则改xxx的状态信息
这是一种设计模式:如果我们以后封装了功能,也只留一个入口更改数据,不能随意改
需求:在b中点击按钮,从服务器先异步获取数据,把获取的数据修改公共状态xxx
3-2:actions 存放异步修改state的方法
b去触发 actions中的f方法,f方法中异步获取数据,获取数据后,f方法中有个形参自动拿到store,
store.commit('add') 触发mutations中的add
页面中使用
this.$store.dispatch('f');
vue中是单向数据流:
1,vuex的数据传递流程也是单向的
2,props,父传子