赞
踩
当我们的应用遇到多个组件共享状态时,会需要多个组件依赖于同一状态抑或是来自不同视图的行为需要变更同一状态。以前的解决办法:
a.将数据以及操作数据的行为都定义在父组件;
b.将数据以及操作数据的行为传递给需要的各个子组件(有可能需要多级传递)
传参的方法对于多层嵌套的组件将会非常繁琐,并且对于兄弟组件间的状态传递无能为力。在搭建下面页面时,你可能会对 vue 组件之间的通信感到崩溃 ,特别是非父子组件之间通信。此时就应该使用vuex,轻松可以搞定组件间通信问题。
在 vue 的世界里 vuex 是用来实现 mvvm 中关键的 vm 层(视图模型层),你甚至可以认为它就是 vue的奶妈,它总是可以为 vue的顺畅运行提供强大的支持
vuex是vue的状态管理工具,状态即数据。 状态管理就是管理vue中的数据
注意:
vue组件提供的是一个 vm层的实现,在没有引入vuex的情况下,这会导致 vue 组件非常重、代码复用率低。
Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。这里的关键在于集中式存储管理。简单来说,对 vue 应用中多个组件的共享状态进行集中式的管理(读/写)
从图中可以看到 vuex 主要做了这么几件事
Vuex.Store里面包含这五个核心概念
我们将从vuex这五个核心概念一一分别介绍
vuex中的数据源state,我们需要保存的数据就保存在这里,可以在页面通过 this.$store.state来获取我们定义的数据;state,用于存储数据和操作数据,相等于vue中的data
在vue-cli2中我们需要自己引入安装vuex
安装:npm install vuex --save
在src目录下 新建state文件夹,新建index.js文件
在index.js文件中创建store 对象并暴露出去
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
//创建Store,用于存储数据和操作数据
const store = new Vuex.Store({
state: {
city: '上海' //2. 指定state属性,用于提供数据
}
})
//4.暴露store给main.js的vue根实例引入联系
export default store
//5.在组件中使用vuex中的数据
console.log(store.state.city)**
4.main.js中创建根实例时,传入store
5.然后子组件使用:这样在页面就可以显示store 对象的state的属性值“上海”
//获取城市名
{{this.$store.state.city}}
或者(用在组件中用计算属性返回this.$store.state.city为组件的属性city)
修改vuex中的数据,必须在 mutations进行修改,不能直接修改
如果要修改state,需要在mutations的方法修改
mutations: {
// 添加一个方法// state:表示state对象,payload表示传进来的参数
mufun (state,payload) {
state.city = payload
}
}
2.在组件中
触发mutations
想要修改state,必须触发mutations提供的方法:"commit"*
无论是同步或者异步的actions想要触发调用mutations,都要通过commit的方法
通过commit从而转化触发mutations
this.$store.commit('mufun',“北京”)
actions传给 mutations 使用ctx.commit(“定义 mutations的函数名”,参数)
mapState,mapMutations 辅助函数
一 .mapState:
在要使用的组件import { mapState } from ‘vuex’
mapState指将state数据映射到组件的计算属性中
computed: {
...mapState(['city'])
}
html写法改为:{{this.city}}
二. mapMutations :
vuex中的getters,类似于实例中computed
getters的作用也是给vuex提供数据,但是这个数据是算出来的
1.在index.js
2.在组件中使用(跟state差不多,具体参考上面state用法)
3.mapGetters辅助函数使用方法
Action 提交的是 mutation,而不是直接变更状态。
actions类似于mutations,但是可以有异步的操作
actions是不能直接修改state数据,
修改state数据只有mutations
actions最终还是提交了mutations
ctx 上下文,代表了当前的store
从图中我们可以得知
1.在组件中
2.在index.js
3.action赋值函数
引入并在在方法methods中使用
1.在index.js中
注意:
默认情况下,除了(state是带命名空间的模块私有的),而模块内部的 action、mutation 和 getter 是注册在全局命名空间的——这样使得多个模块能够对同一 mutation 或 action 作出响应。
可以通过添加 namespaced: true 的方式使其成为带命名空间的模块
2.在组件中辅助函数则需要在每个前面加上命名空间的名字
3.而不在辅助函数中则需要添加"user/"
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。