vue2升级vue3:vue3真的需要vuex或者Pinia吗?hooks全有了
在写 《vue2升级vue3:TypeScript下vuex-module-decorators/vuex-class to vuex4.x》,建议新项目使用 Pinia,但是我的项目部分组件希望直接打包出去给地方使用。这个时候还是会遇到vue2 是否打包出vuex的 问题。所以,干脆舍弃 vuex/Pinia,直接使用 vue3 原生搞定——hook出现之后,状态管理的问题已经从根本上被消解了!
vue-composition 提供了类似 React Hook 的能力,将 Vue 的抽象层级从「组件级(Component)」降低为「函数级(Function)」。
当掌握了Hook(或者Composition API)之后,感觉万物皆可hook,总是想把数据和操作这堆数据的方法封装在一起!
1、方案有以下几种reactive 响应式数据取代store,在各个组件hooks 调用
const store = reactive({state: {})
2、利用rovide和inject,类似react context,做全局数据管理(不推荐)具体可参看:《vue2升级vue3:provide与inject 使用注意事项》
父组件
const person = reactive({name: 'bob', age:32});
provide('person', person);
子组件
const person = inject('person');
有了provide/inject和ref/reactive配合,父子组件/兄弟组件共享状态的问题已经迎刃而解。
通过provide提供了一个reactive响应式对象;然后在子组件通过inject注入该对象。在子组件修改对象的age属性,视图就会响应式更新!同样的,如果child组件也有自己的子组件,调用inject同样有效。具体参看:
Vue3你还在用Vuex?一个“函数式”状态管理的新思路 https://zhuanlan.zhihu.com/p/345963989
Vue3 尝鲜 Hook + TypeScript 取代 Vuex 实现图书管理小型应用 https://my.oschina.net/sl1673495/blog/4439246 (全局注入)
1、2方法结合:
hooks
export function useUserInfo() {
const userInfo = reactive({ });
const login = (data) => {...};
const logout = () => {...};
const editUserInfo => (data) => {};
return {
userInfo,
login,
logout,
editUserInfo
}
}
在根组件调用provide,将userHook函数传入
import {useUserInfo} from '@/hooks/userUserInfo';
provide('user', useUserInfo())
这个 封装好的东西,直接看这个:https://github.com/tbhuabi/vue-di-plugin
但是还是不推荐这个写法!即使 provide/inject 再香,我还是绕道走,总感觉 这玩意和react的 useContext + useReducer 貌似 貌合神离——可以看一下 :https://github.com/tangxiangmin/vue3-hook/tree/master/src/useReducer
1、使用
比如我之前的数据,vuex的
/**
* 面板查询变量
*/ import { VuexModule, Module, getModule, Mutation } from 'vuex-module-decorators';
import store from '../index';
import { TimeRangeType } from '@/components/time-range';
import { DEFAULT_TIME_RANGE, TimeRange } from '@/components/time-range/utils';
import { FiltersList, FilterType, QueryContextState } from '@/typings'; @Module({ dynamic: true, store, name: 'queryContext' })
export default class QueryContext extends VuexModule implements QueryContextState {
timeRange: TimeRangeType = DEFAULT_TIME_RANGE;
timezone = 'Asia/Shanghai';
variables: FiltersList = {};
share_uid = '';
// 缓存的时间 - TimeRangeType 转时间戳
get getTimeRange(): [number | string, number | string] {
const date = new TimeRange(this.timeRange);
const [start, last] = date.value;
return [start.valueOf(), last.valueOf()];
}
@Mutation
setTimeRange(range: TimeRangeType) {
this.timeRange = range;
}
@Mutation
setTimezone(zone: string) {
this.timezone = zone;
}
@Mutation
setShareUid(share_uid: string) {
this.share_uid = share_uid;
}
@Mutation
setVariation({ name, value }: { name: string; value: FilterType }) {
// this.variables[name] = value;
this.variables = { ...this.variables, [name]: value };
} @Mutation
setVariations(variables: FiltersList) {
this.variables = variables;
}
@Mutation
clear() {
this.variables = {};
this.timeRange = DEFAULT_TIME_RANGE;
}
} export const QueryContextModule = getModule(QueryContext);
直接使用响应式数据
import { reactive } from 'vue';
import { FiltersList, FilterType, QueryContextState } from '@/typings';
import { DEFAULT_TIME_RANGE } from '@/components/time-range/utils';
import { TimeRangeType } from '@/components/time-range';
export const QueryContextModule = reactive<QueryContextState>({
timeRange: DEFAULT_TIME_RANGE,
timezone: 'Asia/Shanghai',
variables: {},
share_uid: '',
});
export function setTimeRange(range: TimeRangeType) {
QueryContextModule.timeRange = range;
}
export function setTimezone(zone: string) {
QueryContextModule.timezone = zone;
}
export function setShareUid(share_uid: string) {
QueryContextModule.share_uid = share_uid;
}
export function setVariation({ name, value }: { name: string; value: FilterType }) {
QueryContextModule.variables = { ...QueryContextModule.variables, [name]: value };
}
export function setVariations(variables: FiltersList) {
QueryContextModule.variables = variables;
}
export function clear() {
QueryContextModule.variables = {};
QueryContextModule.timeRange = DEFAULT_TIME_RANGE;
}
改为类vuex,可以参看此篇文章: Vue3 还要啥 Vuex,自定义 hooks给你实现数据共享和状态管理 https://juejin.cn/post/7054060160045547550
import { reactive } from 'vue';
import { FiltersList, FilterType } from '@/typings';
import { DEFAULT_TIME_RANGE } from '@/components/time-range/utils';
import { TimeRangeType } from '@/components/time-range';
const store = reactive({
state: {
timeRange: DEFAULT_TIME_RANGE,
timezone: 'Asia/Shanghai',
variables: {},
share_uid: '',
},
});
export function setTimeRange(range: TimeRangeType) {
store.state.timeRange = range;
}
export function setTimezone(zone: string) {
store.state.timezone = zone;
}
export function setShareUid(share_uid: string) {
store.state.share_uid = share_uid;
}
export function setVariation({ name, value }: { name: string; value: FilterType }) {
store.state.variables = { ...store.state.variables, [name]: value };
}
export function setVariations(variables: FiltersList) {
store.state.variables = variables;
}
export function clear() {
store.state.variables = {};
store.state.timeRange = DEFAULT_TIME_RANGE;
}
export const useQueryContext = () => ({
store,
setTimeRange,
setTimezone,
setShareUid,
setVariation,
setVariations,
clear,
});
这个使用肯定是还太粗糙,项目中使用的代码,等有空的 脱密了在分享一下
参考文章:
有了 Vue3 还要啥 Vuex,自定义 hooks给你实现数据共享和状态管理 https://juejin.cn/post/7054060160045547550
转载本站文章《vue2升级vue3:vue3真的需要vuex或者Pinia吗?hooks全有了》,
请注明出处:https://www.zhoulujun.cn/html/webfront/ECMAScript/vue3/8881.html
vue2升级vue3:vue3真的需要vuex或者Pinia吗?hooks全有了的更多相关文章
- uniapp项目vue2升级vue3简单记录
看到好多开源项目都升级了vue3,看文章说vue3性能升级很多,而且组合式api很香,遂把最近开发的自助洗车app升级下,在此记录下出现的问题. uniapp升级vue3官方指南 我是先去vue官网看 ...
- vue2升级vue3:vue2 vue-i18n 升级到vue3搭配VueI18n v9
项目从vue2 升级vue3,VueI18n需要做适当的调整.主要是Vue I18n v8.x 到Vue I18n v9 or later 的变化,其中初始化: 具体可以参看:https://vue- ...
- vue2升级vue3指南(二)—— 语法warning&error篇
本文总结了vue2升级vue3可能会遇到的语法警告和错误,如果想知道怎样升级,可以查看我的上一篇文章:vue2升级vue3指南(一)-- 环境准备和构建篇 Warning 1.deep /deep/和 ...
- vue2升级vue3:Vue Demij打通vue2与vue3壁垒,构建通用组件
如果你的vue2代码之前是使用vue-class-component 类组件模式写的.选择可以使用 https://github.com/facing-dev/vue-facing-decorator ...
- vue2升级vue3:vue-i18n国际化异步按需加载
vue2异步加载之前说过,vue3还是之前的方法,只是把 i18n.setLocaleMessage改为i18n.global.setLocaleMessage 但是本文还是详细说一遍: 为什么需要异 ...
- 基 vue-element-admin升级的Vue3 +TS +Element-Plus 版本的后端管理前端解决方案 vue3-element-admin 正式对外发布,有来开源组织又一精心力作,毫无保留开放从0到1构建过程
项目简介 vue3-element-admin 是基于 vue-element-admin 升级的 Vue3 + Element Plus 版本的后台管理前端解决方案,是 有来技术团队 继 youla ...
- 简单对比vue2.x与vue3.x响应式及新功能
简单对比vue2.x与vue3.x响应式 对响应方式来讲:Vue3.x 将使用Proxy ,取代Vue2.x 版本的 Object.defineProperty. 为何要将Object.defineP ...
- vue2.0 与 vue3.0 配置的区别
提示:要了解vue2.0与vue3.0区别,首先你要熟悉vue2.0 从最明显最简单的开始 项目目录结构 可以明显的看出来,vue2.0与3.0在目录结构方面,有明显的不同(vue3.0我是安装了cs ...
- 在业务逻辑中,经常会有父组件调用子组件方法的情况,vue2.0 和 vue3.0 的使用中有些不一样,在这里总结下。
在业务逻辑中,经常会有父组件调用子组件方法的情况,vue2.0 和 vue3.0 的使用中有些不一样,在这里总结下. vue2.0 中的使用方法 父组件: <template> <d ...
- 结合 Vuex 和 Pinia 做一个适合自己的状态管理 nf-state
一开始学习了一下 Vuex,感觉比较冗余,就自己做了一个轻量级的状态管理. 后来又学习了 Pinia,于是参考 Pinia 改进了一下自己的状态管理. 结合 Vuex 和 Pinia, 保留需要的功能 ...
随机推荐
- git报错fatal: unable to access 'https://github.com/hxx.git/': LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to github.com:443
今天拉git代码报错 弄好了,下面是解决方法: 在网上查了很多办法都没有解决,有的方法是https连接模式改成ssh模式,或者是修改代理,比如: git config --global http.pr ...
- 昇腾迁移丨4个TensorFlow模型训练案例解读
本文分享自华为云社区<TensorFlow模型训练常见案例>,作者: 昇腾CANN. 基于TensorFlow的Python API开发的训练脚本默认运行在CPU/GPU/TPU上,为了使 ...
- freeswitch设置多个execute_on_media
概述 freeswitch是一款简单好用的VOIP开源软交换平台. fs中有非常多的接口和通道变量,使用方式多变. 官方文档有时候也仅仅是介绍了最基本的使用方法和格式. 环境 centos:CentO ...
- 实现金蝶云星空与赛意SMOM系统的无缝数据对接
1. 金蝶云星空:为运营协同与管控型企业提供通用ERP服务平台 金蝶云星空是基于当今先进管理理论和数十万家国内客户最佳应用实践开发的ERP服务平台.它针对事业部制.多地点.多工厂等企业和集团公司,提供 ...
- MarkdownPad 文件访问权限受限导致软件打开后不久闪退解决方法
近几天发现MarkdownPad有一些小问题,打开时会弹出以下报错信息,告诉你打开文件的权限不够 解决方法如下: 1.复制报错信息中的文件路径"Access to the path 'C:\ ...
- 通信技术 Communication
缩写 全称 翻译 备注 I2C Inter-Integrated Circuit 集成电路总线 通信协议 SPI Serial Peripheral Interface 串行外设接口 通信协议 QSP ...
- 11 HTTP的特点,优点和缺点
[toc] # HTTP的五大特点 # HTTP的优点 1. 最大的优点:简单.灵活和易于拓展 2. 拥有成熟的软硬件环境,应用的非常广泛,是互联网的基础设施 3. 是无状态的,可以轻松实现集群化, ...
- crictl命令
containerd提供了ctr命令行用于镜像管理容器,但功能比较简单 所以一般会用k8s提供的crictl命令. 该命令的特点是:只要符合K8S的CRI接口的,都可以使用. 另外一点就是,cricr ...
- 文心一言 VS 讯飞星火 VS chatgpt (165)-- 算法导论13.1 5题
五.用go语言,证明:在一棵红黑树中,从某结点 x 到其后代叶结点的所有简单路径中,最长的一条至多是最短一条的 2 倍. 文心一言: 首先,我们要理解红黑树的性质.红黑树是一种自平衡的二叉查找树,它满 ...
- ElasticSearch之查看集群的参数
参考Cluster get settings API. 命令样例,不指定参数,如下: curl -X GET "https://localhost:9200/_cluster/setting ...