vuex配置和使用(vue3配置)

个人理解可能会有所偏差

1、基础使用

首先在创建项目时可以选择vuex和一些其他的配置,如果选择那么他会自动创建store文件夹生成默认格式,如果没有选择可以使用指令:

npm install vuex@next --save

然后手动创建即可

import { createStore } from 'vuex';

const store = createStore({
  state() {
    return {
      count: 0,
      index:'测试文字'
    };
  },
  mutations: {
    increment(state) {
      state.count++;
    },
  },
  actions: {
    incrementAsync({ commit }) {
      setTimeout(() => {
        commit('increment');
      }, 1000);
    },
  },
  getters: {
    count: (state) => state.count,
  },
});

export default store;

创建完毕之后在main.js中注册即可

使用方法

简单例子

<template>
  <div>
    <p>Count变量: {{ count }}</p>
    <p>Double Count: {{ doubleCount }}</p>
    <button @click="tong_bu">同步加1</button>
    <button @click="yi_bu">异步加1</button>
  </div>
</template>

<script setup>
import { ref,computed } from 'vue';
import { useStore } from 'vuex';
const store = useStore();
// 访问状态
const count = computed(() => store.state.count);
// 提交 mutation
const tong_bu = () =>{
  store.commit('increment');
console.log(1);
}
// 分发 action
function yi_bu() {
  store.dispatch('incrementAsync');
  console.log(1);
}
// 访问 getter
const doubleCount = computed(() => store.getters.doubleCount);
</script>

那么以上就是简单的使用方法


那么新的问题来了。(注:这段没什么用可以跳过可以直接看5拓展补充)

场景:我们登录成功后应该使用本地存储还是vuex呢?是一个问题,我们可以一块结合使用,因为我们在访问下一页或者页面刷新时令牌可能会丢失,所以我们需要一起结合使用。

2、使用 Vuex

  • 访问控制和响应式更新:Vuex 提供了一种集中管理和访问控制应用状态的方式,包括用户的登录状态和账号信息。使用 Vuex 可以轻松地在多个组件之间共享登录状态,且状态的更新会自动反映到依赖这些状态的组件中。
  • 非持久化:Vuex 的状态默认是非持久化的;当页面刷新或关闭时,存储在 Vuex 中的状态会丢失。这意味着如果用户刷新了页面,你可能需要从本地存储重新加载用户的登录状态和账号信息到 Vuex。

3、使用本地存储

  • 持久化localStoragesessionStorage 提供了简单的 API 来持久化数据在用户的浏览器中。使用本地存储可以在用户会话间保留登录状态和账号信息,即使页面被刷新或关闭后也能保留这些信息。
  • 安全考虑:存储敏感信息(如令牌、密码等)时需要小心。虽然本地存储提供了持久化能力,但它易于被跨站脚本(XSS)攻击读取。因此,敏感信息应该谨慎存储,避免直接存储用户的密码,仅存储身份验证令牌,并使用 HTTPS 来保护传输过程。

4、结合使用 Vuex 和本地存储

一个常见的做法是结合使用 Vuex 和本地存储来管理登录状态和账号信息:

  1. Vuex:用于应用内部管理和访问用户的登录状态和账号信息。这使得应用能够响应状态的变化,更新 UI 并提供动态交互。

  2. 本地存储:用于在页面刷新或关闭后持久化用户的登录状态(通常是令牌)。应用启动时,从本地存储加载登录状态并初始化 Vuex 的状态。

例子:

当用户成功登录时,保存令牌到本地存储并更新 Vuex 状态:

// 登录成功后
localStorage.setItem('authToken', authToken); // 保存令牌到本地存储

store.commit('setAuthToken', authToken); // 更新 Vuex 状态

在 Vuex Store 的 index.js 文件中直接初始化

对于较小的应用,你可以直接在 Vuex store 的 index.js 文件中添加这段代码,确保它在应用启动时执行。

// store/index.js
import { createStore } from 'vuex';

const store = createStore({
  state() {
    return {
      authToken: null,
    };
  },
  mutations: {
    setAuthToken(state, authToken) {
      state.authToken = authToken;
    },
  },
  actions: {
    initializeStore({ commit }) {
      const authToken = localStorage.getItem('authToken');
      if (authToken) {
        commit('setAuthToken', authToken);
      }
    },
  },
});

// 调用初始化 action
store.dispatch('initializeStore');

export default store;

在这个例子中,我们定义了一个 initializeStore 的 action 来从 localStorage 加载 authToken 并提交 mutation 更新状态。然后,在创建 store 之后立即调用这个 action。

应用启动时,从本地存储加载令牌并初始化 Vuex:

意思是在main.js中这么写。初始化 store

const authToken = localStorage.getItem('authToken');
if (authToken) {
  store.commit('setAuthToken', authToken);
}

这种方法结合了 Vuex 的响应式状态管理和本地存储的持久化能力,能够提供良好的用户体验,同时确保用户状态在需要的时候得到保留。

