• vuex笔记


    store 实例会注入到根组件下的所有子组件中,子组件通过 this.$store 访问

    computed:{
       count(){
          // store 实例会注入到根组件下的所有子组件中,子组件通过 this.$store 访问
          return this.$store.state.count
       }
    }
    

    当一个组件需要获取多个状态时候,将这些状态都声明为计算属性会有些重复和冗余。为了解决这个问题,可以使用 mapState 辅助函数帮助生成计算属性

        computed:{
           ...mapState({
               //'count' 等同于 `state => state.count`  
               count:'count',
               countAlias:state=>state.count ,
               // 为使用 `this` 获取当前组件状态,使用常规函数
               countLocalState(state){
                 return state.count+this.localCount   
               }
           })
        },
        data() {
            return {
                localCount:9
            }
        }
    

    Getter 从 store 中的 state 中派生出一些状态,相当于store的计算属性,可以不用在每个子组件里重新计算属性,直接在store里设置计算属性

    //通过属性访问

    //store.js	
    export default new Vuex.Store({
        state: {
            count: 0,
            arr: [1, 2, 3, 4, 5]
        },
        mutations: {
            increment(state) {
                state.count++
            }
        },
        getters: {
            //Getter 接受 state 作为其第一个参数
            oddNumInArr: state => {
                return state.arr.filter(num => (num % 2 == 0))
            }
        }
    });
    
    //子组件
    computed:{
       ...mapState({
           storeComputedAttr(state){
             //Getter 会暴露为 store.getters 对象,可以以属性的形式访问这些值  
             return this.$store.getters.oddNumInArr     
           }
       })
    }
    

    //getter返回一个方法时,即通过方法访问时

    getters: {
        //getter 返回一个函数,getter 在通过方法访问时,每次都会去进行调用,而不会缓存结果
        getOddOrEvenNumInArr: (state) => (flag) => {
            return state.arr.filter(num => {
                return flag ? num % 2 == 0 : num % 2 != 0
            })
        }
    }
    
    computed:{
       ...mapState({
           oddNumInStoreComputed(state){
             return this.$store.getters.getOddOrEvenNumInArr(true);
           },
           evenNumInStoreComputed(state){
             return this.$store.getters.getOddOrEvenNumInArr(false);
           }
       })
    }
    

    mapGetters 辅助函数,类似于mapState,将 store 中的 getter 映射到当前子组件的计算属性

    import {mapState,mapGetters} from 'vuex';
    
    computed:{
       ...mapGetters({
          oddNumInArr:"oddNumInArr"
       })
    }
    

    更改 Vuex 的 store 中的状态的唯一方法是提交 mutation

    mutations: {
        //子组件不能直接调用这个方法 
        pushNumInArr(state, otherArg) {
            state.arr.push(otherArg.newNum)
        }
    }
    
    methods:{
        //提交载荷(Payload)方式 
        addNum(){
            this.$store.commit("pushNumInArr",{newNum:Math.random()});
        },
        //对象风格的提交方式
        addOtherNum(){
            this.$store.commit({
                type:"pushNumInArr",
                newNum:Math.random()
            })
        }
    }
    

    mapMutations是将组件中的methods映射为commit调用

    ...mapMutations({
        ps(){
            this.$store.commit({
              type:"pushNumInArr",
              newNum:Math.random()
           })
        }
    })  
    

    Action
    Action 提交的是 mutation,而不是直接变更状态
    Action 可以包含任意异步操作
    Action 通过 store.dispatch 方法触发

    actions: {
        //接受一个与 store 实例具有相同方法和属性的 context 对象,如context.commit context.state context.getters context.mutations ...
        //因此可以解构为{commit,state,getters,mutations}
        pushNumInArr(context, otherArg) {
            context.commit("pushNumInArr", otherArg)
        },
        pushNumInArrASync({ commit }, otherArg) {
            setTimeout(function() {
                commit("pushNumInArr", otherArg);
            }, 1500)
        }
    }
    
    methods:{
        ...mapActions({
            triggerAction(){
                this.$store.dispatch(
                    {
                        type:"pushNumInArrASync",
                        newNum:77
                    }
                )
            }
        })
    }
    

    //在一个action里调用另一个action

    actions: {
        pushNumInArrASync({ commit }, otherArg) {
            return new Promise(function(resolve, reject) {
                setTimeout(function() {
                    commit("pushNumInArr", otherArg);
                    resolve();
                }, 1500)
            })
        },
        shiftNumInArrAsync({ dispatch, commit }, otherArg) {
            return dispatch("pushNumInArrASync", otherArg).then(function() {
                commit("shiftNumInArr")
            })
        }
    }
    

    总结:


    • state 全局的状态
    • getter 相当于store中的计算属性
    • mutation 同步修改state的事件方法
    • action 可以dispatch异步commit mutation从而修改state
    • module 模块化store
    • mapState 将store中的属性映射到当前组件的计算属性,主要是可以映
      射多个,如果是单个属性可以在计算属性里直接通过this.$store.state访问
    • mapGetters 将store中的计算属性映射到当前组件的计算属性
    • mapMutations 将store中的方法映射到当前组件的methods里
    • mapActions 同上

    8/3/2018 4:10:00 PM

  • 相关阅读:
    Java下载文件,中文名乱码(attachment;filename=中文文件名)
    Spring Boot打jar包,排除lombok等scope=provided的依赖
    VirtualBox+WinDbg+Win7调试环境配置
    【编译原理】FIRST集、FOLLOW集算法原理和实现
    epoll EPOLLL、EPOLLET模式与阻塞、非阻塞
    【编译原理】提取左部公因子算法
    编译和阅读WRK源码
    WRK 源码编译使用
    Windows加载器与模块初始化
    关于Win7 x64下过TP保护(应用层)
  • 原文地址:https://www.cnblogs.com/leyi/p/9414666.html
Copyright © 2020-2023  润新知