Vuex,状态管理模式
对于 Vue 本人目前接触不深,只得浅层分析,Vue 是单向数据流,
state,驱动应用的数据源;
view,以声明方式将 state 映射到视图;
actions,响应在 view 上的用户输入导致的状态变化。
子组件内部不能直接修改从父级传递过来的数据,子组件与子组件之间无法相互传递数据。如果我们想让两个子组件之间进行通信的话,可以借助子组件 A 向父组件传值,父组件接收子组件 A 的数据后再传给 B 组件这样的方式进行通信。
这就有一个尴尬的问题了,要是子组件 A 上面还有一层父组件,子组件 B 上面也有一层父组件,这样两个两兄弟说话就得通过先告诉各自的爹,然后爹再传给爷爷进行通信,这就麻烦了。
能不能我们将一个共有的数据存在一个特定的地方,用的时候自己去拿,这样就不需要一层层传值,于是乎 Vuex 就应运而生了。如下图
在单向数据流中插入 Vuex 来进行多个组件共享状态,这样不仅可以使组件间的传值变得简单方便,又提高了代码的简洁性。
话不多说,上代码。
本人用官方推荐的 vue-cli 脚手架对项目进行了初期构建,详细使用说明请自行参见官方文档。如下图。
本人用的版本是vue-cli 版本为 3.X,可能之前大家用的是 2.X ,其实大同小异,大家有兴趣自己可以研究一下,小弟才疏学浅,就不献丑了。
vue-cli 会给我们两种选择搭建项目,一种是按照官方给的默认配置,另一种就是自己配置,就是我们选中上图的最后一行按回车,如下图
可以看到如上配置,包括我们接下来要说的 Vuex ,还有 Router 等其他 Vue 全家桶,有时间本人撸完一遍可以说一说。
我们就按照官方默认配置的进行项目搭建,选中 default 行按回车,就开始创建项目了。
创建完之后在控制台输入 npm install 进行项目所依赖包的下载。完成之后完整的项目目录如下所示。
相比于 vue-cli 2.X 来说项目目录进行了简化,将 webpack 目录进行了隐藏,vue 的相关配置也进行了精简,当然这都不是重点了。
运行 npm run serve 将项目跑起来。
写了这么多,接下来才开始进入重点。我们将代码先进行优化一下,然后做一个例子,在页面顶部为一个选中的城市,在底部有一些备选城市,当点击备选城市时选中城市变为备选城市,这个听起来是一个非常简单的应用了,说干就干。
项目目录
HelloWorld.vue
CityTop.vue
CityList.vue
city.json
为了最大程度上保持原有目录结构,这里只是将 HelloWord.vue 文件更改为一个父组件,CityTop.vue 和 CityList.vue 为其子组件,同时为了简化数据库的查询,只是在 public 文件夹中存入静态 json 数据,数据库是本人特别喜欢玩的东西,有空写一下。
最终呈现的效果如下
现在我们就来做点击事件,点击下面的城市(CityList.vue),头部的城市(CityTop.vue)可以切换,但是这两个都为 HelloWorld.vue 的子组件, vue 是单向数据绑定,所以他们之间无法进行通信,本人在之前讲过 javascript 的原型链继承,vue 其实就是 js 的一种框架,它也有 prototype 属性,我们叫做 Bus总线方法。如下:
我们现在 Vue 的 prototype 属性中引入 bus ,然后在 button 按钮上绑定 cityClick 点击事件,并传入点击的 city ,然后在 bus总线上注入 changeCity 方法,并将点击的 city 值传入,我们再来看一下 cityTop.vue ,如下图:
之前说过子组件内部不能修改从父组件传过来的数据,所以我们先拿一个变量 citySelf 接收一下。由于 cityList.vue 里的 cityClick 点击事件里的 changeCity 方法是绑定在 bus总线上的,所以 cityTop.vue 里也应存在 changeCity 方法。当 vue 的生命周期钩子函数 mounted 中接收一下 bus总线的 changeCity 方法,并将接收的 city 值赋值给 citySelf ,这样就能实现两个子组件的数据传递了。如下图:
从页面效果和控制台的日志输出上我们可以看出此方法是可行的,get it !!!
我们再来看另一种方法,由于两个子组件的深度只有一层,我们可以利用父组件进行信息的传递。如下:
在 cityList.vue 中定义 cityClick 方法,将 changeCity 方法注入,并将所选中的 city 值传入,在父组件 HelloWorld.vue 中接收,如下图:
在父组件的的 city-list 标签中写上子组件 CityLict.vue注入的 changeCity方法,并指向 changeCityClick 方法,changeCityClick 方法中接收传过来的选中的 city 值,并将该值传递给子组件 CityTop.vue,如下:
最终效果如下:
这样通过子组件 VueList.vue 将 city 值传给 父组件 HelloWorld.vue 中,再通过父组件将 city 值传给子组件 CityTop.vue 中,这样就完成了子组件与子组件间的数据传递,get it !!!
接下来介绍今天的主角 Vuex ,Vuex 说白了就像是开辟了一个组件共有的内存空间,组件都可以去取去用,那就开始干吧。
我们之前用 vue-cli 创建项目的时候没有引入 Vuex ,所以先运行 npm install vuex 下载一下 Vuex 包。
我们先按官方提供的 Vuex 流程图走一下
如上图,在子组件中,当子组件调用 Actions 时调用 Dispatch 方法,当 Mutations 调用 Actions 时需要调用 Commit 方法,当 State 调用 Mutations 时需要调用 Mutate 方法,State 改变时就将改变的值传给子组件了,话不多说,试试吧。
我们先将项目目录结构变一下。
创建 store 文件夹,里面添加一个 index.js 来存储共享数据。
在 main.js 中引入 store文件,并在 Vue 实例中注入 store 。
在 CityList.vue 中添加 cityClick 点击方法,根据上面说的流程将一个 changCity 事件通过 dispatch 方法注入,并将所选的 city 值传入。
在 store 文件夹的 index.js 中按官方演示那样写入如上按钮,在 actions 中写入用 dispatch 注入的 changeCity 方法,并传入选中的 city 值,第一个为必传值,待会我们打印出来再说。然后再利用 commit 方法将 changeCity 和 city 值闯入mutations 中,在 mutations 中将传入的 city 值赋值给共享数据的 city。最后将 city 值传给 cityTop.vue ,如下图:
至此 city 数据就通过子组件 cityList.vue 传给了子组件 cityTop.vue ,效果如下:
如上图,我们点击上海,就打印出了 index.js 中的输出日志。get it !!!
上图为官方 Vuex 目录,上面我们只是简单的获取了共享数据,我们再深一步讲解一下核心概念,对上面的代码进行一下重构。
尤大大为我们提供了封装好的一些方法,如上面的 ...mapMutations() ,意思是 mutations 里有一个 chengeCity ,我们将其映射到该组件的一个 chageCity 的方法里,这样就可以直接调用 changeCity 方法并传值了,同样还有如下图:
在 mapState 里有一个 city 属性,将该属性映射到该组件的 city 属性里,这样就不用再写注释的哪些内容了。
当然官方还提供了其他的一些炒鸡好的方法,这里本人就不一一介绍了,大家可以自己看看,学习学习。
OK,今天内容就说到这里了,其实说完感觉自己还是蒙蒙的,需要消化一下,写下来自己想看的时候也可以看一下。
Vuex,状态管理模式的更多相关文章
- Vuex 状态管理模式
Vuex 是一个专为 Vue.js 设计的状态管理模式 vuex解决了组件之间同一状态的共享问题.当我们的应用遇到多个组件共享状态时,会需要: 多个组件依赖于同一状态.传参的方法对于多层嵌套的组件将会 ...
- 了解Vuex状态管理模式的理解强化指南
1 Vuex是什么呢?它是Vue的状态管理模式,在使用vue的时候,需要在vue中各个组件之间传递值是很痛苦的,在vue中我们可以使用vuex来保存我们需要管理的状态值,值一旦被改变,所有引用该值的地 ...
- Vuex状态管理模式的面试题及答案
转载:点击查看原文 1.vuex有哪几种属性? 答:有五种,分别是 State. Getter.Mutation .Action. Module 2.vuex的State特性是? 答: 一.Vuex就 ...
- 关于vuex状态管理模式架构
一. 什么是vuex 集中存储管理所有组件的状态 并以相应的规则保证以一种可预测的方式发生变化. 例子: 实现加减 <p>{{count}} <button @click=" ...
- Vuex状态管理模式
Store:类似容器,包含应用的大部分状态,一个页面只能有一个store,状态存储是响应式的 State : 包含所有应用级别状态的对象 Getters : 在组件内部获取store中状态的函数 Mu ...
- Vuex(一)——vuejs的状态管理模式
一.Vuex是什么? Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式. 它采用集中式存储 管理 应用的所有组件 的 状态,并以 相应的规则 保证 状态以一种 可预测的方式 发生变化. ...
- 理解vuex的状态管理模式架构
理解vuex的状态管理模式架构 一: 什么是vuex?官方解释如下:vuex是一个专为vue.js应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证以一种可预测的 ...
- 五、vue状态管理模式vuex
一.vuex介绍 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. 即data中属性同时有一 ...
- 转 理解vuex -- vue的状态管理模式
转自:https://segmentfault.com/a/1190000012015742 vuex是什么? 先引用vuex官网的话: Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式 ...
- vuex -- vue的状态管理模式
Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. 状态管理模式.集中式存储管理 一听就很高大 ...
随机推荐
- 科学计算工具Numpy
参考学习资料: Python.NumPy和SciPy介绍:http://cs231n.github.io/python-numpy-tutorial NumPy和SciPy快速入门:https://d ...
- Java 读书笔记 (十七) Java 重写(Override)与重载(Overload)
重写(Override) 重写是子类对父类的允许访问的方法的实现过程重新编写,返回值和形参都不能改变,即外壳不变,核心重写. // 如果重写不是相当于重新定义了一个方法?那为什么不直接写,还要exte ...
- NET Core 跨平台执行命令、脚本
一.前言 我们可能会遇到需要在程序中执行一些系统命令,来获取一些信息:或者调用shell脚本..NET Core 目前已经可以跨平台执行,那么它如何跨平台执行命令呢,请看下面的讲解. 二.Proces ...
- Asp.Net WebAPI中Filter过滤器的使用以及执行顺序
转发自:http://www.cnblogs.com/UliiAn/p/5402146.html 在WEB Api中,引入了面向切面编程(AOP)的思想,在某些特定的位置可以插入特定的Filter进行 ...
- C++中memset()函数的作用
memset()函数可以对大内存的分配进行很方便的操作(初始化),所谓“初始化”,当然是指将你定义的变量或申请的空间赋予你所期望的值, 例如语句int i=0;就表明定义了一个变量i,并初始化为0: ...
- const和static readonly的区别
我们都知道,const和static readonly的确很像:通过类名而不是对象名进行访问,在程序中只读等等. 在多数情况下可以混用.二者本质的区别在于,const的值是在编译期间确定的,因此只能在 ...
- Python数据结构应用1——Stack
Reference: Problem Solving with Algorithms and Data Structures, Release 3.0 自学一下数据结构,学完之后刷leetcode,使 ...
- CentOS7 安装Redis Cluster集群
上一篇中已经讲到了如何安装单击版Redis,这一篇我们来说下如何安装Cluster,关于哨兵模式这里我就不写文章安装了,有兴趣的同学可以自己去研究,哨兵模式可以在主从模式下在创建三台机器的哨兵集群监控 ...
- javaWeb使用POI操作Excel
1.为项目添加POI POI官网链接 点进去之后下载(上边的是编译好的类,下边的是源代码) 解压文件夹,把下面三个文件复制到WebComtent>WEB-INF>lib文件夹下 再把这三个 ...
- HTTP协议中GET和POST区别
GET一般用于获取和查询资源信息:POST一般用于更新信息,表示可能修改服务器上资源的请求 GET请求一般是幂等的 GET请求数据会附加在url之后,POST请求数据放到request-body中 G ...