详解Vue中状态管理Vuex


Posted in Javascript onMay 11, 2017

vuex是一个专门为vue.js设计的状态管理模式,并且也可以使用devtools进行调试。

在vuex出现之前,vue里面的状态是属于‘单向数据流'。举个官网的例子:

new Vue({
  // state
  data () {
    return {
      count: 0
    }
  },
  // view
  template: `<div>{{ count }} </div`,
  // actions
  methods: {
    increment () {
      this.count++
    }
  }
})

其中

  1. state是一个数据源
  2. view以声明的方式将state映射到视图
  3. actions 响应在view上的用户输入导致的状态变化

详解Vue中状态管理Vuex

但是解决不了 多个组件共享状态

所以vuex应运而生

详解Vue中状态管理Vuex

简单来说,就是共享的状态用state来存放,用mutations来操作state,但是需要用store.commit来主动式的操作mutations。

下面来单独介绍 state,getters,mutations,actions,modules

State

单一状态树

vuex使用单一状态树,那么就可以用一个对象来包含全部的应用层级状态。所以state就作为数据源。

如何在组件中获得vuex状态?

由于vuex的状态存储是响应式的,所以从store实例中读取状态的最简单方法就是使用计算属性来返回某个状态:

这个是store/state.js中声明的数据源

详解Vue中状态管理Vuex

这个是在组件中进行的引用

详解Vue中状态管理Vuex

不过需要注意的是,在组件中进行引用之前,需要先在入门文件中进行注入
即:

详解Vue中状态管理Vuex

如果不在根实例中注册store选项的话,那么需要在每一个使用state的组件中都要导入。

注册之后,子组件只需要this.$store即可调用vuex。

Getters

有时候我们需要从state中派生出一些状态,比如筛选一组列表,并且这个筛选后的数据是有其他组件要用的。那么我们就需要把这个结果进行包装,形成共享状态。

例如:

computed:{
  doneTodosCount () {
    return this.$store.state.todos.filter(todo => todo.done).length
  }
}

如果说这个length是其他组件用的话,那么如何做呢?

Getter就这样应运而生了。

getters: {
  doneTodosCount: state => {
    return state.todos.filter(todo => todo.done).length
  }
}

Getter 会暴露为store.getters对象

所以很容易在任何组件中使用它:

computed: {
  doneTodosCount () {
    return this.$store.getters.doneTodosCount
  }
}

这是getters.js

详解Vue中状态管理Vuex

这是组件中的引用

详解Vue中状态管理Vuex

Mutations

更改Vuex的store中的状态的唯一方法就是提交mutations。

Vuex中的mutations就像一个事件:每个mutations都有一个字符串的事件类型(type)和一个回调函数(handler)。这个回调函数接受state作为第一个参数。

但是我们又不能直接来调用一个mutations的handler。要唤醒一个mutations handler,需要以相应的type来调用store.commit方法。

这个是在mutations.js中注册的一些的事件

详解Vue中状态管理Vuex

这是在组件中来触发这个事件

详解Vue中状态管理Vuex

当然,我们注意到,mutations中可以传递额外的参数,这个参数就叫做mutations的载荷。
在更多的情况下,载荷应该是一个对象。这样可以包含更多的字段。

但是mutations必须是同步函数。

那我们如何来异步的更新State呢?

答案是: Actions

Actions

Actions类似于 mutations 不同的是:

  1. Actions 提交的是mutations,而不是直接变更状态。
  2. Actions 可以包含任意异步操作。

这也就形成了 actions —— mutations —— state 的过程

Actions函数接受一个与store实例具有相同方法和属性的context对象,因此可以通过context.commit来提交一个mutations。但是如何触发呢?

答案: store.dispatch

详解Vue中状态管理Vuex

详解Vue中状态管理Vuex 

详解Vue中状态管理Vuex

Modules

使用单一状态树,导致应用的所有状态都集中到了一个很大的对象。所以,store对象容易变得臃肿。

为了解决这个问题, Vuex允许咱们把store进行一个功能拆分,分割成不同的模块(module)。每个模块都拥有自己的store,mutations,action,getters。

项目结构

├── index.html
├── main.js
├── api
│  └── ... # 抽取出API请求
├── components
│  ├── App.vue
│  └── ...
└── store
  ├── index.js     # 我们组装模块并导出 store 的地方
  ├── actions.js    # 根级别的 action
  ├── mutations.js   # 根级别的 mutation
  └── modules
    ├── cart.js    # 购物车模块
    └── products.js  # 产品模块

