企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
> Vuex 是一个专为 vuejs 应用程序开发的全局状态管理模式,可以跨页面,跨组建之共享这些全局状态 [TOC] # 简单示例 ## 创建store仓库 > 文件地址:/store/index.js ~~~ import Vue from 'vue'; import Vuex from 'vuex'; Vue.use(Vuex); const store = new Vuex.Store({ state:{ count:0 }, mutations:{ add(state) { state.count ++; }, sub(state, n=1) { state.count -= n; } } }) export default store ~~~ ## main.js中挂载vuex ~~~ import Vue from 'vue' import App from './App' // 引入vuex import store from './store/index.js' // 把vuex定义成全局组件 Vue.prototype.$store = store Vue.config.productionTip = false App.mpType = 'app' const app = new Vue({ store, //挂载 ...App }) app.$mount() ~~~ ## 页面调用 ~~~ <template> <view class="content"> <view>{{counter}}</view> <view>{{this.$store.state.count}}</view> <button type="default" @tap="doAdd">加加</button> <button type="default" @tap="doSub">减减</button> </view> </template> <script> export default { methods:{ doAdd(){ this.$store.commit('add') }, doSub(){ this.$store.commit('sub', 2) } }, computed:{ counter(){ return this.$store.state.count } } } </script> ~~~ # 相关参数 ## state > 把相关的变量放入state参数进行状态管理,该参数只可读,如要修改,请使用mutations参数 > 官方地址:https://vuex.vuejs.org/zh/guide/state.html ### mapState 辅助函数 > 当一个组件需要获取多个状态时,将这些状态都在代码中分别声明计算属性会比较冗余。为了解决这个问题,我们可以使用 mapState 辅助函数帮助我们生成计算属性 #### 创建store仓库 > 文件地址:/store/index.js ~~~ import Vue from 'vue'; import Vuex from 'vuex'; Vue.use(Vuex); export default new Vuex.Store({ state:{ count:0, students: [ { name: 'wk', score: 59 }, { name: 'jj', score: 80 } ] } }) ~~~ #### 页面调用 ~~~ <template> <view class="content"> <view>{{count}}</view> <view class="" v-for="(item,index) in students" :key="index"> {{item.name}} </view> </view> </template> <script> import { mapState } from 'vuex' export default { computed:{ ...mapState([ 'count', 'students' ]) } } </script> ~~~ ## getter > 当我们需要对state进行派生或者扩展其他的处理计算时,可以选择使用getter进行二次封装,相当于计算属性 > 官方地址:https://vuex.vuejs.org/zh/guide/getters.html ### mapGetters 辅助函数 > mapGetters 辅助函数仅仅是将 store 中的 getter 映射到局部计算属性 #### 创建store仓库 > 文件地址:/store/index.js ~~~ import Vue from 'vue'; import Vuex from 'vuex'; Vue.use(Vuex); export default new Vuex.Store({ state:{ students: [ { name: 'wk', score: 59 }, { name: 'jj', score: 80 } ] }, getters:{ // 过滤数据,获取大于>60分的优质学生,getter相当于计算属性 greatStudents(state){ return state.students.filter(function(val){ return val.score > 60; }); }, // <=60的候补学生 badStudents(state) { return state.students.filter(function(val){ return val.score <= 60; }); } } }) ~~~ #### 页面调用 ~~~ <template> <view class="content"> <view>优质学生:</view> <view class="" v-for="(item,index) in greatStudents" :key="index"> {{item.name}} </view> <view>候补学生:</view> <view class="" v-for="(item2,index2) in badStudents" :key="index2"> {{item2.name}} </view> </view> </template> <script> import { mapGetters } from 'vuex' export default { computed:{ ...mapGetters([ 'greatStudents', 'badStudents' ]) } } </script> ~~~ ## mutation > 更改 state的唯一方法是提交 mutation,并且mutation 必须是同步函数(详情参考官方) > 官方地址:https://vuex.vuejs.org/zh/guide/mutations.html ### mapMutations 辅助函数 > 你可以在组件中使用 this.$store.commit('xxx') 提交 mutation > 或者使用 mapMutations 辅助函数将组件中的 methods 映射为 store.commit 调用 #### 创建store仓库 > 文件地址:/store/index.js ~~~ import Vue from 'vue'; import Vuex from 'vuex'; Vue.use(Vuex); export default new Vuex.Store({ state:{ count : 0 }, mutations:{ add(state){ state.count ++ }, sub(state, num) { state.count -= num } } }) ~~~ #### 页面调用 ~~~ <template> <view class="content"> <view>{{this.$store.state.count}}</view> <button type="default" @click="add">加加加</button> <button type="default" @click="sub(2)">减减减</button> </view> </template> <script> import { mapMutations } from 'vuex' export default { methods:{ ...mapMutations([ 'add', // 将 `this.add()` 映射为 `this.$store.commit('add')` 'sub' // 将 `this.sub(num)` 映射为 `this.$store.commit('sub', num)` ]) } } </script> ~~~ ## action > Action 类似于 mutation,不同在于 > 1. Action 提交的是 mutation,而不是直接变更状态 > 2. Action 可以包含任意异步操作 > 官方地址:https://vuex.vuejs.org/zh/guide/actions.html ### mapActions 辅助函数 > 你在组件中使用 this.$store.dispatch('xxx') 分发 action > 或者使用 mapActions 辅助函数将组件的 methods 映射为 store.dispatch 调用 #### 创建store仓库 > 文件地址:/store/index.js ~~~ import Vue from 'vue'; import Vuex from 'vuex'; Vue.use(Vuex); export default new Vuex.Store({ state:{ count : 0 }, mutations:{ add(state){ state.count ++ }, sub(state, num=1) { state.count -= num } }, actions:{ //异步模拟仅供参考 addAsync(context){ setTimeout(function(){ context.commit('add') }, 1000) }, subAsync(context, num=1){ setTimeout(function(){ context.commit('sub', num) }, 1000) } } }) ~~~ #### 页面调用 ~~~ <template> <view class="content"> <view>{{this.$store.state.count}}</view> <button type="default" @click="addAsync">加加加</button> <button type="default" @click="subAsync(2)">减减减</button> </view> </template> <script> import { mapActions } from 'vuex' export default { methods:{ ...mapActions([ 'addAsync', // 将 `this.addAsync()` 映射为 `this.$store.dispatch('add')` 'subAsync' // 将 `this.subAsync(num)` 映射为 `this.$store.dispatch('subAsync', num)` ]) } } </script> ~~~