5、拓展(补充)

安装一个命令 这个方法是 持久化存储

npm install vuex-persistedstate

5.1、在store下面创建文件夹modules并在他的下面创建xxx.js(如:login.js)

目录

5.2、写入自己的方法

我这个是登录成功之后的存储


export const login = {
  namespaced:true,
  state: () => ({
    userInfo: {}, // 用于存储用户信息
  }),
  mutations: {
    // 更新用户信息
    setUserInfo(state, userInfo) {
      state.userInfo = userInfo;
    },
  },
  actions: {
    // 异步更新用户信息
    updateUserInfo({ commit }, userInfo) {
      // 假设这里是一些异步操作,如 API 调用
      // 完成后,使用 commit 来调用 mutation
      commit('setUserInfo', userInfo);
    },
  },
  getters: {
    // 现在激活并使用 getter
    // loginName: state => state.userInfo.name, // 假设 userInfo 是一个对象,有一个 name 属性
    getUserInfo: state => state.userInfo,
  },
  
};

5.3、index.js配置

引入

import { createStore } from 'vuex';
import { login } from '@/store/modules/login'
import createPersistedState from 'vuex-persistedstate';
  modules:{
login:login//登录模块
  },
  plugins:[createPersistedState({
    paths: ['login'], // 持久化 login 模块
  }),

这两句代码在getters后面写

5.4、home页面

引入下方文件

import { computed } from 'vue';
import { useStore } from 'vuex';
// vuex
const store = useStore();

当你登录成功后存储商品信息

     // 假设 res 是包含用户信息的对象
        store.commit('login/setUserInfo', res); // 提交 mutation 更新用户信息

打印查看

const userInfo = computed(() => store.getters['login/getUserInfo']);

console.log(userInfo,'用户信息');

打印出来的数据位置应该是->ComputedRefImpl->value->target->获取到的数据data。

感谢观看

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot 学习笔记

文章目录 一、IoC二、AOP三、bean3.1 bean 生命周期3.2 三种依赖注入方式3.3 bean 线程安全 四、SpringMVC五、常用注解5.1 Scope5.2 PostConstruct 和 PreDestroy5.3 Component 和 Bean5.4 Autowired 和 Resource 六、基于 ApplicationContextAware 实现工厂模式七、事务失效八…

docker创建mongodb数据库容器

介绍 本文将通过docker创建一个mongodb数据库容器 1. 拉取mongo镜像 docker pull mongo:3.63.6版本是一个稳定的版本&#xff0c;可以选择安装此版本。 2. 创建并启动主数据库 容器数据卷配置 /docker/mongodb/master/data # 数据库数据目录&#xff08;宿主机&am…

下载huggingface数据集到本地并读取.arrow文件遇到的问题

文章目录 1. 524MB中文维基百科语料&#xff08;需要下载的数据集&#xff09;2. 下载 hugging face 网站上的数据集3. 读取 .arrow 文件报错代码4. 纠正后代码 1. 524MB中文维基百科语料&#xff08;需要下载的数据集&#xff09; 2. 下载 hugging face 网站上的数据集 要将H…

springboot+vue前后端分离适配cas认证的跨域问题

0. cas服务搭建参考:CAS 5.3服务器搭建_cas-overlay-CSDN博客 1. 参照springsecurity适配cas的方式, 一直失败, 无奈关闭springssecurity认证 2. 后端服务适配cas: 参考前后端分离项目(springbootvue)接入单点登录cas_前后端分离做cas单点登录-CSDN博客 1) 引入maven依赖 …

Word页码怎么设置?6个提升效率好方法!

“我刚刚编辑完一个Word文档&#xff0c;想给它加上页码&#xff0c;但是我还不知道应该怎么操作。大家平常是怎么给Word设置页码的呢&#xff1f;” 在使用Word编辑文档时&#xff0c;页码的设置是一个常见的需求。无论是为了方便阅读&#xff0c;还是为了符合特定的格式要求&…

亿道丨三防平板丨如何从多方面选择合适的三防加固平板?

在如今这个信息爆炸的时代&#xff0c;移动设备已经成为我们生活和工作的必备工具。然而&#xff0c;在一些特殊的场合中&#xff0c;普通的平板电脑可能无法满足需求&#xff0c;比如工厂车间、野外作业、极端天气等环境下。此时&#xff0c;三防平板就成了不二之选。那么&…

怎么免费找回误删文件?这5个数据恢复工具能救你一命

如果不小心删除了文件&#xff0c;不要慌张&#xff0c;今天这个视频将为大家推荐5个最好的文件恢复软件。 误删文件是很多人在日常生活中都会遇到的问题&#xff0c;而找回丢失的数据更是至关重要。现在&#xff0c;有许多文件恢复软件可以帮助您快速找回丢失的重要文件。这些…

flutter sliver 多种滚动组合开发指南

