【手写 Vuex 源码】第一篇 - Vuex 的基本使用

news/2024/5/15 4:39:07/文章来源:https://blog.csdn.net/ABAP_Brave/article/details/128951604

一,前言

本篇开始,进入 vuex 源码学习,本篇主要介绍一下内容:

  • 创建 vuex 源码项目;
  • 介绍 vuex 的基本使用;

二,创建 vuex 源码项目

1,使用 vue-cli 创建 vue2.x 脚手架

vue create source-learning-vuex

脚手架配置项:

Vue CLI v4.5.13
? Please pick a preset: Manually select features
? Check the features needed for your project: 
❯◯ Choose Vue version◉ Babel◯ TypeScript◯ Progressive Web App (PWA) Support◯ Router◯ Vuex◯ CSS Pre-processors◯ Linter / Formatter◯ Unit Testing◯ E2E Testing

2,安装 vuex 依赖

npm install vuex

3,创建 .gitignore 文件

创建 .gitignore 文件,忽略掉不需要版本控制的文件:

// .gitignore.DS_Store
node_modules
/dist

准备工作完成;


二,vuex 的工作流程

vuex 为项目开发提供了状态管理及数据共享能力;

在项目开发中,使用 vuex 能够将所有的数据统一存储到一个 store 容器中进行管理;

如下图所示,绿色虚线框即为 vuex 的管理范围,表示一个容器:

vuex工作流程.png

  • 在 vuex 中,进行统一的项目状态管理,可以通过 vuex 将状态映射到项目任何组件;
  • 在 vuex 中,通过 mutation 是更新状态的唯一方式;
  • 状态同步更新:通过直接将结果提交到 mutation,实现状态的同步更新;
  • 状态异步更新:通过调用 dispatch 方法,触发对应 action 执行异步操作,并将异步操作的结果提交至 mutation 实现状态的同步更新;
  • 日常项目开发中,也可以借助 vuex 的状态管理特性,实现前端的数据缓存功能;

三,vuex 的基本使用介绍

1,vuex 的核心概念

在 vuex 官方文档中,核心概念共有以下五个:

  • State:状态,可以理解为 vue 组件中的 data 数据;
  • Getter:可以理解为 vue 中的 computed 计算属性;
  • Mutation:同步函数,可以同步更改状态;
  • Action:异步函数,可以执行异步操作,配合 Mutation 实现状态的异步更新;
  • Module: vuex 的模块化,能够将臃肿复杂的 store 容器进行模块化分割,每个模块拥有独立的 state、mutation、action、getter;

2,vuex 插件配置

引入并通过Vue.use(Vuex)安装 vuex 插件,配置并导出 store 实例:

// src/store/index.jsimport Vue from 'vue';
import Vuex from 'vuex';// 注册 vuex 插件:内部会调用 Vuex 的 install 方法
Vue.use(Vuex);// 实例化容器:Vuex.Store
const store = new Vuex.Store({// state 状态:相当于组件中的 data 数据state: {num: 10},// getters 相当于计算属性(内部实现利用了计算属性)getters: {},// 相当于 method,能够同步的更改 statemutations: {},// action作用:执行异步操作,并将结果提交给 mutationsactions: {}
});export default store;// 导出 store 实例,传入根组件
备注:此处为简单配置,尚未引入 Vuex 模块化及命名空间概念;

在 main.js 中导入配置完成的 store 实例;

new Vue初始化时,将 store 实例注入根组件:

// main.jsimport Vue from 'vue'
import App from './App.vue'
import store from './store/index' // 引入 store 实例new Vue({store,// 将 store 实例注入到 vue 中render: h => h(App),
}).$mount('#app');

此时,vuex 插件配置完成,可直接在页面中测试使用;

3,state 的使用

在 App.vue 中, template中直接输出 store 容器中的状态 num:

// src/App.vue<template><div id="app">商品数量: {{this.$store.state.num}} 个<br></div>
</template>

执行 npm run serve 启动服务:

image.png

问题:this.$store.state.num是如何获取到状态的?

