| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> JavaScript知识库 -> Vuex的作用、使用、核心概念(State、Mutations、Getters、Actions、Modules)、文件抽离 -> 正文阅读 |
|
[JavaScript知识库]Vuex的作用、使用、核心概念(State、Mutations、Getters、Actions、Modules)、文件抽离 |
vue入门–基础命令+axios+案例练习vue入门–vue常用属性、生命周期、计算属性、过滤器、组件、虚拟DOM、数组的响应式方法、页面闪烁、ES6简单语法增强vue入门–js高阶函数(箭头函数)、v-model数据绑定、组件化、父子组件通信及访问vue入门–插槽(具名、匿名、作用域插槽)+ES6模块化导入导出+webpack的使用(基本使用+配置使用+如何一步步演化成cli脚手架)+webpack插件使用(搭建本地服务器、配置文件分离)vue-cli脚手架2版本及3+版本安装、目录解析、only和compiler的区别、3+版本如何改配置、箭头函数及this的指向vue-router基本使用、路由传参、懒加载、嵌套路由、导航守卫、keep-alivePromise基本使用、三种状态、链式调用及简写、all方法Vuex的作用、使用、核心概念(State、Mutations、Getters、Actions、Modules)、文件抽离Vuex作用官方解释:
那么状态管理、集中式存储管理到底是什么呢? 其实,我们可以简单将其看做是 那么先来了解下,假如在要在Vue中放置一个全局对象,能做到吗?当然能,但是这个对象不是一个响应式的对象。 假如已经导入了Vue相关的依赖
那么Vuex就是为了解决这样不是 管理哪些状态最常见的就是用户登录后的一些信息如:用户名称、头像、 像常见的父子组件通信类的一些变量就没有必要去放到Vuex中进行管理了,直接父子通信方式传递数据就行了。 看一幅图: 其中State其实就是指我们的状态(变量数据,如在vue组件中定义的数据),然后会放到View,也就是视图上面去展示出来。再通过某个事件我们可以控制State(数据的状态),不停循环。 单页面状态管理代码说明:
上述代码块中, data()中定义的变量就是我们的State状态,然后页面上将 counter变量渲染了出来,当我点击 Vuex使用多页面状态管理假如在App.vue组件中用到了另一个组件,想要两个组件都能共用一个变量。当然这种简单的场景使用父子组件间的Props传值完全可以实现,这里只是为了说明如何进行全局性的状态管理。 安装vuex
vuex是一个插件,我们需要使用 使用且访问目录下新建一个
在main.js中,导入store,并且给vue实例使用
放置到vuex的state对象中的变量,在其他组件中都可以使用 比如上面我们在store的state中存放了一个counter为1000的变量,然后我们在一个组件中使用它们: 两种都可以使用
如果你的vue版本是 2.X ,将vuex升到 3.X.X 就能够解决,使用命令方式安装或者直接在package.json中改版本然后
如果你的vue版本是 3.X ,将vuex升到 4.X.X 就能够解决
页面上正常显示我们在vuex的state中定义的状态: 修改访问是没问题了,那么如果我要修改vuex中state中的变量时该怎么做呢? 可能我们都理想当然这样用: App.vue
HelloVuex.vue
按照vuex中定义好的规范,我们在修改vuex中的state时不能随意更改,比如: $store.state.counter++,这样子是不符合vuex中的规范的。我们需要在触发vue组件中的事件后,commit到Mutations中进行修改。后面我们要使用一个浏览器插件 我们先把DevTools安装到谷歌浏览器上面。 大多数人的谷歌浏览器应该没办法打开谷歌商店的,可以去网上下载一下。极简插件下载,下载完解压一下然后直接将解压完的文件拖入到谷歌的扩展程序中。 整完后重启一下浏览器,再次打开vue程序,选择好vue插件的页面。 那么开始定义真正对store中的state操作的部分,也就是 Mutations中的定义: mutations中定义的方法中,参数默认会传递一个
我们在组件中要对vuex中的state修改时,就需要去调用上面的 mutations中定义的规定好的方法来执行。
调用 $store.commit方法,传入mutations中相应的方法名称,直接调用方法来操作store中的state. Vuex核心概念
此图中说明了vue组件在访问和修改vuex中的state时的完整流程,其中Actions走不走都可以,但是一定要牢记: State单一状态树Single Source of Truth : 单一数据源。只创建一个Vuex实例对象,任何访问vuex中state的状态时,都需要经过这定义的唯一一个vuex实例对象(单一的数据源)。便于我们管理和维护。 Getters类似vue中的计算属性,计算缓存(一个计算属性被获取到后,会产生一个缓存数据)和及时更新数据,只不过处于不同的对象中。 有一场景:state中有定义一个counter的属性,但是在使用时都想要这个counter的平方值,那么我可以定义一个getters 在定义vuex中的index.js文件中
那么如何调用呢?
getters中的参数传参: 假如state中有一个数组,我们要筛选出>20的数的数据,并且还要得到数量。我们怎么做呢?
那么假如我并不确定筛选大于多少的数据怎么办呢?需要外界给传入一个参数
如何调用? 筛选出 > 30 的数据
Mutation携带传参。当需要更改Vuex中store状态时,唯一的修改方式就是:提交 Mutation Mutation主要包括两部分:
比如
既然第一个参数默认就是state,那么假如有其他的参数我该如何传给它呢? 第一个是默认的state,后面可以加上我们需要接收的参数即可。
调用时传入参数:
载荷(负载)同时也支持传入对象类型的参数:
mutation的提交风格除了通过 代码中的 commit方式进行提交(普通方式)外,Vuex还提供了一种包含type属性的对象方式提交。
上面两种方式都可以进行提交,那么两种方式的提交有什么不同的呢?打印下日志看下
也就是说,特殊方式的提交mutations中接收到的是一个 payload对象,这里写为 payload更易理解
mutations中的类型常量实际开发中,我们在mutations中定义的方法名称和在vue组件中使用commit提交时的名称很可能不小心写错产生问题,那么我们可以统一管理这些名称。 在store目录中创建一个 mutations-types.js文件,这个文件中定义我们用到的名称:
在vue组件中使用:
那么在vuex的mutations中同样也要使用同一个常量:
mutations同步函数通常情况下,Vuex要求我们Mutation中的方法必须是同步方法,原因
数据的响应式原理Vuex的state中的state是响应式的,当state中的数据发生变化时,Vue组件会自动更新,这就要求我们必须遵守一些Vuex对应的规则:
如果是给state中的对象新增新的属性时,它不是响应式的,那么我们就需要使用到上述的的两种方式来使它自动刷新。
Action我们前面说到不要在mutation中进行异步操作,但是某些情况下,我们确实希望在Vuex中进行一些异步操作,比如网络请求,必然是异步的操作,该怎么处理呢? Action类似于Mutation,但是是用来代替Mutation进行异步操作的。 先来回忆一下上面的图:
定义actions:
既然定义好的 actions中已经 commit到了 mutations中,那么在vue的组件中调用时,不用再去commit到mutations中了,直接dispatch到actions中的方法中即可。
与mutations一样,actions中也可以接收一些参数,传入参数时支持普通传入和对象传入。
那么当actions中的异步方法执行完成后,如何给一个回调呢? 那就需要用到我们之前学过的Promise了,给异步操作做一个包装,使代码的可读性更高。 在actions中当被访问到时,直接给返回一个 Promise对象,然后后续的回调处理交给调用者。
也就是当我们执行dispatch后actions那里会返回一个Promise对象,然后交个调用者处理回调
Modulesmodules指的是vuex对象中的模块。当应用变得非常复杂时,store的state可能变得非常臃肿,为了解决这个问题,Vuex允许我们将store分割成模块(module),而每个模块中又有自己的 state、mutations、actions、getters等(简单来讲,就是类似于一种树结构,能够无限套子集) 定义module
访问state定义了一个名称为a的模块,那么vue组件中如何使用呢?
实际上,我们定义的模块是有一个子模块,访问时需要从root级父模块中的state中寻找。 访问mutations那么访问子模块中的 mutations,该怎么访问呢?
可以看到,直接commit即可,它会先去root级模块中找,找不到再去子模块中去找。 访问getters定义一个getters
访问其实和之前一样,这些都是全局性的
那么不免会遇到,当子module中想要访问root级中的一些state时怎么办?假如root级state中有一个counter属性
前面说到getters中的参数,第一个是state,第二个getters,那么第三个就是 rootState(随意写的名称),rootState就是root级模块中的state。须知:mutations、getters都是全局性的,无论你是定义在哪个模块中 访问actionsactions与mutations、getters有些异同
访问actions时还是直接访问即可,所以再次提醒,无论是mutations、getters、actions中的方法名称都不要重复了。
我们看一下打印的context信息: 是一个对象类型,有getters,rootGetters,rootState,state等属性。 那么对
需要注意到一点:有些属性root级模块是没有的,比如:rootState,root级模块本身就是root,它已经没有上一个父级了 store的目录组织上面的所有的代码都是写到了一个index.js文件中,实际项目中我们会进行导入导出模块来将这些进行抽离。让我们的项目结构更加清晰。 抽离stateroot级目录中state可以这样抽离一下:
抽离mutationsroot级目录中mutations可以抽离为文件,然后导入这个文件即可。
导入使用
actions和getters同理。 抽离modules在store目录下新建文件夹modules,比如有一个 cart的module,就创建一个 cart.js
在index.js中直接导入使用
vue入门–基础命令+axios+案例练习vue入门–vue常用属性、生命周期、计算属性、过滤器、组件、虚拟DOM、数组的响应式方法、页面闪烁、ES6简单语法增强vue入门–js高阶函数(箭头函数)、v-model数据绑定、组件化、父子组件通信及访问vue入门–插槽(具名、匿名、作用域插槽)+ES6模块化导入导出+webpack的使用(基本使用+配置使用+如何一步步演化成cli脚手架)+webpack插件使用(搭建本地服务器、配置文件分离)vue-cli脚手架2版本及3+版本安装、目录解析、only和compiler的区别、3+版本如何改配置、箭头函数及this的指向vue-router基本使用、路由传参、懒加载、嵌套路由、导航守卫、keep-alivePromise基本使用、三种状态、链式调用及简写、all方法Vuex的作用、使用、核心概念(State、Mutations、Getters、Actions、Modules)、文件抽离 |
|
JavaScript知识库 最新文章 |
ES6的相关知识点 |
react 函数式组件 & react其他一些总结 |
Vue基础超详细 |
前端JS也可以连点成线(Vue中运用 AntVG6) |
Vue事件处理的基本使用 |
Vue后台项目的记录 (一) |
前后端分离vue跨域,devServer配置proxy代理 |
TypeScript |
初识vuex |
vue项目安装包指令收集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 16:43:37- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |