说明:这个例子使用vue2.0 并且安装的vuex也要跟这个版本对应否则会出现各种各样的错误正确对应版本package.json里
"vue": "^2.6.14",
"vuex": "^3.6.2"
之前由于我安装的是vue3 所以我学的vuex都对应不上。vue2和vue3main.js代码都不同,加上vuex的版本也是不同为4.0,所以各种报错 ,下面为该例用的版本。
npm install vuex@3
npm install vuex@3
在这里插入代码片
2.编写store.js文件用于管理状态
//引入vue
import Vue from 'vue'
//引入vuex
import Vuex from 'vuex'
//应用插件
Vue.use(Vuex)
export default store
3.在main.js里引入store 并挂载到组件实例,这样每个组件都能使用store里的数据
import Vue from 'vue'
import App from './App.vue'
//引入store
import store from './vuex/store'
Vue.config.productionTip = false
new Vue({
el:"#app",
store,
render: h => h(App),
})
4.向store里添加state,actions,mutations等,并交给store管理,这段代码里的注释已经详细解释
//引入vue
import Vue from 'vue'
//引入vuex
import Vuex from 'vuex'
//应用插件
Vue.use(Vuex)
//创建state用于保存数据 要写成一个对象,因为包含n组key-value,管理n个组件的状态
const state={
num:0
}
//创建一个actions。要写成一个对象,包含n个响应组件的动作函数
const actions = {
// jia(a,b){
// console.log('action-jia',a,b)
// a.commit('JIA',b)
// }
//actions里的方法接收两个参数(context,value)context是一个迷你版的$store,value是组件页面传过来的数据
jia(context,value){
//用context(迷你$store)的commit方法通知mutations加工状态。
context.commit("JIA",value)
}
}
//创建一个对象,要写成一个对象,包含的是n个真正操作数据的方法(直接接触state),这里的方法才是真正加工state的
const mutations = {
// JIA(a,b){
// console.log("JIA",a,b)
// }
//这里的 方法接收两个参数(state,value),分别是管理的状态state和页面传递到actions的数据,再传到这里
JIA(state,value){
this.state.num+=value
}
}
//创建store
const store = new Vuex.Store({
//交给store管理
state,
actions,
mutations
})
//暴露store
export default store
5.在UI组件里展示数据,调用方法等,store里的所有东西(数据和一些API)都保存在$store里
所以取数据用:
<h1>求和为:{{$store.state.num}}</h1>
响应事件的方法需要调用store的dispatch方法,这个方法带着字段和数据寻找对应它的actions,然后actions再commit找到对应的mutations,mutations里的方法真正接触到store里保存的数据完成对数据的操作
页面调用方法,dispatch分发给actions
this.$store.dispatch('jia',this.n)
找到对应的actions
jia(context,value){
//用context(迷你$store)的commit方法通知mutations加工状态。
context.commit("JIA",value)
}
再找到对应的mutations完成对数据的操作
JIA(state,value){
this.state.num+=value
}
vuex的getters类似于vue的computed(计算属性),是经过一些规则处理state中的原始数据,getters也交由store管理,保存在$store.getters里
const getters = {
newValue(state){//newValue就是getters处理后的数据
return state.num*100
}
}
const store = new Vuex.Store({
//交给store管理
state,
actions,
mutations,
getters
})
在页面取用的时候保存在$store.getters.key中
$store.getters.newValue}
有时候需要把state里的数据经过处理再在页面上展示(比如放大100倍),这时候可以使用计算属性实现,
computed:{
//自己定义computed
sum:function(){
return this.$store.state.num
},
}
页面获取数据方式
<h1>通过computed处理state后取值求和为:{{sum}}</h1>
在computed里同样可以处理来自于getters里的数据】
computed:{
bigSum:function(){
return this.$store.getters.newValue
},
}
页面获取方式
<h1>和经过computed里处理getters处理后为:{{bigSum}}</h1>
上面在compute获取处理state里的值都是自己定义函数编写的,mapState和mapGetters的作用就是不用自己编写,使编码简化。首先从vuex引入这两个方法
<sctipt>
import {mapGetters, mapState} from 'vuex'
</script>
接着在computed里
computed:{
...mapState({sum:'num'}),
}
sum是我在页面展示数据用的,num对应的是state保存的值,…展开符是因为computed本身就是一个大的对象,{sum:‘num’}也是对象,必须这样展开。
页面获取方式
<h1>通过computed里mapState处理state后取值求和为:{{num}}</h1>
同理mapGetters的使用方法
computed:{
...mapGetters({bigSum:'newValue'})
}
bigSum为页面展示数据用的,newValue对应getters里的数据
页面获取
<h1>和经过computedmapGetters里处理getters处理后为:{{newValue}}</h1>
如果mapState和mapGetters需要映射多组数据,可以有简写形式,但是命名必须更规范
...mapState(['num']),
...mapGetters(['newValue'])
页面获取
<h1>通过computed里mapState处理state后取值求和为:{{num}}</h1>
<h1>和经过computedmapGetters里处理getters处理后为:{{newValue}}</h1>
说明:在一些actions里,并没有什么逻辑业务和异步事件等,仅仅用了commit方法,既然这样,可以在页面越过dispatch,类似这样的actios
jia(context,value){
// //用context(迷你$store)的commit方法通知mutations加工状态。
context.commit("JIA",value)
},
就可以在页面直接commit
//直接对话mutations
increment(){
this.$store.commit('JIA',this.n)
}
调用这个事件
<button @click="increment">+</button>
mapMutataios的作用就是自动生成这个increment函数,但是需要在点击事件调用的时候传值
<button @click="increment(n)">+</button>
先引入mapMutations
import {mapMutations} from 'vuex'
在methods里使用
...mapMutations({increment:'JIA'}),
这个也可以简写,但是一般不推荐
<button @click="JIA(n)">+</button>
...mapMutations(['JIA']),
mapActions使用方法基本跟mapMutations一样。页面里的方法一般存在逻辑或者异步等,所以不能直接commit,步骤
先引入
import {mapActions} from 'vuex'
...mapActions(
{
incrementOdd:"jiaOdd",
incrementAsync:"asyncJia"
}
),
mapActionsF同样可以简写,方法同mapMutations。
vuex的全部状态state都以 s t o r e 的 形 式 注 入 到 v u e 实 例 , 所 以 这 个 实 例 里 的 所 有 组 件 都 可 以 使 用 v u e x 管 理 的 状 态 s t o r e , 非 常 简 单 。 下 面 添 加 P e r s o n 组 件 使 用 s t o r e 的 数 据 。 添 加 P e r s o n 组 件 , 在 store的形式注入到vue实例,所以这个实例里的所有组件都可以使用vuex管理的状态store,非常简单。下面添加Person组件使用store的数据。 添加Person组件,在 store的形式注入到vue实例,所以这个实例里的所有组件都可以使用vuex管理的状态store,非常简单。下面添加Person组件使用store的数据。添加Person组件,在store.state.num就能取到vuex管理的store里的state
PersonCom.vue
<template>
<h1>我是Person组件,上方组件求和为{{$store.state.num}}</h1>
</template>
<script>
export default {
name: 'PersonCom',
}
</script>