Vue3全局共享数据

news2024/11/26 17:30:49

目录

  • 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.coloradmin.cn/o/1190693.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Hive 常用存储、压缩格式

1. Hive常用的存储格式 TEXTFI textfile为默认存储格式 存储方式&#xff1a;行存储 磁盘开销大 数据解析开销大 压缩的text文件 hive 无法进行合拆分 SEQUENCEFILE sequencefile二进制文件&#xff0c;以<key,value>的形式序列到文件中 存储方式&#xff1a;行存储 可…

贾扬清开源 AI 框架 Caffe | 开源英雄

【编者按】在开源与人工智能的灿烂星河里&#xff0c;贾扬清的名字都格外地耀眼。因为导师 Trevor Darrell 教授的一句“你是想多花时间写一篇大家估计不是很在意的毕业论文&#xff0c;还是写一个将来大家都会用的框架&#xff1f;”&#xff0c;学生贾扬清一头扎进了创 Caffe…

零代码+分布式微服务架构打造新一代一站式服务集成平台

目 录 01 项目背景 02 普元ESB产品介绍 03 新版本功能特性 04 应用案例‍‍‍‍ 05 展望与发展 01 项目背景 企业在实现数字化转型的过程中&#xff0c;随着信息化程度的提高&#xff0c;越来越多的企业开始采用微服务架构来构建自己的业务系统,各种系统之间的集成、数据共享…

计算机网络:概述

0 学时安排及讨论题目 0.1讨论题目&#xff1a; CSMA/CD协议交换机基本原理ARP协议及其安全子网划分IP分片路由选择算法网络地址转换NATTCP连接建立和释放再论网络体系结构 0.2 本节主要内容 计算机网络在信息时代中的作用 互联网概述 互联网的组成 计算机网络在我国的发展 …

【vector题解】连续子数组的最大和 | 数组中出现次数超过一次的数字

连续子数组的最大和 连续子数组的最大和_牛客题霸_牛客网 描述 输入一个长度为n的整型数组array&#xff0c;数组中的一个或连续多个整数组成一个子数组&#xff0c;子数组最小长度为1。求所有子数组的和的最大值。 要求:时间复杂度为 O(n)&#xff0c;空间复杂度为 O(n) 进…

Java算法(五):手写数组逆置API方法,实现数组逆置。 while实现 for循环实现

Java算法&#xff08;五&#xff09; while 循环实现 需求&#xff1a; 已知一个数组&#xff0c;arr {11, 22, 33, 44, 55};使用程序实现把数组中的元素交换位置。 交换后的数组为 arr {55, 44, 33, 22, 11}; 并在控制台输出交换后的数组元素。 代码示例 package com.…

集成MCU的OTP-2.4G合封芯片XL2401D,收发一体 上手简单

芯岭技术的XL2401D是一颗2.4G合封芯片&#xff0c;收发一体。合封芯片可以很好的节省PCB面积和开发成本。一颗芯片可以做到之前两颗芯片才能做到的事情。XL2401D内含MCU为九齐NY8A054E。有九齐MCU开发经验的话开发起来非常容易上手。 XL2401D芯片是工作在2.400~2.483GHz世界通…

UE5蓝图接口使用方法

在内容区右键创建蓝图接口 命名自定义&#xff08;可以用好识别的&#xff09; 双击打开后关闭左边窗口 右键函数 -- 重命名 -- 名称自定义&#xff08;用好记的&#xff09; 点击下边输入后面的 号创建一个变量 点击编译并保存 在一个蓝图类里面 -- 点击类设置 在右侧已实现的…

YOLOX: Exceeding YOLO Series in 2021(2021.8)

文章目录 AbstractIntroduction介绍前人的工作提出问题解决 YOLOXYOLOX-DarkNet53Implementation detailsYOLOv3 baselineDecoupled headStrong data augmentationAnchor-freeMulti positivesSimOTAEnd-to-end YOLOOther BackbonesModified CSPNet in YOLOv5Tiny and Nano dete…

SQL note1:Basic Queries + Joins Subqueries

目录 一、Basic Queries 1、数据库术语 2、查表 3、过滤掉我们不感兴趣的行 4、布尔运算 5、过滤空值&#xff08;NULL&#xff09; 6、分组和聚合 1&#xff09;汇总数据的列 2&#xff09;汇总数据组 7、分组聚合的警告 1&#xff09;SELECT age, AVG(num_dogs) FR…

【Shell脚本8】Shell printf 命令

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

银行APP虚拟金额软件,建设农业工商邮政余额生成器,易语言开源版

用易语言开发了一个虚拟余额装逼软件&#xff0c;可以生成虚拟的余额截图&#xff0c;就是APP端的截图&#xff0c;用的画板组件&#xff0c;但是生成出来的图片是非常高清的&#xff0c;软件里面因为图片是缩放状态&#xff0c;所以看起来有点失真的感觉&#xff0c;生成图片的…

pandas 获取一段时间内每个月的最后一个工作日和日历日

获取一段时间内每个月的最后一个工作日 endlistpd.date_range(start‘2023-01-01’, end‘2023-09-30’, freq‘BM’).strftime(“%Y-%m-%d”).to_list() 获取一段时间内每个月的最后一个日历日 endlistpd.date_range(start‘2023-01-01’, end‘2023-09-30’, freq‘M’).st…

Leetcode Hot 100之四:283. 移动零+11. 盛最多水的容器

283.移动零 题目&#xff1a; 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0] …

nodejs+vue+python+PHP+微信小程序南七街道志愿者服务平台的设计与实现-计算机毕业设计推荐

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

简单的小调度器

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

css呼吸效果实现

实现一个图片有规律的大小变化&#xff0c;呈现呼吸效果&#xff0c;怎么用CSS实现这个呼吸效果呢 一.实现 CSS实现动态效果可以使用动画( animation)来属性实现&#xff0c;放大缩小效果可以用transform: scale来实现&#xff0c;在这基础上有了动画&#xff0c;就可以设置一个…

rabbitMq创建交换机,以及路由键绑定队列教程

创建交换机&#xff1a; 创建队列&#xff1a; 创建路由&#xff0c;绑定到交换机&#xff1a;

Java9新增特性

特性列表 模块化系统&#xff1a;Java 9引入了模块化系统&#xff0c;将代码划分为模块&#xff0c;以更好地组织和管理代码。新的日期和时间API&#xff1a;Java 9引入了新的日期和时间API&#xff0c;使得处理日期和时间变得更简单、更强大。HTTP/2支持&#xff1a;Java 9引…