【VUE】8.VUEX核心概念
1. Vuex核心概念主要如下
- state : 存储共享数据
- mutation: 变更store中的数据,方法,不能异步操作
- action: 异步操作,通过触发mutation变更数据
- getter: 对Store中数据重新加工,但是不改变原来的数据
2. State
1. 概念
提供唯一公共数据源的地方,所有共享数据都要统一放到Store中的state中进行存储
2. step
1. 创建3个组件 新增Add.vue, 减法Sub.vue, 主要组件Main.vue
Add.vue
<template>
<div>
<h3>这是Add组件:</h3>
<button>+1</button>
</div>
</template> <script>
export default { }
</script>
Sub.vue
<template>
<div>
<h3>这是Sub组件:</h3>
<button>-1</button>
</div>
</template> <script>
export default { }
</script>
Main.vue 先导入Add.vue Sub.vue, 然后注册对应的组件(路由注册省略)
<template>
<div>
<my-add></my-add>
<my-sub></my-sub>
</div>
</template> <script>
// 导入
import Add from './Add.vue'
import Sub from './Sub.vue' export default {
data() {
return {}
},
// 注册
components: {
'my-add': Add,
'my-sub': Sub
}
}
</script>
2. 访问http://127.0.0.1:8080/#/main

3. 这时候我们想Add.vue Sub.vue想访问同样的数据如何操作呢
4. store.js -> state 创建共享数据
export default new Vuex.Store({
state: {
count:0
},
mutations: {
},
actions: {
}
})
5.访问共享数据方式一: 通过this.$store.state.全局数据名
6. Add.vue ->
<template>
<div>
<h3>这是Add组件:{{this.$store.state.count}}</h3>
<button>+1</button>
</div>
</template> <script>
export default { }
</script>
7.效果显示

8. 访问共享数据方式二: 通过mapState函数访问全局数据 ->Sub.vue
<template>
<div>
<h3>这是Sub组件:{{count}}</h3>
<button>-1</button>
</div>
</template> <script>
// 导入mapState函数
import {mapState} from 'vuex'
export default {
data() {
return {}
},
// 定义计算属性,把全局变量映射到当前组件中的computed计算属性中
computed: {
...mapState(['count']),
}
}
</script>
9. 效果

