vuex

2018-06-06  本文已影响0人  大香蕉s

1. state


mapState({
    count: state => state.count
    // or
    count: 'count'
    // or
    count(state) {
        // 此时 this 为实例
        return state.count + this.xxx
    }
})

computed: {
    // 使用对象展开运算符将此对象混入到外部对象中
    ...mapState(['count', 'num'])
}

2. getter


state 进行包装

// 定义
new Vuex.Store({
    getters: {
        len: state => {
            state.todos.length
        }

        getTodoById: (state) => (id) => {
             state.todos.find(i => i.id === id)
        }

       getMoneyByLen: (state, getters) => {
             state.price * getters.len
       }
    }
})

// 调用
store.getters.len
store.getters.getTodoById(2)

// 同理
mapGetters({
    ...
})

3. mutation


修改 store 中的状态的唯一方法是提交 mutation,且为 同步 修改

// 定义
const store = new Vuex.Store({
    mutations: {
        addone(state, playload) {
             state.count += playload. nums
        }
    }
})


// 调用
store.commit('addone' , {nums: 10})
// or
store.commit({type: 'addone' , nums: 10})

// 同理
mapMutatiobs

当需要在对象上添加新属性时,应该

使用产量代理 Mutation 事件名

const AddOne = 'addone'
...
[AddOne](state, playload) {
    ...
}
...

4. action


可以异步

// 定义
new Vuex.store({
    actions: {
        addone(context) {
            // 调用 mutation 中的 addone
            context.commit('addond')
        },
        
        add2({ commit, state }, playload) {
            commit('addond', playload)
        }
    }
})

// 调用
store.dispatch('addone', playload)
// or
store.dispatch({ type: 'add2', ...playload })

// 同理
mapActions({
    ...
})

store.dispatch 后返回 promise,
故: store.dispatch('addone').then(log)
同理可以用在 actionsdispatch 另一个 action ,然后 .then(...)

5. module


// 定义
new Vuex.Store({
    modules: {
        a: {
            namespaced: true,
            state: {},
            getters: {
                len(state, getters, rootState, rootGetters) {...}
            },
            mutations: {},
            actions: {
                addone({state, commit, rootState, rootGetters }) {
                  dispatch('addone')                               //  'a/addone'
                  dispatch('addone', null, { root: true })  //  全局 'addone'
               }
            },
        }
    }
})

// 调用
state.a.xxx
state.getters['a/len']
state.dispatch['a/addone']

// map 函数
...mapState('some/nested/module', {
    a: state => state.a,
    b: state => state.b
  })

...mapActions('some/nested/module', [
    'foo',
    'bar'
])
// or
const { mapState, mapActions } = createNamespacedHelpers('some/nested/module')


上一篇下一篇

猜你喜欢

热点阅读