vuex工作原理与流程

article/2025/4/22 9:53:34

vuex工作原理与流程

Vue组件(action里面的dispatch )--> actions(commit方法) -->mutations(Mutate)--> state(getter) -->store更新所有调用vuex的组件(Vue Component组件)

1、state
存储应用状态数据的对象,与vue组件中data类似
state的值可以是对象,也可以是返回对象的函数
通过store.state访问状态数据
示例如下:

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex);
//必须在使用vuex之后去创建store
let store = new Vuex.Store({state: {},getters: {},mutations: {},actions: {}
})
//创建state
let state = _=>({a:1})
const store = new Vuex.Store({state
})const store2 = new Vuex.Store({state
})
console.log(store.state == store2.state);
store.state.a = 100;
console.log(store.state.a, store2.state.a);// store/index.js
import Vue from 'vue'
import Vuex from 'vuex'
import state from './state'
Vue.use(Vuex);
const store = new Vuex.Store({state
})export default store;
// 在组件中使用state
// stores/state.js
export default () => ({title: '骄阳似火',content: '来杯冷饮吧'
})
<!--Home.vue-->
<template><div class="home"><h2>{{title}}</h2><div>{{content}}</div></div>
</template>
<script>
import store from '@/store'
export default {name: 'home',data() {return {title: store.state.title,content: store.state.content}}
}
</script>

注意

  • 使用函数的方式返回对象,每次返回的都是新的实例对象,而它们的引用地址不同,就避免了修改data数据时,组件相互影响的问题。
  • state更新了视图却没有更新,钩子函数未触发导致。使用computed来解决,如下:
<template><div class="home"><h2>{{title}}</h2><div>{{content}}</div></div>
</template>
<script>
import store from '@/store'
export default {name: 'Home',computed: {title() {return store.state.title},content() {return store.state.content}}
}
</script>

2、getters
从state中派生的状态数据
接收state作为第一个参数,第二个为可选参数
类似组件中的 computed,派生数据,在数据出门后进行的加工(对原数据再加工,计算后的结果),这些处理都在getters中

3、mutations
提交mutation来修改store中的状态,同步操作
每个mutation都有一个字符串事件类型(type)与一个回调函数(handler),在回调函数中修改状态

注意:

  • 不能直接去调用mutation的回调函数,需要当mutation类型为increment时,才能调用此函数
  • mutation必须是同步的
  • 在store中初始化时设置好所有的属性

4、actions
与mutations类似,提交修改state的行为,处理异步任务
注意:

  • 提交的是mutation,不是直接修改状态
  • 可以包含任意异步操作

5、modules
将store分割成模块
每个模块拥有自己的 state、mutation、action、getters,
模块还可以嵌套子模块——从上至下进行类似的分割
注意:

  • 将当前业务所需内容 封装到独立的js文件中,以对象的形式导出
  • 在index.js(主控), 的modules中 注册模块
  • 组件中使用具体方法时,需要注意语法规范

vuex流程
综合示例
Home.vue

