我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Vue3状态管理的使用详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Vue3状态管理的使用详解

背景

随着Vue3的逐步应用,对状态管理的需求越来越多。起初是基于Vuex4进行状态管理的,但是Vuex4也暴露了一些问题。从个人角度来说,Vuex4类似于过渡期产品,对TypeScript的支持性并不完整。如果使用TypeScript编写组件,需要遵循一定步骤后,才可以正确进行类型推断,并且对modules的使用上也并不友好。Vuex核心贡献者Kia King也表示Vuex5已经在计划中,并且能提供完整的TypeScript支持,那么在Vuex5面世之前,或者直接"舍弃"Vuex的话有没有其他状态管理的方案?

Provide / Inject

provide和inject并不是Vue3的新特性,在Vue2中就已经存在了。文档中提到provide和inject绑定并不是可响应的。然而,如果你传入了一个可监听的对象,那么其对象的property还是可响应的。

Vue3在Computed与watch的基础上新增了响应性API ref和reactive,可以更加方便provide和inject的应用,再结合Composition API的思想,是否能实现一个简易版的状态管理?

抽离共享状态


// class="lazy" data-src/context/calculator.ts

import { ref, inject, provide, readonly } from 'vue';

type Calculator = {
    count: number;
    increase: () => void;
    updateCount: (num: number) => void;
};

//provide的key,唯一令牌
const CalculatorSymbol = Symbol();

//提供者
export const calculatorProvide = () => {
  	//数目
    const count = ref<number>(1);
  	//递增方法
    const increase = () => {
        count.value++;
    };
   //更新方法
    const updateCount = (num: number) => {
        count.value = num;
    };
  	//提供的共享状态对象
    const depends = {
        count: readonly(count), //状态只读,通过方法进行修改
        increase,
        updateCount
    };
  	//使用provide api实现状态对象提供
    provide(CalculatorSymbol, depends);
  	//返回状态对象,让同级可调用
    return depends;
};

//注入方法
export const calculatorInject = () => {
    //使用inject api注入状态
    const calculatorContext = inject<Calculator>(CalculatorSymbol);
  	//未共享就注入的错误校验
    if (!calculatorContext) {
        throw new Error('Inject must be used affer Provide');
    }
  	//返回注入的贡献状态
    return calculatorContext;
};

提供数据

相比起Vuex的全局共享,利用Provide / Inject可以实现全局或者局部共享,

全局共享,可以在main.ts中注入全局状态:


// class="lazy" data-src/main.ts

import { createApp, h } from 'vue';
import App from '@/App.vue';
import { calculatorProvide } from '@/context/calculator';

// 创建vue实例
const app = createApp({
    setup() {
        calculatorProvide();
        return () => h(App);
    }
});

// 挂载实例
app.mount('#app');

如果只想局部共享,可以在父组件中注入状态


// class="lazy" data-src/views/parent.vue

import { defineComponent } from "vue";
import { calculatorProvide } from '@/context/calculator';

export default defineComponent({
  name: "parent",
  setup() {
    //共享数据
    calculatorProvide();
  }
});

注入数据

子组件可以通过状态注入,使用或修改状态


// class="lazy" data-src/views/child.vue

import { defineComponent } from "vue";
import { calculatorInject } from '@/context/calculator';

export default defineComponent({
  name: "child",
  setup() {
    //注入数据
    const { count, increase, updateCount } = calculatorInject();
  }
});

小结

实际上,你可以将依赖注入(Provide / Inject)看作是"long range props",除了:

  • 父组件不需要知道哪些子组件使用它provide的property
  • 子组件不需要知道inject的property来自哪里

Vue3使依赖注入的使用更加灵活便捷,以此仿造了小型的状态管理,个人测试上,对TypeScript的支持性比较完整

reactive

那么不使用Provide / Inject,还有别的方法可以实现状态管理吗?直接上代码。

抽离共享状态


// class="lazy" data-src/context/calculator.ts

type Calculator = {
    count: number;
    increase: () => void;
    updateCount: (num: number) => void;
};

//共享状态
const calculatorStore = reactive<Calculator>({
    count: 1,
    increase: () => {
        calculatorStore.count++;
    },
    updateCount: (num: number) => {
        calculatorStore.count = num;
    }
});

export { calculatorStore };

使用共享状态

使用状态的方法很简单,只需要import状态即可,需要使用状态的组件,都需要导入


// class="lazy" data-src/views/any.vue

import { defineComponent } from "vue";
import { calculatorStore } from '@/context/calculator';

export default defineComponent({
  name: "any",
  setup() {
    console.log(calculatorStore.count);
  }
});

小结

其实这个方案利用的是reactive的响应性及import同一实例原理,相比起依赖注入来的更简单粗暴,也能正确支持TypeScript校验。但是依赖注入可以在不同根节点共享不同的数据,而这个reactive方案永远共享的是一个实例,在某些业务场景下并不适用。

结语

首先,Vuex仍旧是更成熟全面的方案,只是针对一些简单的状态管理,可以尝试换个思路解决;当然以上的方案可能还有很多考虑不全地方,欢迎各位大神指点指点~

以上就是Vue3状态管理的使用详解的详细内容,更多关于Vue3状态管理的使用的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Vue3状态管理的使用详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

详解Vue3-pinia状态管理

这篇文章主要介绍了Vue3-pinia状态管理,pinia是 vue3 新的状态管理工具,简单来说相当于之前 vuex,它去掉了 Mutations 但是也是支持 vue2 的,需要的朋友可以参考下
2022-11-13

ReactNative 状态管理redux使用详解

这篇文章主要介绍了ReactNative 状态管理redux使用详解
2023-03-10

Vue3状态管理之Pinia怎么使用

这篇文章主要介绍“Vue3状态管理之Pinia怎么使用”,在日常操作中,相信很多人在Vue3状态管理之Pinia怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Vue3状态管理之Pinia怎么使用”的疑
2023-06-30

Vue3状态管理库Pinia如何使用

这篇文章主要介绍“Vue3状态管理库Pinia如何使用”,在日常操作中,相信很多人在Vue3状态管理库Pinia如何使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Vue3状态管理库Pinia如何使用”的疑
2023-07-04

Flutter状态管理Provider的使用示例详解

这篇文章主要为大家介绍了Flutter状态管理Provider的使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2022-11-13

一文详解ReactNative状态管理rematch使用

这篇文章主要为大家介绍了ReactNative状态管理rematch使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-03-10

Flutter状态管理Bloc使用示例详解

这篇文章主要为大家介绍了Flutter状态管理Bloc使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2022-11-13

一文详解ReactNative状态管理redux-toolkit使用

这篇文章主要为大家介绍了ReactNative状态管理redux-toolkit使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-03-10

react-redux及redux状态管理工具使用详解

Redux是为javascript应用程序提供一个状态管理工具集中的管理react中多个组件的状态redux是专门作状态管理的js库(不是react插件库可以用在其他js框架中例如vue,但是基本用在react中),这篇文章主要介绍了react-redux及redux状态管理工具使用详解,需要的朋友可以参考下
2023-01-31

编程热搜

目录