其他分享
首页 > 其他分享> > Vue 状态管理之vuex && {mapState,mapGetters}

Vue 状态管理之vuex && {mapState,mapGetters}

作者:互联网

  1 # 一、理解vuex
  2     1.概念:专门在Vue中实现集中式状态(数据)管理的一个Vue插件,对vue应用中多个组件的共享状态进行集中式的管理(读写),也是一种组件间通信的方式,且适用于任意组件间通信。
  3     2.Github地址:https://github.com/vuejs/vuex
  4 # 二、什么时候使用Vuex
  5     1.多个组件依赖同一状态
  6     2.来自不同组件的行为需要变更同一状态
  7 # 三、安装: npm i vuex@3
  8     vuex@3 对应的  vue2
  9     vuex@4 对应的  vue3
 10 # 四、搭建vuex环境
 11     // 该文件用于创建Vuex中最为核心的store,路劲(一般都放这里):src/store/index.js
 12     // 引入Vuex
 13     import Vue from 'vue'
 14     import Vuex from 'vuex'
 15 
 16     // 引入插件
 17     Vue.use(Vuex);
 18 
 19     // 准备actions,用于响应组件中的动作
 20     const actions = {
 21         jia(miniStore, value){
 22         miniStore.commit('JIA', value)
 23         },
 24         jian(miniStore, value){
 25         miniStore.commit('JIAN', value)
 26         },
 27         jiaOdd(miniStore, value){
 28         if (miniStore.state.sum % 2){
 29             miniStore.commit('JIA', value)
 30         }
 31         },
 32         jiaWait(miniStore, value){
 33         setTimeout(()=>{
 34             miniStore.commit('JIA', value)
 35         }, 500);
 36         }
 37     }
 38     // 准备mutation,用于操作数据(state)
 39     const mutations = {
 40         JIA(context, value) {
 41         context.sum += value;
 42         },
 43         JIAN(context, value) {
 44         context.sum -= value;
 45         },
 46     }
 47     // 准备state,用于存储数据
 48     const state = {
 49         sum: 0,
 50     }
 51 
 52 
 53     // 创建并暴露store
 54     export default new Vuex.Store({
 55         actions,
 56         mutations,
 57         state
 58     });
 59     # 组件部分代码
 60     <template>
 61         <div>
 62         <h1>当前求和为:{{sum}}</h1>
 63         <h1>将当前求和的值放大10倍:{{bigSum}}</h1>
 64         <select v-model.number="n">
 65             <option value="1">1</option>
 66             <option value="2">2</option>
 67             <option value="3">3</option>
 68         </select>
 69         <button @click="invrement">+</button>
 70         <button @click="decrement">-</button>
 71         <button @click="invrementOdd">当前求和为奇数再加</button>
 72         <button @click="invrementWait">等一等再加</button>
 73         </div>
 74     </template>
 75     <script>
 76     import {mapState, mapGetters} from 'vuex'
 77     export default {
 78         name: 'Count',
 79         data(){
 80         return {
 81             n: 1
 82         }
 83         },
 84         computed:{
 85         // sum(){
 86         //     return this.$store.state.sum;
 87         // },
 88         // bigSum(){
 89         //     return this.$store.getters.bigSum;
 90         // },
 91         // 借助mapState生成从state中来的计算数据
 92         // ...mapState({sum: 'sum'}),  // 代替上面的sum() 
 93         ...mapState(['sum']),  // 数组写法 
 94         // 借助mapState生成从getters中来的计算数据
 95         // ...mapGetters({bigSum: 'bigSum'}), // 代替上面的bigSum()
 96         ...mapGetters(['bigSum']),  // 数组写法
 97         },
 98         methods:{
 99         invrement(){
100             // console.log('@', this);
101             this.$store.commit('JIA', this.n);
102         },
103         decrement(){
104             this.$store.commit('JIAN', this.n);
105         },
106         invrementOdd(){
107             this.$store.dispatch('jiaOdd', this.n);
108         },
109         invrementWait(){
110             this.$store.dispatch('jiaWait', this.n);
111         }
112         },
113         mounted(){
114 
115         }
116     }
117     </script>
118     <style scoped>
119         button {
120         margin-left: 5px;
121         }
122     </style>
123     
124     
125     # 1.组件中渡漆vuex中的数据:$store.state.sum
126     # 2.组件中修改vuex中的数据: $store.dispatch('actions中的方法名', data) 或  $store.commit('mutations中的方法名', data)
127     #     备注:若没有网络请求或其他业务逻辑,组件中也可以越过actions,不写dispatch,直接写commit

 

标签:Vue,miniStore,vuex,sum,value,mapState,state,mapGetters,store
来源: https://www.cnblogs.com/watermeloncode/p/16416236.html