页面应用需要Vuex管理全局/模块的状态,大型单页面组件如果靠事件(events)/属性(props)通讯传值会把各个组件耦合在一起。因
此需要Vuex统一管理,当然如是小型单页面应用,引用Vuex反而会增加复杂度。因此需要衡量引用Vuex增加的收益是否大于成本。
 

快速入门

1. 安装vuex库

  1. cnpm install -S vuex

2. 创建Vuex.Store

  1. import Vue from 'vue'
  2. import Vuex from 'vuex'
  3.  
  4. Vue.use(Vuex);
  5.  
  6. const store = new Vuex.Store({
  7. //组件数据源,单一的state属性
  8. state: {
  9. clickCount: 0
  10. },
  11. //相当于属性,封装获取state
  12. getters: {
  13. getClickCount: state => {
  14. return state.clickCount;
  15. }
  16. },
  17. //封装引起状态变化的方法
  18. mutations: {
  19. increment(state) {
  20. state.clickCount++;
  21. }
  22. },
  23. //类似于 mutation,不同在于actions支持异步,不是直接变更状态,而是提交到mutation
  24. actions: {
  25. increment(context) {
  26. context.commit('increment')
  27. },
  28. async incrementAsync({ commit }) {
  29. return new Promise((resolve, reject) => {
  30. setTimeout(() => {
  31. try {
  32. commit('increment');
  33. resolve(new Date().getTime() + ' 成功执行');
  34. } catch (e) {
  35. reject(e);
  36. }
  37. }, 1000)
  38. });
  39. }
  40. }
  41. });
  42. export default store;

3. Vue实例加入store

  1. new Vue({
  2. router: router,
  3. store: store,
  4. render: h => h(App),
  5. }).$mount('#app')

4. 组件获取store值

  1. <script>
  2. import { mapGetters } from "vuex";
  3.  
  4. export default {
  5. computed: mapGetters({ count: ["getClickCount"] }),
  6. };
  7. </script>

5. 组件触发更新

  1. <script>
  2. export default {
  3. data() {
  4. return { times: 0 };
  5. },
  6. methods: {
  7. increment() {
  8. this.times++;
  9. //分发到action
  10. this.$store.dispatch("incrementAsync");
  11. //提交到mutations
  12. this.$store.commit("increment");
  13. },
  14. },
  15. };
  16. </script>

解析

Vuex 是什么?


  

  Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。Vuex 也集成到 Vue 的官方调试工具devtools extension,提供了诸如零配置的 time-travel 调试、状态快照导入导出等高级调试功能。

State - 数据源


Vuex 使用单一状态树——是的,用一个对象就包含了全部的应用层级状态。

Vue通过store选项,调用Vue.use(Vuex)注入到每一个子组件中(类似路由)

组件获取State

  1. computed: {
  2. count () {
  3. return this.$store.state.count
  4. }
  5. }

或者使用辅助函数mapState

  1. computed: mapState({
  2. // 箭头函数可使代码更简练
  3. count: state => state.count
  4. })

Getter - 数据封装读取(类似属性)


Getter 接受 state 作为其第一个参数

  1. getters: {
  2. doneTodos: state => {
  3. return state.todos.filter(todo => todo.done)
  4. },
  5. getTodoById: (state) => (id) => {
  6. return state.todos.find(todo => todo.id === id)
  7. }
  8. }

通过属性访问

  1. store.getters.doneTodos

通过方法访问

  1. store.getters.getTodoById(2)

Getters 也提供了一个辅助函数方便访问(mapGetters )

Mutation - 进行状态更改的地方


定义Mutation

  1. mutations: {
  2. increment (state, n) {
  3. state.count += n
  4. }
  5. }

组件触发变更

  1. store.commit('increment', 1)

Mutations也提供辅助函数(mapMutations)

  1. import { mapMutations } from 'vuex'
  2.  
  3. export default {
  4. // ...
  5. methods: {
  6. ...mapMutations([
  7. 'increment', // 将 `this.increment()` 映射为 `this.$store.commit('increment')`
  8.  
  9. // `mapMutations` 也支持载荷:
  10. 'incrementBy' // 将 `this.incrementBy(amount)` 映射为 `this.$store.commit('incrementBy', amount)`
  11. ]),
  12. ...mapMutations({
  13. add: 'increment' // 将 `this.add()` 映射为 `this.$store.commit('increment')`
  14. })
  15. }
  16. }

注意事项

  • Mutation 必须是同步函数
  • 最好提前在你的 store 中初始化好所有所需属性。
  • 需要在对象上添加新属性时使用 Vue.set 或 替换旧对象

Action - 对Mutation封装


Action 类似于 mutation,不同在于:

  • Action 提交的是 mutation,而不是直接变更状态。
  • Action 可以包含任意异步操作。

定义Action

  1. actions: {
  2. increment ({ commit }) {
  3. commit('increment')
  4. }
  5. }

组件分发Action

  1. store.dispatch('increment')

支持异步方式分发

  1. actions: {
  2. async incrementAsync({ commit }) {
  3. return new Promise((resolve, reject) => {
  4. setTimeout(() => {
  5. try {
  6. commit('increment');
  7. resolve(new Date().getTime() + ' 成功执行');
  8. } catch (e) {
  9. reject(e);
  10. }
  11. }, 1000)
  12. });
  13. }
  14. }

