详解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 相关文章推荐
用js模拟JQuery的show与hide动画函数代码
Sep 20 Javascript
Javascript前端UI框架Kit使用指南之kitjs事件管理
Nov 28 Javascript
jQuery实现带滚动线条导航效果的方法
Jan 30 Javascript
jQuery实现仿腾讯微博滑出效果报告每日天气的方法
May 11 Javascript
AngularJS初始化静态模板详解
Jan 14 Javascript
JavaScript实现点击单元格改变背景色的方法
Feb 12 Javascript
基于iscroll.js实现下拉刷新和上拉加载效果
Nov 28 Javascript
详解微信第三方小程序代开发
Jun 23 Javascript
vue-resouce设置请求头的三种方法
Sep 12 Javascript
基于IView中on-change属性的使用详解
Mar 15 Javascript
node puppeteer(headless chrome)实现网站登录
May 09 Javascript
利用 JavaScript 构建命令行应用
Nov 17 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
聊天室php&amp;mysql(四)
2006/10/09 PHP
php Smarty date_format [格式化时间日期]
2010/03/15 PHP
PHP获取浏览器信息类和客户端地理位置的2个方法
2014/04/24 PHP
PHP的文件操作与算法实现的面试题示例
2015/08/10 PHP
PHP基于简单递归函数求一个数阶乘的方法示例
2017/04/26 PHP
在Laravel 的 Blade 模版中实现定义变量
2019/10/14 PHP
『jQuery』取指定url格式及分割函数应用
2013/04/22 Javascript
ECharts仪表盘实例代码(附源码下载)
2016/02/18 Javascript
微信小程序 简单教程实例详解
2017/01/13 Javascript
JS对象与JSON互转换、New Function()、 forEach()、DOM事件流等js开发基础小结
2017/08/10 Javascript
ES6 Symbol数据类型的应用实例分析
2019/06/26 Javascript
js实现星星海特效的示例
2020/09/28 Javascript
[47:43]完美世界DOTA2联赛PWL S3 Magama vs GXR 第二场 12.19
2020/12/24 DOTA
python实现感知器算法详解
2017/12/19 Python
使用Python的toolz库开始函数式编程的方法
2018/11/15 Python
python石头剪刀布小游戏(三局两胜制)
2021/01/20 Python
django云端留言板实例详解
2019/07/22 Python
对Python _取log的几种方式小结
2019/07/25 Python
Python使用selenium + headless chrome获取网页内容的方法示例
2019/10/16 Python
python实现简单日志记录库glog的使用
2019/12/13 Python
Python matplotlib实时画图案例
2020/04/23 Python
解决echarts中饼图标签重叠的问题
2020/05/16 Python
让IE6、IE7、IE8支持CSS3的脚本
2010/07/20 HTML / CSS
详解如何在登录过期后跳出Ifram框架
2020/09/10 HTML / CSS
Jabra捷波朗美国官网:用于办公、车载和运动的无线蓝牙耳麦
2017/02/01 全球购物
什么是虚拟内存?虚拟内存有什么优势?
2012/02/19 面试题
瀑布模型都有哪些优缺点
2014/06/23 面试题
十佳青年个人事迹材料
2014/01/28 职场文书
销售主管岗位职责
2014/02/08 职场文书
文明城市创建标语
2014/06/16 职场文书
道德模范事迹材料
2014/12/20 职场文书
2016暑期师德培训心得体会
2016/01/09 职场文书
24句精辟的现实社会语录,句句扎心,道尽人性
2019/08/29 职场文书
微软PC Health Check电脑健康状况检查应用下载(Win11配置检测工具)
2021/06/26 数码科技
漫画「请问您今天要来点兔子吗?」最新杂志彩页公开
2022/03/24 日漫
Windows server 2012搭建FTP服务器
2022/04/29 Servers