<template><div class="home"><h2>this is an home page</h2><hr><div class="addBox"><!-- 给input框添加一个ref标识newUser --><input type="text" ref="newUser" id="inputName"><button @click="addUsers">添加新用户</button><div v-show="msg">{{msg}}</div></div><ul><li v-for="(user,index) of users" :key="index">{{user.id}}-{{user.username}}-{{user.gender}}</li></ul><hr><ul class="ulist"><li v-for="(user) of sortUsers"><span>ID:{{user.id}}, 姓名:{{user.username}}</span></li></ul><hr><button @click="sortData=!sortData">排序</button></div>
</template><script>export default {name: 'Home',data() {return {sortData: true,msg: ""}},computed: {users() {// console.log(this.$store.state.showUsers);// vuex中,要对数据加工(计算)都在getters中,通过getters获取showUsersreturn this.$store.getters.showUsers;},sortUsers() {//index.js文件中的getters里面,showSortUsers()函数内返回值封装成一个函数,这里可以调用showSortUsers方法,还可以给它传参数 return this.$store.getters.showSortUsers(this.sortData);}},methods: {/* commit:同步操作,写法:this.$store.commit('mutations方法名',值)dispatch:含有异步操作,比如向后台提交数据,写法: this.$store.dispatch('action方法名',值)*/// addUsers() {/*  通过commit提交操作到mutations对应的方法中commit方法有两个参数  参数1:方法名   参数2:需要的参数 */// 通过$refs获取我们标识过的input框输入的值// console.log(this.$refs.newUser.value);// 通过commit方法提交的addUsers()这个方法与index.js中mutations中的方法名对应// this.$store.commit("addUsers",this.$refs.newUser.value);// 以对象的方式提交// 这里payload传的是个对象,添加后,页面会出现像这样的效果{6,"柯南","男"}// 所以在index.js的mutations中的方法这样写addUsers(state, {payload}) { //将payload解构成对象 }/* this.$store.commit({type:"addUsers",payload:this.$refs.newUser.value}); */// 异步操作:dispatch提交到actionsasync addUsers() {this.msg = ""; //输入框提示信息try {let rs = await this.$store.dispatch({type: "addUsers",//传入实参payload: this.$refs.newUser.value});this.msg = rs;} catch (error) {this.msg = error;}// 每次添加完后将input框内容清空this.$refs.newUser.value = "";}}}
</script>
<style scoped>ul {padding: 0;margin-left: 45%;}ul li {width: 120px;list-style: none;text-align: left;}.addBox input {line-height: 19px;margin-top: 2px;margin-right: 5px;}
</style>

index.js

import Vue from 'vue'
import Vuex from 'vuex'Vue.use(Vuex);let nextID = 5;//写在外面也可以获取到
export default new Vuex.Store({state: {title: "骄阳如火",content: "春天已经远去,夏日款款走来",userGender: "",// nextID:5,//不要在组件中直接去修改数据源(数据私密,不能随意修改)users: [{ id: 1, username: "jack", gender: "男", checked: false },{ id: 2, username: "tom", gender: "男", checked: false },{ id: 3, username: "lucy", gender: "女", checked: false },{ id: 4, username: "mary", gender: "女", checked: false },{ id: 5, username: "john", gender: "男", checked: false }],},// 类似组件中的 computed,派生数据,在数据出门后进行的加工(对原数据再加工,计算后的结果),这些处理都在getters中getters: {// 筛选数据 // showUsers:function(){}showUsers({ users, userGender }) {// 返回筛选后的数据return '' === userGender ? users : users.filter(users => users.id);},// 排序showSortUsers({ users }) {// 返回排序后的数据// 对新数组操作,原数组不变,深拷贝//这里返回的是计算结果,在组件中是获取,而不能直接调用// return [...users].sort((a,b)=>{//   // 排序的方式(顺序或者倒序)//   return a.id - b.id// });//返回 一个带参数sort的函数,在组件中可以直接调用showSortUsers函数return (sort = true) => {//返回排序后(按照id大小)的结果return [...users].sort((a, b) => {// a.id - b.id 从低到高排序// b.id - a.id 从高到低排序// 如何排序后的结果return sort ? a.id - b.id : b.id - a.id;});}}},// 直接操作数据源:// (1)会把异步操作当成同步处理 // (2)无法拿到异步处理的结果(源码中没有异步的机制)// 注意:对state中数据的操作:添加、删除、修改按照js方式操作即可/* mutations中的方法,接收两个参数 参数1:state 当前的store仓库参数2:通过commit方法传过来的数据*/mutations: {//因为组件方法中payload是存在对象中的,这里要以对象的形式结构出来addUsers(state, payload) {// 将新数据以对象的形式添加进来state.users.push({id: ++nextID,username: payload,gender: '男',checked: false});}},// 异步处理在actions中,然后通过commit提交给mutation// actions中的方法,第一个参数默认是store// 将store解构成一个对象{state},下面调用方法时直接可以用stateactions: {//paylod是input输入框的值,使用addUsers({state,commit}, {payload} ) {// Promise帮助处理异步操作return new Promise((resolve, reject) => {setTimeout(() => {// 不允许用户重名(两次输入相同的用户名或者输入users数据中已有的用户名,不能添加,并给出用户名已存在的提示)if (state.users.find(user => user.username === payload)) {reject("该用户已存在");} else {//这里payload直接作为属性值传过去的,所以actions中方法addUsers()中的参数payload不需要解构了commit("addUsers", payload);// 添加成功resolve("新用户添加成功");}}, 1000);});// 模拟异步// setTimeout(() => {//   if (state.users.find(user => user.username===payload)) {//     return;//   } else {//     // 将新数据以对象的形式添加进来//     state.users.push({//       id: ++nextID,//       username: payload,//       gender: '男',//       checked: false//     });//   }// }, 1000);}},// 模块化()modules: {}
});

http://chatgpt.dhexx.cn/article/dlcTtPUn.shtml

相关文章

Vue知识点整理(五)- vuex(1)- Vuex简介、Vuex工作原理、搭载Vuex环境、求和案例

目录 一、vuex简介 1.1 vuex是什么 1.2 什么时候使用Vuex 二、Vuex工作原理图 2.1 官方vuex工作原理图 2.2 Vuex工作流程 三、搭建Vuex环境 3.1 安装 3.2 引用Vuex 四、案例练习 - 求和案例 4.1 Count.vue 4.2 App.vue 4.3 index.js 一、vuex简介 1.1 vuex是什么…

Vuex框架原理与源码分析

本文授权转自微信公众号“美团点评技术团队”。 作者简介&#xff1a;明裔&#xff0c;美团外卖高级前端研发工程师&#xff0c;2014年加入美团外卖&#xff0c;负责Web主站开发。先后参与了外卖B端、C端、配送等全业务线系统开发后&#xff0c;目前主要负责商家券活动系统。 责…

vuex原理和下载

vuex&#xff1a;状态管理模式 vue全家桶&#xff1a;vue-cli&#xff08;脚手架&#xff09;、vue-router&#xff08;路由管理器&#xff09;、vuex&#xff08;状态管理模式&#xff09; 原理图示&#xff1a; 原理描述&#xff1a; vuex在vue组件外面进行组件状态的管理…

手写Vuex核心原理,再也不怕面试官问我Vuex原理

手写Vuex核心原理 文章目录 手写Vuex核心原理一、核心原理二、基本准备工作三、剖析Vuex本质四、分析Vue.use五、完善install方法六、实现Vuex的state七、实现getter八、实现mutation九、实现actions 一、核心原理 Vuex本质是一个对象Vuex对象有两个属性&#xff0c;一个是ins…

vuex实现原理

文章目录 vuex是什么&#xff1f;为什么会出现&#xff1f;怎么使用&#xff1f;怎么实现&#xff1f;1、给每个实例注入$store2、设置state响应数据3、getters4、mutations5、actions6、modules7、持久化插件plugins8、辅助函数mapState用法命名空间用法实现原理命名空间原理 …

Vuex的实现原理解析(最清晰)

Vuex的实现原理解析(最清晰) Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式,可以帮助我们管理共享状态。 如何在Vue中使用Vuex? 如下先来回顾一下使用Vuex的正确姿势&#xff1a; 引入Vuex插件&#xff1b; // store.js Vue.use(Vuex);将Vuex.Store这个类实例化&…

通俗理解vuex原理---通过vue例子类比

主要通过简单的理解来解释下vuex的基本流程&#xff0c;而这也是vuex难点之一。 首先我们先了解下vuex的作用 vuex其实是集中的数据管理仓库&#xff0c;相当于数据库mongoDB&#xff0c;MySQL等&#xff0c;任何组件都可以存取仓库中的数据。 vuex流程与vue类比 我们看一下…

遇见面试--vuex原理

遇见面试 Vuex原理解析 一、前言 自从学习了VUE框架&#xff0c;其中必不可少的会用到vuex这个核心插件&#xff0c;而且在做项目的时候&#xff0c;基本都会使用&#xff0c;可能你会使用vuex状态管理&#xff0c;但是对vuex原理存在着或多或少的的疑惑或不解&#xff0c;这…

vuex的工作原理

Vuex是做什么的? 官方解释&#xff1a;Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。 它采用 集中式存储管理 应用的所有组件的状态&#xff0c;并以相应的规则保证状态以一种可预测的方式发生变化。Vuex 也集成到 Vue 的官方调试工具 devtools extension&#xff0…

vuex 的实现原理

一、Vuex是什么   Vuex是专门为Vuejs应用程序设计的状态管理工具。它采用集中式存储管理应用的所有组件的状态&#xff0c;并以相应的规则保证状态以一种可预测的方式发生变化。 1、Vuex的构成 由上图&#xff0c;我们可以看出Vuex有以下几个部分构成&#xff1a; 1&#x…

vuex原理

目录 一、 为啥会出现vuex 二 、什么是vuex 三、 怎么使用vuex 四、vue和vuex比较 五、vuex的五个属性 5.1 state 5.2 mutations 5.3 getters 5.4 Actions 5.5 Modules 六、为啥state里的数据可以实现响应式 七、为啥每个组件都可以拿到state里的数据 一、 为啥会出…

vuex的原理

1.vuex的作用 vuex是专门为Vuejs应用程序设计的状态管理工具。其实是集中的数据管理仓库。相当于数据库mongoDB等&#xff0c;任何组件都可以存取仓库中的数据。 vuex的组成部分&#xff1a; state:是存储的基本数据。mutations:提交更改数据。getter:对state加工&#xff0c…

vuex 的基本用法

一、vuex是什么&#xff1f; Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态&#xff0c; 这个状态管理应用包含以下几个部分&#xff1a; state&#xff0c;驱动应用的数据源&#xff1b;view&#xff0c;以声明方式将 stat…

DNS风险分析及安全防护研究(三):DNS缓存投毒及防御策略

在前面章节中&#xff0c;我们简单介绍了DNS系统在协议、软件以及结构中脆弱性&#xff0c;并对DNSSEC协议、去中心化结构等安全增强进行了讨论&#xff0c;接下来针对DNS安全所面临的外部攻击威胁和相应的防御策略做下讨论。 1.DNS缓存投毒攻击 在目前各种DNS攻击手段中&…

细说SQL注入:攻击手法与防御策略

一、 SQL注入的基本概念 &#xff08;一&#xff09;什么是SQL注入 SQL注入是一种常见的网络攻击技术&#xff0c;它允许攻击者在Web应用程序中插入并执行恶意的SQL代码。这种攻击通常针对的是数据驱动的应用程序&#xff0c;尤其是那些未对用户输入进行充分过滤和处理的应用程…

服务器被cc攻击的简单防御策略(附代码)

CC攻击&#xff08;也称为网络层攻击或流量攻击&#xff09;是指企图通过向网站或服务器发送大量伪造的请求&#xff0c;以干扰正常的用户访问的攻击。这些请求可能是来自单个设备的&#xff0c;也可能是来自一群被控制的设备的。为了防御CC攻击&#xff0c;你可以考虑使用以下…

DOS防御策略

该方法能解决一些小型服务的DOS防御问题&#xff0c;成本不高&#xff0c;能在一定程度上起到DOS防御的作用。 原本服务架构 我们的服务器向多个客户机提供服务&#xff0c;这里以腾讯云服务器为例&#xff0c;假设服务商租了一台腾讯云的服务器&#xff0c;一旦服务器收到攻击…

网络安全中的常见攻击类型和防御策略

友情链接&#xff1a;简单实用的IPAD协议框架GeWe框架 网络安全是当前互联网世界中的重要问题。本文将详细介绍常见的网络攻击类型&#xff0c;包括分布式拒绝服务攻击&#xff08;DDoS&#xff09;、SQL注入、钓鱼等&#xff0c;并提供相应的防御策略。读者将了解如何识别和应…

会话重放之防御策略、手段

目录 什么是会话重放&#xff1f; 有什么预防手段&#xff1f; 请求添加时间戳或UUID方式实现预防 什么是会话重放&#xff1f; 会话重放是一种攻击方式&#xff0c;攻击者利用先前记录的会话数据来重放或重新发送网络通信流量&#xff0c;以模拟合法用户的身份&#xff0c;…