3. matation
1. 概念
用于变更state中的数据
2. 定义mutation
1. store.js -> 在mutations中定义一个加法操作.并且传递state的参数
export default new Vuex.Store({
state: {
count:0
},
mutations: {
// 定义一个加法操作
add(state) {
// 变更state
state.count ++
}
},
actions: {
}
})
3. 触发mutation
1. 触发mutation 方式一 -> Add.vue -> 通过this.$store.commit('方法名')
<template>
<div>
<h3>这是Add组件:{{this.$store.state.count}}</h3>
<button @click="Add">+1</button>
</div>
</template> <script>
export default {
methods: {
// 绑定click事件
Add() {
// 触发mutations
this.$store.commit("add");
}
}
};
</script>
2. 触发方式二:导入mapMutations函数,映射到methods
store.js
export default new Vuex.Store({
state: {
count:0
},
mutations: {
// 定义一个加法操作
add(state) {
// 变更state
state.count ++
},
sub(state) {
// 变更减法
state.count --
}
},
actions: {
}
})
Sub.vue -> click事件可以直接调用sub方法
<template>
<div>
<h3>这是Sub组件:{{count}}</h3>
<button @click="sub">-1</button>
</div>
</template> <script>
// 导入mapState函数
// 导入 mapMutations函数
import { mapState, mapMutations } from "vuex";
export default {
data() {
return {};
},
// 定义计算属性,把全局变量映射到当前组件中的computed计算属性中
computed: {
...mapState(["count"])
},
// 映射到methods
methods: {
...mapMutations(['sub'])
}
};
</script>
4. Action
1. 概念
处理异步操作,操作步骤不能在mutation中操作,只能通过Action触发mutation方式变更数据
2. 创建异步操作
store.js
export default new Vuex.Store({
state: {
count: 0
},
mutations: {
// 定义一个加法操作
add(state) {
// 变更state
state.count++
},
sub(state) {
// 变更减法
state.count--
}
},
actions: {
// 创建异步操作,每1秒后条用mutation中的add
addAsync(context) {
setTimeout(() => {
context.commit('add')
}, 1000)
}
}
})
3. 触发action 中的第一种方式: this.$store.dispath()
Add.vue
<template>
<div>
<h3>这是Add组件:{{this.$store.state.count}}</h3>
<button @click="Add">+1</button>
<button @click="AddAsync">+1</button>
</div>
</template> <script>
export default {
methods: {
// 触发mutations
Add() {
this.$store.commit("add");
},
// 触发action
AddAsync() {
this.$store.dispatch("addAsync");
}
}
};
</script>
4. 触发action的第二种方式:mapActions
store.js
export default new Vuex.Store({
state: {
count: 0
},
mutations: {
// 定义一个加法操作
add(state) {
// 变更state
state.count++
},
sub(state) {
// 变更减法
state.count--
}
},
actions: {
// 创建异步操作,每1秒后条用mutation中的add
addAsync(context) {
setTimeout(() => {
context.commit('add')
}, 1000)
},
subAsync(context) {
setTimeout(() => {
context.commit('sub')
}, 1000)
}
}
})
Sub.vue -> 导入mapActions函数,映射到methods方法中
<template>
<div>
<h3>这是Sub组件:{{count}}</h3>
<button @click="sub">-1</button>
<button @click="subAsync">异步-1</button>
</div>
</template> <script>
// 导入mapState函数
// 导入 mapMutations函数
import { mapState, mapMutations, mapActions } from "vuex";
export default {
data() {
return {};
},
// 定义计算属性,把全局变量映射到当前组件中的computed计算属性中
computed: {
...mapState(["count"])
},
// 映射到methods
methods: {
...mapMutations(["sub"]),
...mapActions(["subAsync"])
}
};
</script>
5. getter
1. 概念
用于对Store中的数据进行重新包装成新的数据(以前的数据不变化),Store中的数据变更,Getter中的数据也变更
2.定义Getter
store.js
getters: {
// 定义一个showNum 参数参入state
showNum(state){
return '当前getter数据为' + state.count
}
}
3.获取getter中数据方式一: this.$store.getters.名称 -> Add.vue
<template>
<div>
<h3>这是Add组件:{{this.$store.state.count}}</h3>
<h3>getter:{{this.$store.getters.showNum}}</h3>
<button @click="Add">+1</button>
<button @click="AddAsync">+1</button>
</div>
</template>
4. 获取getter数据方式二:mapGetters 映射到methods -> Sub.vue
<template>
<div>
<h3>这是Sub组件:{{count}}</h3>
<h3>这是Sub组件getter:{{showNum()}}</h3>
<button @click="sub">-1</button>
<button @click="subAsync">异步-1</button>
</div>
</template> <script>
// 导入mapState函数
// 导入 mapMutations函数
// 导入mapGetters 函数
import { mapState, mapMutations, mapActions, mapGetters } from "vuex";
export default {
data() {
return {};
},
// 定义计算属性,把全局变量映射到当前组件中的computed计算属性中
computed: {
...mapState(["count"])
},
// 映射到methods
methods: {
...mapMutations(["sub"]),
...mapActions(["subAsync"]),
...mapGetters(['showNum'])
}
};
</script>
演示效果

