一、vuex 概述

(一)组件之间共享数据的方式



但是这三种方案,只适合小范围的数据共享,如果我们需要频繁的大范围的进行组件之间的数据共享,那么我们就适合使用 vuex

(二)vuex 是什么

主要实现数据共享

状态值的就是 vuex 中所要共享的全局数据

vuex 就是实现组件之间共享数据的方案

(三)使用 vuex 的好处

(四)什么样的数据适合存储到 vuex 中

二、vuex 的基本使用





先使用 vue ui 图形界面来创建项目





store下的 index.js



入口文件 main.js

三、计时器(项目结构)

使用定时器案例来学习vuex的具体使用

Addition.vue

<template>
<div>
<p>当前的count值为: </p>
<button>+1</button>
</div>
</template> <script> export default {
data(){
return{};
} }
</script>

Subtraction.vue

<template>
<div>
<p>当前的count值为: </p>
<button>-1</button>
</div>
</template> <script>
export default {
data(){
return{};
}
}
</script>

App.vue

<template>
<div id="app">
<Addition/> <p>------------------------------</p>
<Subtraction/>
</div>
</template> <script>
import Addition from './components/Addition.vue'
import Subtraction from './components/Subtraction.vue' export default {
name: 'app',
components: {
Addition,
Subtraction
}
}
</script>

四、vuex 的核心概念

五、State

1. 组件访问State 中数据的方式一

如下:

Addition.vue

<div>
<p>当前的count值为:{{$store.state.count}} </p>
<button>+1</button>
</div>

2. 组件访问 State 中数据的方式二

导入后需要在 export 中定义一计算属性computed

然后在计算属性中调用 导入的mapState函数,函数里面放入一个数组,数组中存放的是你需要映射,或者需要使用全局的哪个数据,那么就把数据名称放到里面,之后需要在前面放上三个点... 代表着展开运算符,全局里面的数据,映射为我当前组件的一个计算属性,可以认为当前的 count 就是计算属性的一个值

六、Mutation

需求: 在 Addition组件中,点击 +1 让count 值不断的 +1

<template>
<div>
<p>当前的count值为:{{$store.state.count}} </p>
<button @click="add">+1</button>
</div>
</template> <script>
export default {
data(){
return{};
},
methods:{
add(){
this.$store.state.count++
}
}
}
</script>

这种方式虽然实现了我们的需求,但是,是错误的,因为在vuex 中,不允许直接去修改组件全局的数据,这种代码完全是不合法的

(一)Mutation的作用

如果是通过 this.$store.state.count++ 去写代码,如果项目越写越大,最终state里面的count 发生了变化,如果此时,你想要去查看谁修改了其中的数据,会很麻烦,不方便维护,如果使用 mutation里面的函数来修改 state 中的函数的话,如果发现 state中的数据有问题,可直接通过 mutation发现问题

(二)触发 Mutation 函数的第一种方式

1. Mutation 传递一个参数



store下的 index.js

Addition.vue

2. Mutation 传递两个参数



栗子:



效果:

(三)触发 Mutation 的第二种方式



栗子:

store下的 index.js



Subtraction.vue



同样,Mutation 中可以传递参数

Subtraction.vue



index.js



效果:

七、Action

需求:点击按钮+1,等待1秒后再让count值加1

虽然页面中的效果展示正确了,但是实际上 state中的 count 还是 0,没有发生变化

所以我们知道 在 mutation 函数中,不要执行异步的操作

那么,如果我们就想要在 vuex 中执行异步操作呢???

栗子:

store下的 index.js

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex) export default new Vuex.Store({
state: {
count:0
}, mutations: {
//加一
jiayi(state){
state.count++
//加N
jiaN (state,step){
state.count+=step
},
//减一
jianyi(state){
state.count--
},
//减去N
jianN(state,step){
state.count-=step
}
},
actions: {
//实现异步加一
addAsync(context){
//context 相当于 new 出来的 vuex.store实例对象
setTimeout(()=>{
context.commit('jiayi')
//actions中不能直接去修改 state中的数据
//如果想要修改必须通过context.commit()去触发mutation中的某个方法才行
},1000)
}
},
modules: {
}
})

Addition.vue

<template>
<div>
<p>当前的count值为:{{$store.state.count}} </p>
<button @click="add">+1</button>
<button @click="addN">+N</button>
<button @click="addAy">+1 Async</button>
</div>
</template> <script>
export default {
data(){
return{};
},
methods:{
add(){
this.$store.commit('jiayi')
},
addN(){
this.$store.commit('jiaN',4)
},
addAy(){
this.$store.dispatch('addAsync')
}
}
}
</script>

效果:

总结:

1.如果想要修改 state中的数据,只有 mutations才有权力

2.但是mutation里面执行异步操作的话,页面能正常显示,但是实际state中的数据并没有改变

3.所以需要使用 actions 里面去执行异步操作,但是actions实际是在mutation的基础上去实现异步操作更改数据,它本身是不能更改state中的数据的

4.actions中的参数context相当于 new 出来的 store实例对象

(一) 触发actions 异步任务时携带参数

(二)触发Actions 异步任务的第二种方式



栗子:



Subtraction.vue

<template>
<div>
<p>当前的count值为:{{count}} </p>
<button @click="sub">-1</button>
<button @click="subN">-N</button>
<button @click="subAy">-Async</button>
</div>
</template> <script>
//1.导入 mapState
import {mapState} from 'vuex' //a.导入 mapMutations
import {mapMutations} from 'vuex' //导入 mapActions
import {mapActions} from 'vuex' export default {
data(){
return{};
},
//2.定义一个计算属性
computed:{
...mapState(['count'])
},
methods:{
//b.定义 mapMutations 方法
...mapMutations(['jianyi','jianN']),
...mapActions(['jianAsync']),
sub(){
this.jianyi()
},
subN(){
this.jianN(3)
},
subAy(){
this.jianAsync()
}
}
}
</script>

或者直接把 button 的click函数等于 mapActions 的函数名

<!-- <button @click="subAy">-Async</button> -->
<button @click="jianAsync">-Async</button>

八、Getter

(一)使用 Getter的第一种方式

栗子:

store下面的 index.js



Addition.vue

(二) 使用 Getter的第二种方式



Subtraction.vue

<!-- <p>当前的count值为:{{count}} </p> -->
<p>{{getNum}}</p>
//导入 mapGetters
import {mapGetters} from 'vuex'
    computed:{
...mapState(['count']),
...mapGetters(['getNum'])
},

vuex 的使用详解的更多相关文章

  1. Vuex状态管理详解

    什么是Vuex 专门为vue应用程序开发的状态管理模式,采用集中式存储管理应用的所有组件的状态(数据),以相应的规则保证状态以一种可预测的方式发生改变 Vuex的作用(什么样的情况下使用Vuex) 多 ...

  2. 前端Vue框架-vuex状态管理详解

    新人报道!多多关照-多提宝贵意见 谢谢- vuex理解 采用集中式存储管理模式.用来管理组件的状态,并以自定义规则去观测实时监听值得变化. 状态模式管理理解 属性 理解 state 驱动应用的数据源 ...

  3. Vue学习之--------深入理解Vuex、原理详解、实战应用(2022/9/1)

    @ 目录 1.概念 2.何时使用? 3.搭建vuex环境 3.1 创建文件:src/store/index.js 3.2 在main.js中创建vm时传入store配置项 4.基本使用 4.1.初始化 ...

  4. 详解vuex结合localstorage动态监听storage的变化

    这篇文章主要介绍了详解vuex结合localstorage动态监听storage的变化,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 需求:不同组件间共用同一数据,当一个 ...

  5. vue:vuex详解

    一.什么是Vuex? https://vuex.vuejs.org/zh-cn 官方说法:Vuex 是一个专为 Vue.js应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相 ...

  6. vuex里mapState,mapGetters使用详解

    这次给大家带来vuex里mapState,mapGetters使用详解,vuex里mapState,mapGetters使用的注意事项有哪些,下面就是实战案例,一起来看一下. 一.介绍 vuex里面的 ...

  7. vuex的使用及持久化state的方式详解

    vuex的使用及持久化state的方式详解 转载  更新时间:2018年01月23日 09:09:37   作者:baby格鲁特    我要评论 这篇文章主要介绍了vuex的使用及持久化state的方 ...

  8. vue-cli脚手架中webpack配置基础文件详解

    一.前言 原文:https://segmentfault.com/a/1190000014804826 vue-cli是构建vue单页应用的脚手架,输入一串指定的命令行从而自动生成vue.js+wep ...

  9. 详解Vue.js 技术

    本文主要从8个章节详解vue技术揭秘,小编觉得挺有用的,分享给大家. 为了把 Vue.js 的源码讲明白,课程设计成由浅入深,分为核心.编译.扩展.生态四个方面去讲,并拆成了八个章节,如下: 准备工作 ...

  10. vue 文件目录结构详解

    vue 文件目录结构详解 本篇文章主要介绍了vue 文件目录结构详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 项目简介 基于 vue.js 的前端开发环境,用于前后 ...

随机推荐

  1. v-for中key的作用与原理

    一.虚拟DOM中key的作用 key是虚拟DOM对象的标识,当数据发生变化时,Vue会根据新数据生成新的虚拟DOM,随后Vue会对新虚拟DOM与旧虚拟DOM的差异进行比较. 二.如何选择key 最好使 ...

  2. 部署redis

    1. 下载redis 下载地址:https://redis.io/download/ 下载版本:6.2.7 应用包:redis-6.2.7.tar.gz 2. 上传服务器并解压 将redis安装包上传 ...

  3. 使用idea创建第一个Mybatis程序及可能遇到的问题

    第一个Mybatis程序 思路:搭建环境->导入Mybatis->编写代码->执行 搭建环境 创建数据库 CREATE DATABASE `mybatis` USE `mybatis ...

  4. java学习之JSON

    0X00前言 JSON可以说是javascript的一种数据类型,我们学习JSON是为了在客户端的数据给读取出来,官方的解释是:概述:JSON(JavaScript Object Notation, ...

  5. 还在为数据库事务一致性检测而苦恼?让Elle帮帮你,以TDSQL为例我们测测 | DB·洞见#7

    数据库用户通常依赖隔离级别来确保数据一致性,但很多数据库却并未达到其所表明的级别.主要原因是:一方面,数据库开发者对各个级别的理解有细微差异:另一方面,实现层面没有达到理论上的要求. 用户在使用或开发 ...

  6. flex布局中,元素等间距设置,包括第一个元素的左边,最后一个元素的右边,也等间距

    项目中很多地方会用到等间距排放的场景,使用flex 布局可以很方便的实现 .fu{ display: flex; ustify-content: space-between; } 通过上面代码,可以实 ...

  7. 随笔——mvc公众号自动登录跳转到原页面的方法

    页面路径传参跳到那带到哪 1.全局过滤(继承过滤也行).这里使用的全局过滤 2.过滤判断需要登录的话,获取本次路径传到登录的页面 3.登录的页面判断是微信浏览器的话,参数带到微信登录接口 4.微信登录 ...

  8. 【大数据-课程】高途-天翼云侯圣文-Day1:互联网大数据揭秘(大数据介绍&MR实现双十一举牌)

    一.大厂职级 P7:年薪百万 二.大数据发展 1.职业路线和岗位角色 2.大数据行业发展 三.大数据的位置 1.热门行业 大数据承上启下 2.三者关系 啤酒和尿不湿:启发可以放在一块 3.大数据作用 ...

  9. 论文解读(PCL)《Probabilistic Contrastive Learning for Domain Adaptation》

    论文信息 论文标题:Probabilistic Contrastive Learning for Domain Adaptation论文作者:Junjie Li, Yixin Zhang, Zilei ...

  10. angr原理与实践(三)——Arbiter:一种弥合二进制程序漏洞发现中的静态和动态鸿沟

    ​ 转载请说明出处:信安科研人 please subscribe my official wechat :信安科研人 获取更多安全资讯 原文链接:sec22-vadayath.pdf (usenix. ...