这里涉及 Vuex 插件初始化,与 vue-router 安装流程相似;当执行`Vue.use(Vuex)`时,会调用 install 方法,为每个子组件都混入了当前的 store 容器实例;new Vue 是根实例;App.vue 是根实例的子组件;所以,new Vue 中传入的 store 实例,install 时会被混入到 App.vue 组件上;同理,最终所有组件都将混入来自父组件的 store 实例,从而实现 store 容器实例的共享;

4,getters 的使用

getters 的内部实现依赖了 computed;

所以,可以理解为 Vue 的 computed 计算属性;

// main.jsimport Vue from 'vue';
import Vuex from 'vuex';// 注册 vuex 插件:内部会调用 Vuex 中的 install 方法
Vue.use(Vuex);// 实例化容器容器:Vuex.Store
const store = new Vuex.Store({state: {num: 10},getters: {// 根据商品数量计算总价格getPrice(state) {return state.num * 10}},
});
export default store;

template中,使用用 getters 方法 getPrice:

// src/App.vue<template><div id="app">商品数量: {{this.$store.state.num}} 个<br>商品单价: 10 元<br>订单金额: {{this.$store.getters.getPrice}} 元<br></div>
</template>

image.png

备注:由于 getters 具备计算属性特性,当依赖的 state 状态改变时,会触发更新;

5,mutation 的使用

在 vuex 中,通过 commit 提交 mutation 是更新状态的唯一方式;

mutation 方法:

  • 第一个参数:state 状态对象;
  • 第二个参数:payload 载荷,本次修改结果;
// src/store/index.jsimport Vue from 'vue';
import Vuex from 'vuex';Vue.use(Vuex);const store = new Vuex.Store({state: {num: 10},mutations: {// 更新 numchangeNum(state, payload) {state.num += payload;}}
});
export default store;

template 中,直接调用 commit 方法提交 mutation,同步更新状态:

// src/App.vue<template><div id="app">商品数量: {{this.$store.state.num}} 个<br>商品单价: 10 元<br>订单金额: {{this.$store.getters.getPrice}} 元<br><button @click="$store.commit('changeNum',5)">同步更新:数量+5</button></div>
</template>

点击同步更新按钮,触发 mutation 方法,视图更新:

image.png

6,action 的使用

组件通过调用 dispatch 触发 action 执行异步请求返回结果数据,再通过 commit 提交 mutation 完成状态更新;

在 action 方法中:

  • 可以继续调用 dispatch 触发 action;
  • 可以多次调用 commit 进行状态提交;

备注:

  • mutation 方法的目的是修改状态,所以第一个参数是 state 状态;
  • action 方法需要将结果提交到 mutation,所以第一个参数是 store(store 中包含了 commit 方法)
// src/store/index.jsimport Vue from 'vue';
import Vuex from 'vuex';Vue.use(Vuex);const store = new Vuex.Store({state: {num: 10},mutations: {changeNum(state, payload) {state.num += payload;}},// action作用:执行异步操作,并将结果提交给 mutationsactions: {changeNum({ commit }, payload) {setTimeout(() => { // 模拟异步commit('changeNum', payload)}, 1000);}}
});export default store;
备注:这里使用 setTimeout 模拟异步操作;

template 中,直接调用 dispatch 方法触发 action,异步更新状态:

// src/App.vue<template><div id="app">商品数量: {{this.$store.state.num}} 个<br>商品单价: 10 元<br>订单金额: {{this.$store.getters.getPrice}} 元<br><button @click="$store.commit('changeNum',5)">同步更新:数量+5</button><button @click="$store.dispatch('changeNum',-5)">异步更新:数量-5</button></div>
</template>

点击异步更新按钮,1 秒后,视图更新:

image.png

以上,就是 vuex 几个核心概念的基本用法;


四,结尾

本篇,介绍了 vuex 的基本用法,主要包含以下几个点:

  • vuex 项目创建;
  • vuex 工作流程介绍;
  • vuex 的基本使用介绍;

下一篇,介绍 vuex 的 install 插件安装逻辑;


维护日志

  • 20210918:

    • 优化文章描述,添加了部分代码的意图与注释;

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

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

相关文章

OpenSergo Spring Cloud Alibaba 带来的服务治理能力

作者&#xff1a;十眠、牧思 Spring Cloud 应用为何需要服务治理 随着微服务技术的发展&#xff0c;微服务(MicroServices) 的概念早已深入人心&#xff0c;越来越多的公司开始使用微服务架构来开发业务应用。 如果采用得当&#xff0c;微服务架构可以带来非常大的优势。微服…

linux 学习(持续更新)

一&#xff1a;初识linux 新装操作环境&#xff1a; mac intel电脑 CentOS系统版本&#xff1a;CentOS-8.1.1911 在这里解释一下[chenllocalhost /]$这句话的含义&#xff1a; chenl是用户名&#xff0c;也就是你自己起的名字。 是分割的符号 localhost是主机名&#xff0c;也…

“搜索大战”正式打响,微软发布ChatGPT版搜索引擎和浏览器

微软公司宣布推出由ChatGPT支持的最新版本Bing&#xff08;必应&#xff09;搜索引擎和Edge浏览器&#xff0c;今天上线&#xff0c;免费使用&#xff01; 自去年开始&#xff0c;Stable Diffusion、ChatGPT 等 AI 工具的横空出世&#xff0c;貌似在告诉人们“AI 正在准备重塑整…

力扣SQL刷题7

1132. 报告的记录 II 题型&#xff1a;表1&#xff0c;对列A分组&#xff0c;在列B满足某种条件下&#xff0c;&#xff08;出现在表2中的列C值个数&#xff09;/(列C个数)的比例&#xff0c; 对A分组各类别中取均值 解答1&#xff1a; select 列A&#xff0c;count(distinct …

如何在Visual Studio、Clion、Msys2中安装和使用vcpkg

首先事情是在安装了Msys2之后&#xff0c;想在Clion中使用安装在Msys2中的vcpkg。但是折腾了很久还是无法解决。于是就折腾出了这篇文章&#xff0c;和下一篇如何在Clion使用vcpkg的文章。 不过&#xff0c;由于我电脑上已近配置好了vcpkg以及环境变量&#xff0c;要是重新删除…

@LoadBalanced 和 @RefreshScope 同时使用,负载均衡失效分析

背景 最近引入了 Nacos Config 配置管理能力&#xff0c;说起来用法很简单&#xff0c;还是踩了三个坑。 Nacos Config 的 nacos 的帐号密码加密配置后&#xff0c;怎么解密而且在 NacosConfigBootstrapConfiguration 真正注入 Nacos Config 注入之前&#xff0c;而且不能触发…

小白系列Vite-Vue3-TypeScript:009-屏幕适配

上一篇我们介绍了ViteVue3TypeScript项目中mockjs的安装和配置。本篇我们来介绍屏幕适配方案&#xff0c;简单说来就是要最大程度上保证我们的界面在各种各样的终端设备上显示正常。通用的屏幕适配方案有两种&#xff1a;① 基于rem 适配&#xff08;推荐&#xff0c;也是本篇要…

[DiceCTF 2023] rRabin

一点点学习别人的WP&#xff0c;这回看到一个大姥(r3kapig)的帖子&#xff0c;DiceCTF第二名&#xff0c;不过有好多东西一时还理解不了&#xff0c;得慢慢来。题目这个题有3个功能&#xff1a;rsa加密功能&#xff0c;p,q,N未知&#xff0c;e17低加密指数解密&#xff0c;不过…

Reflections反射包在springboot jar环境下扫描不到class排查过程

需求&#xff1a; 要实现指定pkg&#xff08;如com.qiqitrue.test.pojo&#xff09;扫描包下所有class类信息&#xff1a;使用代码如下 使用的版本&#xff1a;0.10.2&#xff08;截至目前是最新版&#xff09;发现只能在idea编译期间可以获取得到&#xff08;也就是在开发阶段…

解读YOLO v7的代码(三)损失函数

在前两篇博客中我分析了YOLO v7的模型结构以及训练数据的准备。这里将对损失函数的代码进行分析。在train.py中&#xff0c;我们可以看到以下的代码是进行损失值计算的if loss_ota not in hyp or hyp[loss_ota] 1:loss, loss_items compute_loss_ota(pred, targets.to(device…

图解项目延期的原因及解决应对方案大全

项目管理中经常出现项目延期的情况&#xff0c;面对项目延期的风险如何应对是考验每个项目经理管理水平的时候&#xff0c;很多人纵然是工作多年也没有对延期的种种情况进行总结思考。咱们社区的小竹对大家常见的项目延期情况及处理方案进行了详细全面的总结&#xff0c;供大家…

【数据结构-JAVA】排序

排序在现实生活中的应用可谓相当广泛&#xff0c;比如电商平台中&#xff0c;选购商品时&#xff0c;使用价格排序或是综合排序、高考填报志愿的时候&#xff0c;会参考全国大学排名的情况。下面介绍一些计算机中与排序相关的概念&#xff1a;排序&#xff1a;所谓排序&#xf…

python自学之《21天学通Python》(10)——正则表达式

第13章 正则表达式 最初的正则表达式出现于理论计算机科学的自动控制理论和形式化语言理论中。在这些领域中有对计算&#xff08;自动控制&#xff09;的模型和对形式化语言描述与分类的研究。 程序员所用的正则表达式是指用某种模式去匹配一类具有共同特征的字符串。正则表达…

机器学习调参

机器学习调参常用调参方法举例K邻近算法&#xff08;最常规版本&#xff09;加入交叉验证加上网格搜索GridSearchCV函数介绍GridSearchCVcross_val_score常用调参方法举例 sklearn使得我们在很多编写代码的时候更多的工作倾向于调参数而不是去写算法本身&#xff0c;本篇文章整…

卸载Node.js

0 写在前面 无论您是因为什么原因要卸载Node.js都必须要卸载干净。 请阅读&#xff1a; 1 卸载步骤 1.1通过控制面板卸载node.js winR—>control.exe—>卸载程序—>卸载Node.js 等待—>卸载成功 1.2 删除安装时的nodejs文件夹 通过记忆或者Everthing搜索找…

「自控元件及线路」14 电子电力技术与功率放大器概述

本节介绍电子电力技术的基本概念 本节介绍PD、SCR、GTR、MOSFET、IGBT等电子电力器件 本节介绍功率放大器的基本概念和线性功率放大器 文章目录电力电子技术概述电能变换电子电力器件功率二极管PD晶闸管SCR功率晶体管GTR功率场效应晶体管PowerMOSFET绝缘栅双极晶体管IGBT功率放…

使用 ThreeJS 实现第一个三维场景(详)

文章目录参考描述index.html三维场景的基本实现导入 ThreeJS准备工作场景摄像机视锥体正交摄像机透视摄像机渲染器后续处理将摄像机添加至场景中移动摄像机设置画布尺寸将渲染器创建的画布添加到 HTML 元素中渲染物体结构材质合成将物体添加至场景中代码总汇执行效果动画reques…

你的自动化框架如何设计的?为什么感觉面试官总是不满意,到底问题出在哪?

前言去面试自动化测试岗位&#xff0c;尤其是接口自动化岗位&#xff0c;面试官总会问&#xff1a;说下你的自动化框架如何设计的&#xff1f;为什么回答后&#xff0c;面试官对你的框架设计总是感觉不满意&#xff1f;自动化测试实现的几种方式对于不同的公司来说&#xff0c;…

2023年地方两会政府工作报告汇总(各省市23年重点工作)

新年伊始&#xff0c;全国各地两会密集召开&#xff0c;各省、市、自治区2023年政府工作报告相继出炉&#xff0c;各地经济增长预期目标均已明确。相较于2022年&#xff0c;多地经济增长目标放缓&#xff0c;经济不断向“高质量”发展优化转型。今年是二十大后的开局之年&#…

【参加CUDA线上训练营】零基础cuda,一文认识cuda基本概念

【参加CUDA线上训练营】零基础cuda,一文认识cuda基本概念1.术语2.线程层次2.1 Block、Warp与Thread之间的关系2.2 Thread index1.术语 \\%序号名称描述1HostCPU和内存&#xff08;host memory&#xff09;2DeviceGPU和显存&#xff08;device memory&#xff09;3SMStreaming M…