github demo: https://github.com/wangxiao9/vue_coding.git
【VUE】8.VUEX核心概念的更多相关文章
- 极客时间_Vue开发实战_05.Vue组件的核心概念(1):属性
05.Vue组件的核心概念(1):属性 代码地址: https://github.com/tangjinzhou/geektime-vue-1/blob/master/%E6%BC%94%E7%A4% ...
- 极客时间_Vue开发实战_06.Vue组件的核心概念(2):事件
06.Vue组件的核心概念(2):事件 通过emit传递给父组件 我们点击了重置失败,上层的div的click=handleDivClick是接收不到.重置失败的点击的行为的 通常情况下,你不用.st ...
- 极客时间_Vue开发实战_07.Vue组件的核心概念(3):插槽
07.Vue组件的核心概念(3):插槽 严格来的说在2.0之后已经不分区这两种插槽的概念了. 因为它底层的实现已经趋向于相同了. 2.6为了兼容2.5的版本,现在依然可以用这两种写法 作用域插槽就是多 ...
- 2.基础:Vue组件的核心概念
一.组件基础和注册 组件概念 组件系统是 Vue 的另一个重要概念,他的核心就是封装和复用. 细节 组件的name必须是全局唯一. 二.属性.事件和插槽 组件的三大核心概念:属性.事件和插槽. 属性, ...
- Vue学习笔记:Vue组件的核心概念(下)
1.双向绑定和单向数据流: 本质上还是单向数据流 视图<——>数据 v-model:仅仅是一个简写,用更少代码去实现功能. 自定义事件 .sync 修饰符 2.虚拟DOM及KEY属性作用 ...
- 深入理解Vue组件3大核心概念
摘要: 搞懂Vue组件! 作者:浪里行舟 原文:详解vue组件三大核心概念 Fundebug经授权转载,版权归原作者所有. 前言 本文主要介绍属性.事件和插槽这三个vue基础概念.使用方法及其容易被忽 ...
- vue使用--vuex快速学习与使用
什么是vuex? Vuex核心概念 Vuex安装与使用 1.安装 2.目录结构与vuex引入 3.store中变量的定义.管理.派生(getter) 4.vuex辅助函数的使用说明 Vuex刷新数据丢 ...
- vue项目--vuex状态管理器
本文取之官网和其他文章结合自己的理解用简单化的语言表达.用于自己的笔记记录,也希望能帮到其他小伙伴理解,学习更多的前端知识. Vuex 是什么? Vuex 是一个专为 Vue.js 应用程序开发的状态 ...
- vue(23)Vuex的5个核心概念
Vuex的核心概念 Vuex有5个核心概念,分别是State,Getters,mutations,Actions,Modules. State Vuex使用单一状态树,也就是说,用一个对象包含了所 ...
随机推荐
- 循序渐进VUE+Element 前端应用开发(24)--- 修改密码的前端界面和ABP后端设置处理
用户在系统登录后,一般会提供一个入口给当前用户更改当前的密码,其实更改密码操作是很简单的一个处理,不过本篇随笔主要是介绍结合前后端来实现这个操作,后端是基于ABP框架的,需要对密码的安全性进行一个设置 ...
- 《JavaScript高级程序设计》——第二章在HTML使用JavaScript
这章讲的是JavaScript在HTML中的使用,也就是<script>元素的属性.书中详细讲了async.defer.src和type四个<script>的属性. 下面是对第 ...
- D. Palindromic characteristics 解析(DP)
Codeforce 835 D. Palindromic characteristics 解析(DP) 今天我們來看看CF835D 題目連結 題目 略,請看原題 前言 想不到這種狀態... @copy ...
- CodeForces 1025G Company Acquisitions
题意 描述有点麻烦,就不写了. \(\texttt{Data Range:}1\leq n\leq 500\) 题解 势能函数这个东西好神啊-- 这个题目用常规的 DP 好像做不出来,所以我们可以考虑 ...
- 用GitHub Pages搭建博客(二)
本篇介绍基本GitHub Pages的搭建流程 GitHub账号及仓库创建 登录GitHub,录入用户名.邮箱.密码,创建成功后登录进入. 注册时,邮箱建议不使用QQ邮箱.因为一些第三方部署类网站不支 ...
- Python ( 高级 第二部)
目录 模块和包 面向对象 部分一: 面向对象程序开发 面向对象封装: 对象的相关操作 面向对象封装: 类的相关操作 实例化的对象/ 定义的类删除公有成员属性和公有成员方法 部分二: 单继承 多继承 菱 ...
- 撸个反向代理,激活JRebel~
持续原创输出,点击上方蓝字关注我 目录 前言 本地反向代理 服务器反向代理[个人推荐] IDEA安装JRebel并激活 服务器安装JRebel并激活 总结 前言 热部署相信大家都听说过,比如Sprin ...
- 4G DTU模块的功能和作用是什么
4G DTU模块我们可以简单将它理解为使用4G无线通信网络来进行远距离无线传送的终端设备.4G DTU模块基于4G方式进行远距离的数据传输,是专门用于将串口数据转换为IP数据或将IP数据转换为串口数据 ...
- rpm包的卸载与安装
1. rpm包的管理介绍:一种用于互联网下载包的打包及安装工具,它包含在某些Linux分发版中,它生成具有RPM扩展名的文件,RPM是RedHat Package Manager(RedHat软件包管 ...
- 如何将别人Google云端硬盘中的数据进行保存
查了好久终于知道! 如何将别人Google云端硬盘中的数据进行copy,而不是右键发现只有添加快捷方式 只要shift+z就可以保存了! 之后等我弄清楚怎么将别人家的云盘中的数据集导到colab再来详 ...