Vue 系列之 Vuex 数据流向

栏目: 前端 · 发布时间: 6年前

内容简介:摘要来自摩拜前端团队的  bing本文主要了解 Vuex 的整个数据流向及各模块之间的触发使用。

摘要

来自摩拜前端团队的  bing

本文主要了解 Vuex 的整个数据流向及各模块之间的触发使用。

欢迎留言并分享 Vuex 使用中遇到的坑,欢迎批评指正。其他前端干货敬请关注我司微信公众号 - 《前端新视野》。

日常开发中一般我们都会接触到 组件化 的概念,将一些通用的模块封装成组件去复用,提高开发效率,组件中 父子 组件、 兄弟 组件、 跨级 组件等组件 之间的 通信 是我们必须要去关注的。

但当我们的组件非常复杂,嵌套层级很深的时候:

  • 父组件给子组件不得不将 props 一层一层的传递下去

  • 子组件同样也要利用 $emit 事件机制层层注册

数据最终变的难以维护

这时我们可以引入 Vuex 来管理 状态(数据)

一、Vuex 是什么

Vuex 是一个专为 Vue.js 应用程序开发的 状态管理 模式。

它采用 集中式 存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。

通俗一点的话说就是:

Vue 应用中 统一管理数据 的地方。

Vuex 的特点是:

把数据单独隔离 -- 意味着它有自己的生态系统,有 固定的输入输出

图一是整个 Vuex 的数据流向及触发过程示意:

Vue 系列之 Vuex 数据流向

图一

其中:

  • Actions 作为数据的输入

  • State 作为数据的输出

二、数据流向

2.1 Components 收集用户反馈触发 Actions

图一中 Actions 是负责处理从 Vue Components 接收到的 用户行为 的模块。

  • 调用 其他 action  

  • 发送 异步 请求以及 提交 (commit)  mutations

都是在这个模块中操作。

2.1.1 定义 Action

要点:

  1. action 函数接受一个与 store 实例具有相同方法和属性的 context 对象;

  2. 因为 action  通常是 异步 的,可以结合 Promise 来组合多个 action 来处理复杂的异步流程。

   // store/index.js

这里: 注意一下参数的不同

context 里面有:

  • dispatch -- 调用其他 action

  • commit -- 调用 mutation

2.1.2 触发 Action

定义好的 action 怎样在 Component 中触发呢?

="button" class="btn btn-success btn-lg btn-block"

最基本的触发方式:

this.$store.dispatch("addTodo", todo);

方式二和三种中使用 '...'  扩展运算符将 mapActions  返回值混入到 methods 中。

mapActions   是 Vuex 提供的辅助函数,可以有效精简我们的代码。

mapActions 可以接受一个数组或一个对象

在使用 module 时,可以接受 module 路径跟简写对象,暂不展开,详情请阅读官方文档https://vuex.vuejs.org/zh/guide/modules.html

2.2 Actions 提交(commit)Mutations,请求修改 State

2.2.1 定义 Mutation

要点:

  1. mutation 默认接受当前 state 为第一个参数

  2. mutation 修改 state 的唯一途径 ,并且是 同步 执行,区别于 action  ;

  3. 最好提前在你的 Store 中初始化好所有所需属性;

  4. 当需要在对象上添加新属性时,你应该使用 Vue.set(obj, 'newProp', 123) ,使增加的新属性在 Vue 应用中是 响应式 的;

  5. 官方推荐使用 大写常量 来定义 mutation ,统一管理,一目了然。

2.2.2 触发 Mutation

注意: 1、 Component 中触发一些简单的 同步 操作,可 直接触发(commit) mutation

2、若需要 异步操作 的则需要在 action 中触发(commit) mutation

方式一:在组件的事件中直接调用

this.$store.commit("DEL_TODO",index)

方式二:异步操作在 action 中完成

2.3 Mutation 同步修改 State

2.4 State 改变后重新渲染(Render)Components

2.4.1 使用 State

Component 中是怎样绑定  state 的值呢?

2.4.2 使用 Getter

如果想要从 Store 中的 state衍生出一些状态 ,可以使用 getter ,相当于 state计算属性

可以在实例化的时候和 state 并行,定义一个 getters

注意: getter count 的第二个参数也可以关注一下

组件 中像下面这样调用:

$store.getters 里面获取

至此,一个完整的数据流向就闭环了。

总结

本文主要介绍了从用户触发开始到再次渲染更新组件结束过程中, Vuex 的数据流向及各模块的使用方式,希望对初学 Vuex 或 打算使用 Vuex 管理数据的朋友有所帮助,有任何问题或讲述不清的地方,请留言相告。

最后来个硬广:

:star2: 我们出书啦,欢迎点击阅读原文试读和购买:point_down:

Vue 系列之 Vuex 数据流向


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

文明之光

文明之光

吴军 / 人民邮电出版社 / 2014-12 / 177元

吴军博士从对人类文明产生了重大影响却在过去被忽略的历史故事里,选择了有意思的几十个片段特写,以人文和科技、经济结合的视角,有机地展现了一幅人类文明发展的宏大画卷。 《文明之光》系列大致按照从地球诞生到近现代的顺序讲述了人类文明进程的各个阶段,每个章节相对独立,全景式地展现了人类文明发展历程中的多样性。《文明之光》系列首册讲述从人类文明开始到近代大航海这一历史阶段,共八个专题。第二册讲述了从近......一起来看看 《文明之光》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器