详解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 相关文章推荐
JavaScript面象对象设计
Apr 28 Javascript
javascript设计模式 接口介绍
Jul 24 Javascript
jquery删除数据记录时的弹出提示效果
May 06 Javascript
jquery.uploadify插件在chrome浏览器频繁崩溃解决方法
Mar 01 Javascript
前端自动化开发之Node.js的环境搭建教程
Apr 01 Javascript
微信小程序实现给循环列表添加点击样式实例
Apr 26 Javascript
Vue通过URL传参如何控制全局console.log的开关详解
Dec 07 Javascript
Electron 调用命令行(cmd)
Sep 23 Javascript
浅谈Vue.set实际上是什么
Oct 17 Javascript
分享Angular http interceptors 拦截器使用(推荐)
Nov 10 Javascript
JS实现小米轮播图
Sep 21 Javascript
利用js canvas实现五子棋游戏
Oct 11 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+ajax实现无刷新文件上传功能(ajaxuploadfile)
2018/02/11 PHP
PHP实现用户登录的案例代码
2018/05/10 PHP
Javascript学习笔记5 类和对象
2010/01/11 Javascript
用JS写的一个TableView控件代码
2010/01/23 Javascript
javascript获得网页窗口实际大小的示例代码
2013/09/21 Javascript
详谈JavaScript内存泄漏
2014/11/14 Javascript
jQuery中change事件用法实例
2014/12/26 Javascript
jQuery实现的产品自动360度旋转展示特效源码分享
2015/08/21 Javascript
基于HTML+CSS,jQuery编写的简易计算器后续(添加了键盘监听)
2016/01/05 Javascript
基于canvas实现的钟摆效果完整实例
2016/01/26 Javascript
值得分享和收藏的Bootstrap学习教程
2016/05/12 Javascript
浅析js绑定事件的常用方法
2016/05/15 Javascript
JavaScript仿网易选项卡制作代码
2016/10/06 Javascript
vue2.0数据双向绑定与表单bootstrap+vue组件
2017/02/27 Javascript
JavaScript实现邮箱后缀提示功能的示例代码
2018/12/13 Javascript
vue.js的vue-cli脚手架中使用百度地图API的实例
2019/01/21 Javascript
js图片无缝滚动插件使用详解
2020/05/26 Javascript
ES6新增的数组知识实例小结
2020/05/23 Javascript
微信小程序换肤功能实现代码(思路详解)
2020/08/25 Javascript
微信小程序实现锚点跳转
2020/11/23 Javascript
vue-cli4.0多环境配置变量与模式详解
2020/12/30 Vue.js
[27:39]Ti4 循环赛第二日 LGD vs Fnatic
2014/07/11 DOTA
详细解读Python的web.py框架下的application.py模块
2015/05/02 Python
python 多线程实现检测服务器在线情况
2015/11/25 Python
Python实现信用卡系统(支持购物、转账、存取钱)
2016/06/24 Python
PyQt5 实现给窗口设置背景图片的方法
2019/06/13 Python
详解Python中打乱列表顺序random.shuffle()的使用方法
2019/11/11 Python
django中的数据库迁移的实现
2020/03/16 Python
Python 实现将numpy中的nan和inf,nan替换成对应的均值
2020/06/08 Python
Python爬虫实现HTTP网络请求多种实现方式
2020/06/19 Python
Python实现图片查找轮廓、多边形拟合、最小外接矩形代码
2020/07/14 Python
基于python实现复制文件并重命名
2020/09/16 Python
娱乐地球:Entertainment Earth
2020/01/08 全球购物
广场舞大赛策划方案
2014/05/31 职场文书
2016年学习贯彻十八届五中全会精神心得体会
2016/01/05 职场文书
《蜜蜂引路》教学反思
2016/02/22 职场文书