Vue3全局共享数据

目录

  • 1,Vuex
  • 2,provide & inject
  • 2,global state
  • 4,Pinia
  • 5,对比

1,Vuex

vue2 的官方状态管理器,vue3 也是可以用的,需要使用 4.x 版本。

相对于 vuex3.x,有两个重要变动:

  • 去掉构造函数 Vuex,而使用 createStore() 创建仓库
  • 为了配合 compositionAPI,新增 useStore() 获取仓库对象

先看一个使用 vuex 的例子:实现登录、刷新页面恢复登录、退出登录的状态管理。

// store/index.js
import loginUser from "./loginUser";
import { createStore, createLogger } from "vuex";
export default createStore({modules: {loginUser,},plugins: [createLogger()], // 用于调试,会在控制台打印日志。
});

createLogger 官网参考

// store/loginUser.js
export default {namespaced: true,state: {user: null,loading: false,},mutations: {setUser(state, payload) {state.user = payload;},setLoading(state, payload) {state.loading = payload;},},actions: {async login({ commit }, { loginId, loginPwd }) {commit("setLoading", true);// 登录接口const user = await _faker.login(loginId, loginPwd);commit("setUser", user);commit("setLoading", false);return user;},async loginOut({ commit }) {commit("setLoading", true);// 退出登录接口await _faker.loginOut();commit("setUser", null);commit("setLoading", false);},async whoAmI({ commit }) {commit("setLoading", true);// 恢复登录接口const user = await _faker.whoAmI();commit("setUser", user);commit("setLoading", false);},},
};

组件中使用 store

<script setup>
import { computed, ref } from "vue";
import { useStore } from "vuex";const store = useStore();const loginId = ref("");
const loginPwd = ref("");
const loading = computed(() => store.state.loginUser.loading),const handleSubmit = async () => {const user = await store.dispatch("loginUser/login", {loginId: loginId.value,loginPwd: loginPwd.value,});if (user) {// 登录成功,跳转首页。} else {alert("账号/密码错误");}
};
</script>

注册

// main.js
import { createApp } from "vue";
import App from "./App.vue";
import store from "./store";
createApp(App).use(store).mount("#app");// 恢复登录,其实就是把存在本地的用户信息,再次放到 store 中。
store.dispatch("loginUser/whoAmI");

2,provide & inject

vue2 中就有这2个配置,可以在祖先组件中注入数据,然后在后代组件中使用。

vue3 的 optionAPI 做了兼容的同时,compositionAPI 也提供了 provide()inject()-官网-依赖注入。

另外,考虑到部分数据会在整个 vue 应用中使用,所以 vue3 在应用实例中也添加了 provide(), 用于提供整个应用的共享数据

import { createApp } from "vue";
import App from "./App.vue";
creaetApp(App).provide("foo", ref(1)).provide("bar", ref(2)).mount("#app");

来模仿 vuex 的使用方式来实现上面的例子。

// store/index.js
import { provideStore as provideLoginUserStore } from "./useLoginUser";
// 继续导入其他共享数据模块...
// import { provideStore as provideNewsStore } from "./useNews"// 提供统一的数据注入接口
export default function provideStore(app) {provideLoginUserStore(app);// 继续注入其他共享数据// provideNewsStore(app);
}
// store/userLoginUser.js
import { readonly, reactive, inject } from "vue";
const key = Symbol(); // Provide的key// 在传入的vue应用实例中提供数据
export function provideStore(app) {// 创建默认的响应式数据const state = reactive({ user: null, loading: false });// 登录async function login(loginId, loginPwd) {state.loading = true;const user = await _faker.login(loginId, loginPwd);state.user = user;state.loading = false;}// 退出async function loginOut() {state.loading = true;await _faker.loginOut();state.loading = false;state.user = null;}// 恢复登录状态async function whoAmI() {state.loading = true;const user = await _faker.whoAmI();state.loading = false;state.user = user;}// 提供全局数据app.provide(key, {state: readonly(state), // 对外只读login,loginOut,whoAmI,});
}export function useStore(defaultValue = null) {return inject(key, defaultValue);
}

组件中使用 store

<script setup>
import { computed, ref } from "vue";
import { useStore } from "../store/useLoginUser";const store = useStore();const loginId = ref("");
const loginPwd = ref("");
const loading = computed(() => store.state.loading),const handleSubmit = async () => {const user = await store.login(loginId.value, loginPwd.value);if (store.state.user) {// 登录成功,跳转首页。} else {alert("账号/密码错误");}
};
</script>

全局注册

// main.js
import { createApp } from "vue";
import App from "./App.vue";
import provideStore from "./store";
const app = createApp(App);
provideStore(app); // 上面的封装形式,即便项目中存在多个应用实例,也可以应对。
app.mount("#app");// 恢复登录,要放到 App.vue 中执行了。
// whoAmI();

2,global state

得益于 vue3 的响应式系统是可以脱离组件而存在,所以可轻松创建多个全局响应式数据。

// store/useLoginUser.js
import { reactive, readonly } from "vue";// 创建默认的全局单例响应式数据,仅供该模块内部使用
const state = reactive({ user: null, loading: false });// 对外暴露的数据是只读的,不能直接修改
export const loginUserStore = readonly(state);// 登录
export async function login(loginId, loginPwd) {state.loading = true;const user = await _faker.login(loginId, loginPwd);state.user = user;state.loading = false;
}
// 退出
export async function loginOut() {state.loading = true;await _faker.loginOut();state.loading = false;state.user = null;
}
// 恢复登录状态
export async function whoAmI() {state.loading = true;const user = await _faker.whoAmI();state.loading = false;state.user = user;
}

组件中使用 store

<script setup>
import { computed, ref } from "vue";
import { loginUserStore, login } from "../store/useLoginUser";const loginId = ref("");
const loginPwd = ref("");
// 模版也可以直接使用 loginUserStore.loading
const loading = computed(() => loginUserStore.loading),const handleSubmit = async () => {const user = await login(loginId.value, loginPwd.value);if (user) {// 登录成功,跳转首页。} else {alert("账号/密码错误");}
};
</script>

全局注册

// main.js
import { createApp } from "vue";
import App from "./App.vue";
import { whoAmI } from "./store/useLoginUser";
createApp(App).mount("#app");// 恢复登录
whoAmI();

4,Pinia

官网参考

5,对比

vuexglobal stateProvide&Inject
组件数据共享
可否脱离组件
量级

以上。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/186172.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序电商审核模版

《电商平台服务协议》与交易规则 下载链接 电商平台对入驻经营者的审核要求或规范文件 下载链接 电商平台对用户交易纠纷处理的机制或方案 下载链接 打包下载&#xff1a;https://download.csdn.net/download/nicepainkiller/88519604https://download.csdn.net/download/nicep…

拓世科技集团打造数字人营销解决方案,为车企提供新的“增长担当”

汽车&#xff0c;已经渐渐融入了现代人的日常生活&#xff0c;从高端的身份标志转变为普罗大众的出行选择&#xff0c;它驶入了千家万户&#xff0c;成为了我们日常出行的可靠伙伴&#xff0c;见证着人们的生活故事和时代的变迁。 中国汽车市场的蓬勃发展引起了业内外的广泛关…

怎样使用ovsyunlive在web网页上直接播放rtsp/rtmp视频

业务中需要在网页中直接播放rtsp和rtmp视频&#xff0c;多方比较测试发现ovsyunlive的播放器能直接播放rtsp/rtmp视频&#xff0c;还是非常方便简洁&#xff0c;使用过程如下&#xff1a; 1&#xff0c;Windows系统在github上面下载ovsyunlive绿色包下载解压。 github地址&am…

Android Studio代码无法自动补全

Android Studio代码自动无法补全问题解决 在写layout布局文件时&#xff0c;代码不提示&#xff0c;不自动补全&#xff0c;可以采用如下方法&#xff1a; 点击File—>Project Structure&#xff0c;之后如图所示&#xff0c;找到左侧Modules&#xff0c;修改SDK版本号&…

『 MySQL数据库 』数据库基础之表的基本操作

文章目录 创建表&#x1f5e1;查看表&#x1f5e1;✒ 查看表内所有信息(描述\表结构等)✒ 根据条件查看表内数据✒ 查看表的具体详细信息: 修改表&#x1f5e1;✒ 修改表名:✒ 修改表的存储引擎、编码集(字符集和校验集):✒ 表内插入数据:insert into✒ 在表中新添一个字段(列)…

pytorch中常用的损失函数

1 损失函数的作用 损失函数是模型训练的基础&#xff0c;并且在大多数机器学习项目中&#xff0c;如果没有损失函数&#xff0c;就无法驱动模型做出正确的预测。 通俗地说&#xff0c;损失函数是一种数学函数或表达式&#xff0c;用于衡量模型在某些数据集上的表现。损失函数在…

解决Jenkins执行git脚本时报错:No such device or address问题

问题现象&#xff1a; Jenkins执行BeanShell脚本时&#xff0c;报错&#xff1a;jenkins fatal: could not read Username for http://112.11.120.1: No such device or address 解决方案&#xff1a; 解决服务器拉取git仓库的代码权限&#xff0c;使用高级子模块克隆功能。…

mysql千万数据快速插入-实战

文章目录 前言环境一、配置二、效果总结 前言 数据量太大了&#xff0c;每天半夜要同步很大数据到 mysql 数据库&#xff0c;其中一张表就上2千万&#xff0c;总计上亿条数据。同步任务每天0点之后开始任务&#xff08;因为到0之后才能统计前一天数据&#xff09;&#xff0c;…

Tcl语言:基础入门(一)

Tcl语言https://blog.csdn.net/weixin_45791458/category_12488978.html?spm1001.2014.3001.5482 Tcl语言是一种脚本语言&#xff0c;类似于Bourne shell(sh)、C shell&#xff08;csh&#xff09;、Bourne-Again Shell(bash)等UNIX shell语言。Shell程序主要作为胶水缝合其他…

线性代数(六)| 二次型 标准型转换 正定二次型 正定矩阵

文章目录 1. 二次型化为标准型1.1 正交变换法1.2 配方法 2 . 正定二次型与正定矩阵 1. 二次型化为标准型 和第五章有什么样的联系 首先上一章我们说过对于对称矩阵&#xff0c;一定存在一个正交矩阵Q&#xff0c;使得$Q^{-1}AQB $ B为对角矩阵 那么这一章中&#xff0c;我们…

配置阿里云镜像加速器 -docker

1.百度aliyun 2.找到镜像服务ACR 3.搞一个个人版&#xff0c;身份验证一下就行了很简单 4.找到镜像加速器Centos 5.在xshell执行下面4条命令&#xff1a;4条命令直接从上面操作文档中粘贴&#xff0c;不容易出错 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json…

module ‘torch‘ has no attribute ‘_six‘

主要问题是torchvision的问题 在122服务器上的scvi-env2环境中 import torch import torch.nn as nnimport numpy as npfrom tqdm import tqdm from torchvision.utils import save_image, make_grid # Model Hyperparametersdataset_path ./datasetscuda True DEVICE tor…

【数据结构】树与二叉树(七):二叉树的遍历

文章目录 5.1 树的基本概念5.1.1 树的定义5.1.2 森林的定义5.1.3 树的术语5.1.4 树的表示 5.2 二叉树5.2.1 二叉树1. 定义2. 特点3. 性质引理5.1&#xff1a;二叉树中层数为i的结点至多有 2 i 2^i 2i个&#xff0c;其中 i ≥ 0 i \geq 0 i≥0。引理5.2&#xff1a;高度为k的二叉…

GDPU 数据结构 天码行空9

实验九 哈夫曼编码 一、【实验目的】 1、理解哈夫曼树的基本概念 2、掌握哈夫曼树的构造及数据结构设计 3、掌握哈夫曼编码问题设计和实现 二、【实验内容】 1、假设用于通信的电文仅由8个字母 {a, b, c, d, e, f, g, h} 构成&#xff0c;它们在电文中出现的概率分别为{ 0.…

简单的小调度器

收集小资源下的简单调度器 https://github.com/sigma318/TOS/tree/master https://github.com/smset028/xxddq

uniapp+uview2.0+vuex实现自定义tabbar组件

效果图 1.在components文件夹中新建MyTabbar组件 2.组件代码 <template><view class"myTabbarBox" :style"{ backgroundColor: backgroundColor }"><u-tabbar :placeholder"true" zIndex"0" :value"MyTabbarS…

[100天算法】-面试题 17.11.单词距离(day 68)

题目描述 有个内含单词的超大文本文件&#xff0c;给定任意两个单词&#xff0c;找出在这个文件中这两个单词的最短距离(相隔单词数)。如果寻找过程在这个文件中会重复多次&#xff0c;而每次寻找的单词不同&#xff0c;你能对此优化吗?示例&#xff1a;输入&#xff1a;word…

线性代数 | 矩阵运算 加减 数乘 矩阵的幂运算

文章目录 1 矩阵加减和数乘2 矩阵与矩阵的乘法2.1 相乘条件&#xff1a;看中间&#xff0c;取两头2.2 相乘计算方法 3 矩阵的幂3.1 观察归纳法3.2 邻项相消法3.3 化为对角 4 判断是否可逆&#xff08;证明题或者要求求出逆矩阵&#xff09;4.1 直接观察4.2 由定义式推得4.2.1 待…

适用于4D毫米波雷达的目标矩形框聚类

目录 一、前言 二、点云聚类分割 三、基于方位搜索L型拟合 四、评价准则之面积最小化 五、评价准则之贴合最大化 六、评价准则之方差最小化 一、前言 对于多线束雷达可以获取目标物体更全面的面貌&#xff0c;在道路中前向或角雷达可能无法获取目标车矩形框但可以扫到两边…

【Shell脚本8】Shell printf 命令

Shell printf 命令 printf 命令模仿 C 程序库&#xff08;library&#xff09;里的 printf() 程序。 printf 由 POSIX 标准所定义&#xff0c;因此使用 printf 的脚本比使用 echo 移植性好。 printf 使用引用文本或空格分隔的参数&#xff0c;外面可以在 printf 中使用格式化…