vuex是什么?

vuex是管理应用程序状态,实现组件间通信的。

为什么使用vuex?

在开发大型应用的项目时,会出现多个视图组件依赖一个同一个状态,来自不同视图的行为需要变更同一个状态。

在遇到以上问题,就要用到vuex,他能把组件的共享状态抽取出来,当做一个全局单例模式进行管理,不管在何处改变状态,都会通知使用该状态的组件作出相应的修改。

最简单的vuex实例

 1 import Vue from 'vue';
2 import Vuex form 'vuex';
3
4 Vue.use(Vuex);
5
6 const store = new Vuex.Store({
7 state: {
8 count: 0
9 },
10 mutations: {
11 increment (state) {
12 state.count++
13 }
14 }
15 })

以上就是一个简单的vuex实例,每一个vuex应用就是一个store,在store中包含组件中的共享状态state和改变状态的方法mutations。

需要注意的是只能通过mutations改变store的state的状态,不能通过store.state.count = 5;直接更改,state相当于对外的只读属性。

使用store.commit方法触发mutations改变state:

1 store.commit('increment'); 2 3 console.log(store.state.count) //

在Vue组件中使用vuex

如果希望Vuex状态更新,相应的Vue组件也得到更新,最简单的方法就是在Vue的computed(计算属性)获取state

// Counter 组件
const Counter = {
template: `<div>{{ count }}</div>`,
computed: {
count () {
return store.state.count;
}
}
}

上面的例子是直接操作全局状态store.state.count,那么每个使用该Vuex的组件都要引入。为了解决这个,Vuex通过store选项,提供了一种机制将状态从根组件注入到每一个子组件中。

 1 // 根组件
2 import Vue from 'vue';
3 import Vuex form 'vuex';
4
5 Vue.use(Vuex);
6 const app = new Vue({
7 el: '#app',
8 store,
9 components: {
10 Counter
11 },
12 template: `
13 <div class="app">
14 <counter></counter>
15 </div>
16 `
17 })

通过这种注入机制,就能在子组件Counter通过this.$store访问:

1 // Counter 组件
2 const Counter = {
3 template: `<div>{{ count }}</div>`,
4 computed: {
5 count () {
6 return this.$store.state.count
7 }
8 }
9 }

mapState函数

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

这样通过count计算属性获取同名state.count属性,是不是显得太重复了,我们可以使用mapState函数简化这个过程。

1 import { mapState } from 'vuex';
2
3 export default {
4 computed: mapState ({
5 count: state => state.count,
6 countAlias: 'count', // 别名 `count` 等价于 state => state.count
7 })
8 }

简便方法为:

computed: mapState([

  // 映射 this.count 为 store.state.count

  'count'
])

Getters对象:

如果我们需要对state对象进行做处理计算,如下:

1 computed: {
2
3 doneTodosCount () {
4
5 return this.$store.state.todos.filter(todo => todo.done).length
6
7 }
8
9 }

如果多个组件都要进行这样的处理,那么就要在多个组件中复制该函数。这样是很没有效率的事情,当这个处理过程更改了,还有在多个组件中进行同样的更改,这就更加不易于维护。

Vuex中getters对象,可以方便我们在store中做集中的处理。Getters接受state作为第一个参数:

 1 const store = new Vuex.Store({
2 state: {
3 todos: [
4 { id: 1, text: '...', done: true },
5 { id: 2, text: '...', done: false }
6 ]
7 },
8 getters: {
9 doneTodos: state => {
10 return state.todos.filter(todo => todo.done)
11 }
12 }
13 })

在Vue中通过store.getters对象调用。

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

Getter也可以接受其他getters作为第二个参数:

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

mapGetters辅助函数

与mapState类似,都能达到简化代码的效果。mapGetters辅助函数仅仅是将store中的getters映射到局部计算属性:

 1 import { mapGetters } from 'vuex'
2
3 export default {
4 // ...
5 computed: {
6 // 使用对象展开运算符将 getters 混入 computed 对象中
7 ...mapGetters([
8 'doneTodosCount',
9 'anotherGetter',
10 // ...
11 ])
12 }
13 }

上面也可写成:

1 computed: mapGetters([
2 'doneTodosCount',
3 'anotherGetter',
4 // ...
5 ])

所以在Vue的computed计算属性中会存在两种辅助函数:

1 import { mapState, mapGetters } form 'vuex';
2
3 export default {
4 // ...
5 computed: {
6 mapState({ ... }),
7 mapGetter({ ... })
8 }
9 }

Mutations

之前也说过了,更改Vuex的store中的状态的唯一方法就是mutations。

每一个mutation都有一个事件类型type和一个回调函数handler。

 1 const store = new Vuex.Store({
2 state: {
3 count: 1
4 },
5 mutations: {
6 increment (state) {
7 // 变更状态
8 state.count++
9 }
10 }
11 })

调用mutation,需要通过store.commit方法调用:

store.commit('increment')

Payload 提交载荷

也可以向store.commit传入第二参数,也就是mutation的payload:

1 mutaion: {
2 increment (state, n) {
3 state.count += n;
4 }
5 }
6
7 store.commit('increment', 10);

单单传入一个n,可能并不能满足我们的业务需要,这时候我们可以选择传入一个payload对象:

 1 mutation: {
2 increment (state, payload) {
3 state.totalPrice += payload.price + payload.count;
4 }
5 }
6
7 store.commit({
8 type: 'increment',
9 price: 10,
10 count: 8
11 })

