nuxt笔记

980 阅读1分钟

nuxt的store使用方法

目录结构

1.store下新建index.js,是nuxt状态树的入口文件

import Vue from 'vue';
import Vuex from 'vuex';

Vue.use(Vuex);

const store = () => new Vuex.Store({
    getters: {},
    state: {
        num: 0,
    },
    mutations: {
        addIncrement(state,payload){
            console.log(payload)
            state.num = payload;
        }
    },
    actions: {
        SET_ADD_ACTION(context,payload){
            setTimeout(() => {
                context.commit('addIncrement',payload.num);
            }, 1000);
        }
    }
})
export default store;

该文件导出一个Vuex实例

2.状态树的模块管理 在store目录下新建其他JS文件或者是新建文件夹,区别是在引用的时候多一层目录结构,其他的没有区别 例如,新建company.js

import Vue from 'vue';
import Vuex from 'vuex';

Vue.use(Vuex);
export const getters = {

}
export const state = ( {
    a: 333
});
export const mutations = {
    reduceNum(state,payload){
        state.a = payload;
    }
}
export const actions = {
    SET_REDUCE_ACTION({commit},payload){
        console.log(payload)
        setTimeout(() => {
            commit('reduceNum',payload.abc)
        }, 1000);
    }
}
export default {
    getters,
    state,
    mutations,
    actions,
    namespaced: true
}
  • mutations可以对所有的状态进行操作
  • 所有的异步操作都应该在actions中完成,actions可以提交mutations的操作
  • 如果需要局部状态注册,则在导出时需要namespaced: true一下 这时,index.js的变化有
import Vue from 'vue';
import Vuex from 'vuex';
import company from './company.js';

Vue.use(Vuex);

const store = () => new Vuex.Store({
    getters: {},
    state: {
        ...
    },
    mutations: {
       ...
    },
    actions: {
        ...
    },
    modules:{
        company
    },
})
export default store;

状态调用

3.状态的使用

  • 使用index.js里的状态
<template>
    <div>
        <p>{{num}}</p>
        <div><button @click="add()">ADD</button></div> 
    </div>
</template>
<script>
import {mapState,mapMutations,mapActions,mapGetters} from 'vuex';
export default {
    ...
    computed: {
        //这里先获取num的状态
        ...mapState({num: state => state.num})
    },
    methods: {
        add(){
            //派发事件SET_ADD_ACTION并处理
            this.$store.dispatch('SET_ADD_ACTION',{num: 999})
        }
    },
}
</script>
  • 使用company.js里的状态
<template>
    <div>
        <div>{{num}}</div>
        <div><button @click="add">ADD</button></div>
    </div>
</template>
<script>
import {mapState,mapMutations,mapActions,mapGetters} from 'vuex';
export default {
    ...
    computed: {
        //使用局部状态时需要添加模块的名字
        ...mapState('company',{
            num: (state) => state.a
        })
    },
    methods: {
        //同理,使用actions的局部状态也要添加模块名字
        ...mapActions('company',['SET_REDUCE_ACTION']),
        add(){
            this.$store.dispatch('company/SET_REDUCE_ACTION',{abc: 888})
        }
    },
}
</script>

如有错误,欢迎轻喷哈~