首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Vuex 状态树

参考 Nuxt Vuex store 的实现,Lavas 支持以模块方式组织 Vuex 的状态树。 对于开发者来说,只需要在项目根目录下 /store 文件夹中创建单独的模块文件,Lavas 会将这些单独的模块组合起来,生成最终的 Vuex.Store 实例。

下面我们以模板项目中已有的负责页面切换的 pageTransition 模块为例,介绍具体使用方法。如果您对 Vuex 尤其是模块特性还不了解,推荐查阅官方文档学习。

创建单独的模块文件

通常我们在使用 Vuex 定义状态时,会将 state 和 mutation 放在一个对象中传给 Vuex.Store 以创建最终的状态树,类似这样:

代码语言:javascript
复制
12345678910const store = new Vuex.Store({
    state: {
        count: 1
    },
    mutations: {
        increment (state) {
            state.count++
        }
    }
})

在 Lavas 中定义状态和上述做法略有不同,我们以创建的模板项目为例,在 /store 目录下我们看到有一个单独的 pageTransition.js 文件。其中暴露了 statemutation,当然也可以暴露包含异步操作的 action。Lavas 会以此创建一个名为 pageTransition 的模块。

代码语言:javascript
复制
123456789101112131415export const state = () => {
    return {
        type: 'none',
        effect: 'none'
    };
};

export const mutations = {
    setType(state, type) {
        state.type = type;
    },
    setEffect(state, effect) {
        state.effect = effect;
    }
};

注意这里的 state 是一个返回初始状态的方法而非简单对象。这是由于在 SSR 场景下,单一状态会被多个服务端 Vue 实例共享,造成互相影响,因此需要每次调用 state 方法创建新的初始状态对象。如果您只是在 SPA/MPA 场景下使用 Lavas,可以不用遵守这个规则,直接返回初始状态对象即可。

在组件中使用

下面我们来看看如何在组件中访问定义好的状态。

我们以模板项目中 /core/App.vue 为例,由于创建了 pageTransition 这个命名空间,我们需要把模块的空间名称字符串,也就是 pageTransition 作为第一个参数传递给 mapState 函数,这样所有绑定都会自动将该模块作为上下文,使用 mapActions 同理。

代码语言:javascript
复制
123456789101112import {mapState} from 'vuex';

// 在模板中使用
<transition
    :name="pageTransitionEffect">

// 使用 mapState 绑定到 this 上
computed: {
    ...mapState('pageTransition', {
        pageTransitionEffect: state => state.effect
    })
}

扫码关注腾讯云开发者

领取腾讯云代金券