vuex 概述


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

利用 vuex 集中管理数据,可以实现组件之间高效的数据共享,提高开发效率。并且,在 vuex 中存储的数据是响应式的,保证了数据与页面的同步。

在 vue 项目中使用 vuex


> 安装 vuex 依赖包

npm install vuex --save

> 导入 vuex 创建 store 并向外共享

新建 src / store / index.js 文件,写入如下代码:

import Vue from 'vue'
import Vuex from 'vuex'Vue.use(Vuex)export default new Vuex.Store({state: {},mutations: {},actions: {},modules: {}
})

> 将 store 对象挂载到 vue 实例中

在 main.js 文件中挂载 store 对象

import Vue from 'vue'
import App from './App.vue'
import store from './store'Vue.config.productionTip = falsenew Vue({store,render: h => h(App)
}).$mount('#app')

vuex 核心概念


vuex 核心概念有以下几种,下面将逐一介绍:

> State

state 提供唯一的公共数据源,所有共享数据都要统一存放到 store 对象的 state 中存储。

import Vue from 'vue'
import Vuex from 'vuex'Vue.use(Vuex)export default new Vuex.Store({state: {count: 0}
})
  • 组件中访问 state 数据第一种方式

利用 this.$store.state 直接调用

<template><div><h3>当前最新的 count 值为:{{ this.$store.state.count }}</h3></div>
</template>
  • 组件中访问 state 数据第二种方式

从 vuex 中按需导入 mapState 函数,将全局数据映射为当前组件的计算属性

<template><div><h3>当前最新的 count 值为:{{ count }}</h3></div>
</template><script>
import { mapState } from 'vuex'export default {data() {return {}},computed: {...mapState(['count'])}
}
</script>

> Getter

getter 用于对 store 中的数据进行加工处理形成新数据,可以将 getter 理解为 store 的计算属性。

// src/store/index.js
import Vue from 'vue'
import Vuex from 'vuex'Vue.use(Vuex)export default new Vuex.Store({state: {count: 0},getters: {showNum(state) {return `当前最新数量: ${state.count} `}},
})
  • 组件中使用 getters 的第一种方式

在组件中,可以利用 this.$store.getters.名称 来直接使用。

<template><div><h3>{{ this.$store.getters.showNum }}</h3></div>
</template>
  • 组件中使用 getters 的第二种方式

在组件中,导入 mapGetters 函数,将指定的 getters 映射为当前组件的计算属性。

<template><div><h3>{{ showNum }}</h3></div>
</template><script>
import { mapState, mapGetters } from 'vuex'export default {data() {return {}},computed: {...mapState(['count']),...mapGetters(['showNum'])}
}
</script>

> Mutation

mutations 中定义用于变更 state 数据的函数。在 vuex 中,只能通过 mutation 变更 store 中的数据,不可以直接操作 store 中数据,利于集中监控数据的变化。

mutation 对象中函数的第一个参数为 state ,也可以有第二个参数 payload 即自定义参数。

需要注意:mutations 中不能定义异步函数(如 setTimeout ),必须是同步函数。

// src/store/index.js
import Vue from 'vue'
import Vuex from 'vuex'Vue.use(Vuex)export default new Vuex.Store({state: {count: 0},mutations: {add(state) {state.count++},addN(state, step) {state.count += step}}
})
  • 组件中使用 mutations 对象方法第一种方式

在组件中,需要使用 this.$store.commit 调用 mutations 中对象方法函数。

<template><div><h3>当前最新的 count 值为:{{ $store.state.count }}</h3><button @click="btnHandler1">+1</button><button @click="btnHandler2">+N</button></div>
</template><script>
export default {data() {return {}},methods: {btnHandler1() {this.$store.commit('add')},btnHandler2() {this.$store.commit('addN', 3)}}
}
</script>
  • 触发 mutations 中函数的第二种方式

从 vuex 中按需导入 mapMutations 函数,将指定的 mutations 中函数映射为当前组件的 methods 函数。

<template><div><h3>当前最新的 count 值为:{{ count }}</h3><button @click="sub">-1</button><button @click="subN(3)">-N</button></div>
</template><script>
import { mapState, mapMutations } from 'vuex'export default {data() {return {}},computed: {...mapState(['count'])},methods: {...mapMutations(['sub', 'subN'])}
}
</script>