总结:

vuex可以用在单页面上的组件间共享状态。不适合用于跨页面的通信。

另外,对于一些跨页面的数据或者关键性的数据,可以通过localStorage,sessionStorage

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
让广告代码不再影响你的网页加载速度
Jul 07 Javascript
jQuery $.data()方法使用注意细节
Dec 31 Javascript
javascript window.open打开新窗口后无法再次打开该窗口问题的解决方法
Apr 12 Javascript
Node.js刷新session过期时间的实现方法推荐
May 18 Javascript
JavaScript实现复制文章自动添加版权
Aug 02 Javascript
Vuejs第一篇之入门教程详解(单向绑定、双向绑定、列表渲染、响应函数)
Sep 09 Javascript
微信禁止下拉查看URL的处理方法
Sep 28 Javascript
vue采用EventBus实现跨组件通信及注意事项小结
Jun 14 Javascript
解决Vue axios post请求,后台获取不到数据的问题方法
Aug 11 Javascript
node中的session的具体使用
Sep 14 Javascript
浅谈Vue项目骨架屏注入实践
Aug 05 Javascript
基于Node的Axure文件在线预览的实现代码
Aug 28 Javascript
JS简单生成随机数(随机密码)的方法
May 11 #Javascript
ionic实现下拉刷新载入数据功能
May 11 #Javascript
vue2的todolist入门小项目的详细解析
May 11 #Javascript
ionic实现底部分享功能
May 11 #Javascript
学习使用Bootstrap栅格系统
May 11 #Javascript
jQuery实现的简单在线计算器功能
May 11 #jQuery
学习使用Bootstrap页面排版样式
May 11 #Javascript
You might like
一个程序下载的管理程序(三)
2006/10/09 PHP
通过html表格发电子邮件
2006/10/09 PHP
php adodb操作mysql数据库
2009/03/19 PHP
PHP+XML 制作简单的留言本 图文教程
2009/11/02 PHP
PHP调用wsdl文件类型的接口代码分享
2014/11/19 PHP
php插件Xajax使用方法详解
2017/08/31 PHP
PHP实现的最大正向匹配算法示例
2017/12/19 PHP
JS小功能(操作Table--动态添加删除表格及数据)实现代码
2013/11/28 Javascript
jQuery 判断是否包含在数组中Array[]的方法
2016/08/03 Javascript
JS基于面向对象实现的拖拽功能示例
2016/12/20 Javascript
vue实现ajax滚动下拉加载,同时具有loading效果(推荐)
2017/01/11 Javascript
JavaScript中在光标处插入添加文本标签节点的详细方法
2017/03/22 Javascript
深入浅析Vue不同场景下组件间的数据交流
2017/08/15 Javascript
Three.js利用orbit controls插件(轨道控制)控制模型交互动作详解
2017/09/25 Javascript
vue计算属性computed的使用方法示例
2019/03/13 Javascript
微信小程序实现上传word、txt、Excel、PPT等文件功能
2019/05/23 Javascript
vue.js实现只能输入数字的输入框
2019/10/19 Javascript
JS数组方法push()、pop()用法实例分析
2020/01/18 Javascript
node.js实现http服务器与浏览器之间的内容缓存操作示例
2020/02/11 Javascript
[06:43]DAC2018 4.5 SOLO赛 Maybe vs Paparazi
2018/04/06 DOTA
对于Python的Django框架使用的一些实用建议
2015/04/03 Python
Python使用cx_Oracle模块将oracle中数据导出到csv文件的方法
2015/05/16 Python
python实现ping的方法
2015/07/06 Python
Python对字符串实现去重操作的方法示例
2017/08/11 Python
python 产生token及token验证的方法
2018/12/26 Python
对Python3之进程池与回调函数的实例详解
2019/01/22 Python
Django框架设置cookies与获取cookies操作详解
2019/05/27 Python
Python Pandas实现数据分组求平均值并填充nan的示例
2019/07/04 Python
python实现比对美团接口返回数据和本地mongo数据是否一致示例
2019/08/09 Python
PyCharm第一次安装及使用教程
2020/01/08 Python
pycharm实现猜数游戏
2020/12/07 Python
文员自我评价怎么写
2013/09/19 职场文书
大学团支书的自我评价分享
2013/12/14 职场文书
国际贸易毕业生求职信范文
2014/02/21 职场文书
《自己去吧》教学反思
2016/02/16 职场文书
Pytest中skip skipif跳过用例详解
2021/06/30 Python