flutter sliver 多种滚动组合开发指南 视频 https://youtu.be/4mho1kZ_YQU https://www.bilibili.com/video/BV1WW4y1d7ZC/ 前言 有不少同学工作中遇到需要把几个不同滚动行为组件&#xff08;顶部 appBar、内容固定块、tabBar 切换、tabBarView视图、自适应高度、横向滚动&a…

【前端素材】推荐优质后台管理系统Uena平台模板(附源码)

一、需求分析 后台管理系统&#xff08;或称作管理后台、管理系统、后台管理平台&#xff09;是一种专门用于管理网站、应用程序或系统后台运营的软件系统。它通常由一系列功能模块组成&#xff0c;为管理员提供了管理、监控和控制网站或应用程序的各个方面的工具和界面。以下…

sonar-java 手写一个规则-单元测试分析

前言 最近做项目&#xff0c;定制sonar规则&#xff0c;提高Java代码质量&#xff0c;在编写的sonar规则&#xff0c;做验证时&#xff0c;使用单元测试有一些简单的心得感悟&#xff0c;分享出来。 自定义规则模式 sonar的自定义规则很简单&#xff0c;一般而言有2种模式可…

基于自适应波束成形算法的matlab性能仿真,对比SG和RLS两种方法

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于自适应波束成形算法的matlab性能仿真,对比SG和RLS两种方法. 2.测试软件版本以及运行结果展示 MATLAB2022a版本运行 3.核心程序 ........................…

智慧农业之农产品溯源管理

总体设计 系统采用RFID无线射频识别技术对产品的生产、加工、运输、包装、配送等各个环节实施全程监控与可追溯。利用射频识别(RFID)、红外感应器、激光扫描器、传感器等信息传感设备,把任何物品与互联网连接起来,进行信息交换和通讯,以实现智能化识别、定位、跟踪、监控…

stable diffusion学习笔记 手部修复

图片手部修复原理 某张图片在生成后&#xff0c;仅有手部表现不符合预期&#xff08;多指&#xff0c;畸形等&#xff09;。这种情况下我们通常使用【局部重绘】的方式对该图片的手部进行【图生图】操作&#xff0c;重新绘制手部区域。 但是仅采用重绘的方式也很难保证生成的…

Redis 分布式锁

什么是分布式锁 在一个分布式的系统中&#xff0c;也会涉及到多个节点访问同一个公共资源的情况。此时就需要通过锁来做互斥控制&#xff0c;避免出现类似于“线程安全”的问题。 而 java 的 synchronized 或者 C 的 std::mutex&#xff0c;这样的锁都是只能在当前进程中生效…

leetcode-hot100-双指针

剪枝&#xff0c;减少不必要的计算 283. 移动零 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0] 示例 2: 输入: nums [0] 输出: [0] 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 第一印象&#xff1a;使用一个辅助数组&#xff0c;同时以…

el-submenu is-opened 展开/闭合;el-submenu is-opened保持一个子菜单的展开控制

写了个mes系统目录 点击子菜单展开后&#xff0c;上一级菜单没有默认关闭。主流后台管理系统大部分都是保持一个子菜单关闭状态、 问度娘无果后&#xff0c;查询官网&#xff0c;一个属性搞定。 unique-opened 是否只保持一个子菜单的展开 加在 <el-menu 组件上即可 完整代…

react中修改state中的值无效?

// 初始化state state {personArr:[{name:张三,id:1},{name:李四,id:2},{name:王五,id:3}] }componentDidMount(){const newName 赵六const indexUpdate 1const newArr this.state.personArr.map((item,index)>{if(indexUpdate index){return {...item,name:newName}}e…

Java 过滤器深入了解学习

Java 过滤器深入了解学习 生活不能等待别人来安排&#xff0c;要自己去争取和奋斗&#xff1b;而不论其结果是喜是悲&#xff0c;但可以慰藉的是&#xff0c;你总不枉在这世界上活了一场。有了这样的认识&#xff0c;你就会珍重生活&#xff0c;而不会玩世不恭&#xff1b;同时…

Netty权威指南——基础篇1(同步阻塞IO-BIO)

1 Linux网络I/O模型简介 1.1 简述 Linux的内核将所有外部设备都看做一个文件来操作&#xff0c;对一个文件的读写操作会调用内核提供的命令&#xff0c;返回一个file descriptor(fd&#xff0c;文件描述符)。而对一个socket的读写也会有相应的描述符&#xff0c;称为socketfd(…

SpringBoot原理篇

文章目录 SpingBoot原理1. 配置优先级2. Bean管理2.1 获取Bean2.2 Bean作用域2.3 第三方Bean 3. SpringBoot原理3.1 起步依赖3.2 自动配置3.2.1 概述3.2.2 常见方案3.2.2.1 概述3.2.2.2 方案一3.2.2.3 方案二 3.2.3 原理分析3.2.3.1 源码跟踪3.2.3.2 Conditional 3.2.4 案例3.2…