> Action

actions 对象用于处理异步任务。在 action 中通过触发 mutations 中函数的方式间接变更数据。

actions 函数接受一个与 store 实例具有相同方法和属性的 context 对象,因此可以使用 context.commit 调用 mutations 对象的函数来变更数据。

// src/store/index.js
import Vue from 'vue'
import Vuex from 'vuex'Vue.use(Vuex)export default new Vuex.Store({state: {count: 0},mutations: {add(state) {state.count++}},actions: {addAsync(context) {setTimeout(() => {context.commit('add')}, 1000)}}
})
  • 组件中使用 actions 对象方法的第一种方式

在组件中,actions 对象中方法函数需要使用 this.$store.dispatch 调用。

<template><div><h3>当前最新的 count 值为:{{ $store.state.count }}</h3><button @click="btnHandler">+1 Async</button></div>
</template><script>
export default {data() {return {}},methods: {// 异步自增btnHandler() {this.$store.dispatch('addAsync')}}
}
</script>
  • 组件中 actions 对象方法的第二种方式

在组件中,从 vuex 中按需导入 mapActions 函数,将指定的 actions 中函数映射为当前组件的 methods 函数。

<template><div><h3>当前最新的 count 值为:{{ count }}</h3><button @click="addAsync">+1 Async</button></div>
</template><script>
import { mapState, mapActions } from 'vuex'export default {data() {return {}},computed: {...mapState(['count'])},methods: {...mapActions(['addAsync'])}
}
</script>

> Module

由于我们将所有的内容都写在了 src/store/index.js 文件中,当应用变得非常复杂时,store 对象就有可能变得相当臃肿。

为了解决以上问题,vuex 允许我们将 store 分割成模块(module)。每个模块拥有自己的 state、mutation、action、getter,甚至是可以嵌套子模块——从上至下进行同样方式的分割:

const moduleA = {state: () => ({ ... }),mutations: { ... },actions: { ... },getters: { ... }
}const moduleB = {state: () => ({ ... }),mutations: { ... },actions: { ... }
}const store = new Vuex.Store({modules: {a: moduleA,b: moduleB}
})

具体来说

我们可以将之前所有在 store 中进行加法相关的 state、mutations、actions、getters 单独封装为一个子模块 moduleAdd,将其单独拎出来。

除此之外,还可将子模块的 state、mutations、actions、getters 再细分为单独的文件。

// src/store/index.js
import Vue from 'vue'
import Vuex from 'vuex'import moduleAdd from './moduleAdd/index.js'Vue.use(Vuex)export default new Vuex.Store({modules: {moduleAdd}
})
  • 子模块 moduleAdd 如下

  • 命名空间

默认情况下,模块内部的 action、mutation 和 getter 是注册在全局命名空间的,这样使得多个模块能够对同一 mutation 或 action 作出响应。如果希望你的模块具有更高的封装度和复用性,此时就用到了命名空间这个概念。

通过在模块中添加 namespaced: true 的方式使其成为带命名空间的模块。当模块被注册后,它的所有 getter、action 及 mutation 都会自动根据模块注册的路径调整命名。

组件中引入带命名空间的数据的各种方式、命名空间详细介绍可阅读此文 >> Vuex 命名空间 namespaced 介绍

<template><div><h3>{{ showNum }}</h3><button @click="add">+1</button><button @click="addN(3)">+N</button></div>
</template><script>
import { mapMutations, mapGetters } from 'vuex'export default {computed: {...mapGetters({ showNum: 'moduleAdd/showNum' })},methods: {...mapMutations({add: 'moduleAdd/add',addN: 'moduleAdd/addN'})}
}
</script>

参考


  • Vuex 官方文档
  • Vuex 命名空间 namespaced 介绍

初学 vuex 的一些总结,如有错误希望大家可以指出

「Vue」vuex 的使用相关推荐

  1. Android逆向之旅---静态方式分析破解视频编辑应用「Vue」水印问题

    一.故事背景 现在很多人都喜欢玩文艺,特别是我身边的UI们,拍照一分钟修图半小时.就是为了能够在朋友圈显得逼格高,不过的确是挺好看的,修图的软件太多了就不多说了,而且一般都没有水印啥的.相比较短视频有 ...

  2. 「Vue」vue生命周期

    Vue的生命周期 beforeCreate---created---beforeMount---mounted---(beforeupdate---updated :数据有更新时才会执行)---bef ...

  3. 「VUE」前端实现真正的无感打印(可打印dom、file、url) CSDN首发

    前言 功能 说到前面 准备工作 开始使用 vue: 获取默认打印机 获取打印机列表 打印DOM 打印url(目前仅支持pdf) 唤醒打印服务(针对不小心关闭打印服或未开启打印服务) 检测用户是否安装打 ...

  4. vue v-html图片chubu,「Vue」v-html生成的图片大小无法调整的解决办法

    SQL 映射的 XML 文件 MyBatis 真正的力量是在映射语句中.这里是奇迹发生的地方. 对于所有的力量, SQL映射的 XML 文件是相当的简单.当然如果你将它们和对等功能的 JDBC 代码来 ...

  5. js文件里获取路由 vue_「如何优雅的使用Vue?」不可不知的Vue实战技巧

    作者: CHICAGO 转发连接:https://juejin.im/post/5e475829f265da57444ab10f 前言 在大家都会用vue的时代,我们又如何去区别是新手小白还是资深vu ...

  6. chrome vue插件_「Vue学习记录一」开发环境准备

    1.开发工具 - VS Code ❝ 选择 VS Code 是因为这是一款很容易上手的工具,在 VS Code 中找到的每个功能都完成一项出色的工作,构建了一些简单的功能集,包括语法高亮.智能补全.集 ...

  7. .net vue漂亮登录界面_基于 electron-vue 开发的音乐播放器「实践」

    作者:XiaoTuGou 转发链接:https://github.com/SmallRuralDog 前言 基于 electron-vue 开发的音乐播放器,界面模仿QQ音乐. 技术栈electron ...

  8. 「Vue实战」武装你的前端项目

    1. 接口模块处理 1.1 axios二次封装 很基础的部分,已封装好的请跳过.这里的封装是依据 JWT import axios from 'axios'import router from '.. ...

  9. 「Vue 学习笔记 1」Vue 项目快速搭建,初始项目各个文件夹作用介绍和启动代码执行流程分析

    「Vue 学习笔记 1」Vue 项目快速搭建,初始项目各个文件夹作用介绍和启动代码执行流程分析 前言 一.我的开发环境 二.使用 Vue CLI (Vue 脚手架)快速搭建项目 三.初始项目的目录结构 ...

最新文章

  1. OpenCV中基于LBP算法的人脸检测测试代码
  2. 小程序 页面禁止左右上下滑动
  3. 2015 German Collegiate Programming Contest (GCPC 15)
  4. PHP5.6的安装与配置(win7)
  5. ASP.NET实现多域名多网站共享Session值
  6. python计数循环,python - Python中的密码求解器循环计数 - SO中文参考 - www.soinside.com...
  7. MATLAB实现三边定位
  8. TeamTalk编译和部署(一)
  9. Pytorch并行处理机制
  10. 联网监管与手册报关的区别
  11. 将硬盘转换成GPT分区格式
  12. 浙师大 计算机科学技术导论,计算机科学技术导论
  13. 苹果为小学生推出编程指南
  14. 缩略图方式下, 资源管理器,不能显示文件名
  15. 2020上半年总结:纸上得来终觉浅,绝知此事要躬行
  16. 图计算思维与实践 (二)核心概念与算法
  17. 用户体验——以用户为中心的Web设计_Chapter3. 战略层:网站目标和用户需求
  18. VB.NET入门(一)
  19. Python自动化操作pywinauto
  20. Dicom文件支持中文字符

热门文章

  1. 非线编辑软件 linux,Flowblade 2.0 发布,非线性开源Linux视频编辑器
  2. 聊天机器人-AIML人工智能标记语言
  3. java md5 16位解密_Java实现MD5(32/16位)大小写加密
  4. 1900-01-01t00:00:00+08:00 java_日期格式转换 java 2016-09-03T00:00:00.000+08:00
  5. 静态资源详解和帮助文档的使用
  6. Jupyter修改默认文件保存路径
  7. Oracle的Rman差异增量备份
  8. centeros7安装mysql
  9. Anaconda jupyter-notebook 添加kernel
  10. PHP学习(语言结构语句)