mapMutations函数

mutations也有映射函数mapMutations,帮助我们简化代码,使用mapMutations辅助函数将组件中的methods映射为store.commit调用。

 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 add: 'increment' // 映射 this.add() 为 this.$store.commit('increment')
11 })
12 }
13 }

Mutations必须是同步函数。

如果需要异步操作,Mutations就不能满足我们需求了,这时候我们就需要Actions了。

vuex相关笔记的更多相关文章

  1. HTTPS证书申请相关笔记

    申请免费的HTTPS证书相关资料 参考资料: HTTPS 检测 苹果ATS检测 什么是ECC证书? 渠道2: Let's Encrypt 优点 缺点 Let's Encrypt 的是否支持非80,44 ...

  2. JNI相关笔记 [TOC]

    JNI相关笔记 目录 JNI相关笔记 1 生成native code所需要的头文件 2 JNI提供的一些函数和方法 3 局部引用,全局引用,全局弱引用. 4 异常 1 生成native code所需要 ...

  3. Hadoop相关笔记

    一.            Zookeeper( 分布式协调服务框架 ) 1.    Zookeeper概述和集群搭建: (1)       Zookeeper概述: Zookeeper 是一个分布式 ...

  4. vuex原理笔记

    本文总结自: https://tech.meituan.com/vuex-code-analysis.html, 将要点提炼为笔记,以便不时之需,安不忘危. 核心可分为两部分: 1.vue.use(V ...

  5. redis相关笔记(二.集群配置及使用)

    redis笔记一 redis笔记二 redis笔记三 1.配置:在原redis-sentinel文件夹中添加{8337,8338,8339,8340}文件夹,且复制原8333中的配置 在上述8333配 ...

  6. redis相关笔记(三.redis设计与实现(笔记))

    redis笔记一 redis笔记二 redis笔记三 1.数据结构 1.1.简单动态字符串: 其属性有int len:长度,int free:空闲长度,char[] bur:字符数组(内容) 获取字符 ...

  7. vuex知识笔记,及与localStorage和sessionStorage的区别

    菜单快捷导航 Vuex是什么东东,有什么应用场景?localStorage和sessionStorage能否替代它? Vuex知识点State.Getter.Mutaion.Action Vuex模块 ...

  8. Windows API 进程相关笔记

    0. 前言 最近做了一个进程信息相关的项目,整理了一下自己做项目时的笔记,分享给大家 1. 相关概念 1.1 HANDLE 概念 HANDLE(句柄)是Windows操作系统中的一个概念. 在Wind ...

  9. PHP相关笔记

    扩展包(相关链接):https://packagist.org/: 插件postman主要应用于web开发时get.post请求时查看其响应:

  10. lua相关笔记

    --[[ xpcall( 调用函数, 错误捕获函数 ); lua提供了xpcall来捕获异常 xpcall接受两个参数:调用函数.错误处理函数. 当错误发生时,Lua会在栈释放以前调用错误处理函数,因 ...

随机推荐

  1. 认识jmeter(一)

    1.官网下载: https://jmeter.apache.org/download_jmeter.cgi 下载后解压: 2.安装 免安装,解压后,bin目录下双击jmeter.bat,会直接打开 会 ...

  2. vxe-table 合并单元格

    <vxe-table @cell-click="handleClickCell" :span-method="spanMethods" //自动合并单元格 ...

  3. python机器学习——PCA降维算法

    背景与原理: PCA(主成分分析)是将一个数据的特征数量减少的同时尽可能保留最多信息的方法.所谓降维,就是在说对于一个$n$维数据集,其可以看做一个$n$维空间中的点集(或者向量集),而我们要把这个向 ...

  4. Windows开机自动运行.bat文件

    方法/步骤:一:打开我的电脑, 在地址栏输入:"C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup" 二,把自 ...

  5. #硬件 #资讯 #科普 #短报 SSD价格跳水根本停不下来!不断刷出新低

    一份来自日本的统计显示,10~12月的初步统计显示,PC市场的指标产品中,256GB TLC颗粒SSD价格再次下跌2美元,现在只有29.5美元.这已经是该指标产品连续5个季度下跌,创下史上心底记录,同 ...

  6. function | ECOS

    用于优化线性或二阶锥的自对偶齐次嵌入内点方法. 不支持 SDP 锥体! [x,y,info,s,z] = ecos(c,G,h,dims,A,b) 求解一对原始和双锥程序 最小化 c'x 服从 Gx ...

  7. k8s配置拉取镜像密钥

    一.部署步骤 1.创建阿里云镜像仓库 2.创建Secret绑定镜像仓库账号 3.创建Deployment绑定Secret 二.创建阿里云镜像仓库 1.进入阿里云容器镜像服务,创建个人版实例 2.设置登 ...

  8. 点击按钮触发div颜色改变的几种写法

    目录 JavaScript 行内事件 onclick绑定 关于选取元素 关于改变颜色 addEventListener jQuery 获取元素 绑定事件 设置样式 css() 添加class Vue ...

  9. opengl编程天天踩的坑

    1. VBO 的 target 是 GL_ARRAY_BUFFER 不是  GL_VERTEX_BUFFER 2. glUniform()用来给uniform传变量 别用成 glProgramUnif ...

  10. 第一天1h

    //摄氏度和华氏度之间的换算//20211120//ZhangWenjing#include<stdio.h>int main(void){ int f = 0; int c = 0; s ...