组件调用异步分发

  1. this.$store.dispatch("incrementAsync").then(
  2. (data) => {
  3. console.log(data);
  4. },
  5. (err) => {
  6. console.log(err);
  7. }
  8. );

参考文章

转发请标明出处:https://www.cnblogs.com/WilsonPan/p/12773090.html

【Vue】状态管理的更多相关文章

  1. Vue状态管理vuex

    前面的话 由于多个状态分散的跨越在许多组件和交互间各个角落,大型应用复杂度也经常逐渐增长.为了解决这个问题,Vue提供了vuex.本文将详细介绍Vue状态管理vuex 引入 当访问数据对象时,一个 V ...

  2. vue状态管理器(用户登录简单应用)

    技术点:通过vue状态管理器,对已经登录的用户显示不同的页面: 一  vue之状态管理器应用 主要用来存储cookie信息 与vue-cookies一起使用 安装:npm install vue-co ...

  3. vuex(vue状态管理)

    vuex(vue状态管理) 1.先安装vuex npm install vuex --save   2.在项目的src目录下创建store目录,并且新建index.js文件,然后创建vuex实例,引入 ...

  4. Vue状态管理之Vuex

    Vuex是专为Vue.js设计的状态管理模式.采用集中存储组件状态它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. 1.首先让我们从一个vue的计数应用开始 ...

  5. Vue状态管理

    1.导出Vuex import Vuex from 'vuex' 2.定义store /*状态管理*/ const store = new Vuex.Store({ state: { headerSh ...

  6. vue - 状态管理器 Vuex

    状态管理 vuex是一个专门为vue.js设计的集中式状态管理架构.状态?我把它理解为在data中的属性需要共享给其他vue组件使用的部分,就叫做状态.简单的说就是data中需要共用的属性.

  7. 五、vue状态管理模式vuex

    一.vuex介绍 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. 即data中属性同时有一 ...

  8. Vue 状态管理

    类flux状态管理的官方实现 由于多个状态分散的跨越在许多组件和交互间的各个角落,大型应用复杂度也经常逐渐增长. 为了解决这个问题,vue提供了vuex:我们有收到elm启发的状态管理库,vuex甚至 ...

  9. vuex vue状态管理

    第一步安装vuex(安装在生产环境) npm install vuex 第二步 src下新建store文件夹 用来专门放状态管理,store文件夹下新建四个js文件 index.js  actions ...

  10. Vue状态管理之Bus

    一般在项目中,状态管理都是使用Vue官方提供的Vuex 当在多组件之间共享状态变得复杂时,使用Vuex,此外也可以使用Bus来进行简单的状态管理 1.1 父组件与子组件之间的通信 vue.config ...

随机推荐

  1. OpenCV-Python 形态学转换 | 十七

    目标 在这一章当中, 我们将学习不同的形态学操作,例如侵蚀,膨胀,开运算,闭运算等. 我们将看到不同的功能,例如:cv.erode(),cv.dilate(), cv.morphologyEx()等. ...

  2. 模型压缩一半,精度几乎无损,TensorFlow推出半精度浮点量化工具包,还有在线Demo...

    近日,TensorFlow模型优化工具包又添一员大将,训练后的半精度浮点量化(float16 quantization)工具. 有了它,就能在几乎不损失模型精度的情况下,将模型压缩至一半大小,还能改善 ...

  3. 使用FME裁剪矢量shapefile文件

  4. Arcgis中制作热力图

    摘要 使用核函数根据点或折线 (polyline) 要素计算每单位面积的量值以将各个点或折线 (polyline) 拟合为光滑锥状表面. 插图

  5. __str_方法和__repr__的区别

    __str__方法和__repr__方法: 官方文档解释: Object.__repr__(self): 由 repr() 内置函数调用以输出一个对象的“官方”字符串表示.如果可能,这应类似一个有效的 ...

  6. [Asp.Net Core] 为什么选择 Blazor Server Side (一) 快速实现图片验证码

    关于Blazor 由于在国内, Blazor一点都不普及, 建议读者翻看我之前写的随笔, 了解Blazor Server Side的特点. 在一段时间内, 我会写一些解说分析型的 "为什么选 ...

  7. Reface.NPI 方法名称解析规则详解

    在上次的文章中简单介绍了 Reface.NPI 中的功能. 本期,将对这方法名称解析规则进行详细的解释和说明, 以便开发者可以完整的使用 Reface.NPI 中的各种功能. 基本规则 方法名称以 I ...

  8. [原创] 关于步科eview人机界面HMI的使用 - HMI做Slave - Modbus RS485通讯

    做测试设备,或者自动化设备常常用到HMI 触摸屏 我有个案子用到了 步科的eview 触摸屏 型号 ET070 我的是单片机主板 控制 HMI显示,通讯用485  MODBUS 单片机板充当 主控 , ...

  9. JQ前端上传图片显示在页面以及发送到后端服务器

    // 单张上传照片     html: <div class="azwoo"></div> <div class="azwot"& ...

  10. Html 慕课园编程练习10-1

    23:10:25 2019-08-14 自己写的这个好丑.... 题目:利用之前我们学过的JavaScript知识,实现选项卡切换的效果. 效果图: (另外 这个动图是怎么插入的 用url就行 复制就 ...