Skip to content

全局状态 ​

全局状态这个问题呢,有不同的说法。

官方推荐的,专门用于全局状态管理的工具叫做 pinia。

但是呢,vue3 提供了 hooks 的概念,也可以用于简单的全局状态管理。

这里呢,笔者根据从业近 10 年的经验来说,更推荐使用 pinia 的方式。

专业的事情,交给专业的工具去做。

vue3 的 hooks 是可以解决简单的 全局状态 管理问题。

但是,从项目整体来说,pinia 显然更合适。

主观意识问题

官方推荐的全局状态管理工具,任何水平的 vue 程序员都清楚,更易于理解。

千人千面问题

不同的人,使用 hooks 的方式不一定是完全一致的,但是 pinia 本身已经提供了一致的用法和写法。

这种 约定 好的概念,更利于合作和开发。

所以,yite-cli 脚手架内置了已经配置好的 pinia 全局状态管理方式,开箱即用。

全局状态的定义,位于项目的 src/plugins/useGlobal.js 文件中。

全局状态的定义如下:

javascript
export const useGlobal = Pinia.defineStore('global', () => {
    // 全局数据
    const $GlobalData = $ref({
        appConfig: {
            name: '随易科技'
        },
        // 用户令牌
        token: $Storage.local.get('token') || '',
        // 用户数据
        userData: $Storage.local.get('userData') || {}
    });

    // 全局计算数据
    const $GlobalComputed = {};

    // 全局方法
    const $GlobalMethod = {};

    return {
        $GlobalData,
        $GlobalComputed,
        $GlobalMethod
    };
});

使用方法:

vue
<script setup>
// 外部集

// 内部集

// 选项集
defineOptions({
    name: 'default'
});

// 全局集
const { $GlobalData, $GlobalComputed, $GlobalMethod } = useGlobal();

// 数据集
const $Data = $ref({
    isShow: {}
});

// 方法集
const $Method = {
    async initData() {},
    onLogout() {
        $Storage.clearAll();
        $GlobalData.token = '';
        $GlobalData.userData = {};
        $Router.push('/login');
    }
};
</script>

在 script setup 中,直接获取即可,不需要导入 useGlobal.js 文件,yite-cli 已经默认导入了。

何以解忧,唯有代码。不忘初心,方得始终。