vuex组件之间共享数据的方式

  • 父向子传值:v-bind 属性绑定

  • 子向父传值:v-on 事件绑定

  • $on 接收数据的那个组件

  • $emit 发送数据的那个组件

  • 其他的传值方式:

  • ref 获取dom元素还有组件

  • $children获取子组件集合

  • $parent获取父组件

  • 路由参数--组件传值

1.Vuex概述

1 1.Vuex概述

  • Vuex是实现组件全局状态(数据)管理的一种机制,可以方便的实现组件之间的数据共享

image-20230109225524375

1.2 使用Vuex管理数据的好处:

  • 能够在vuex中集中管理共享的数据,便于开发和后期进行维护

  • 能够高效的实现组件之间的数据共享,提高开发效率

  • 存储在vuex中的数据是响应式的,当数据发生改变时,页面中的数据也会同步更新

1.3 什么样的数据适合存储到 Vuex 中

一般情况下,只有组件之间共享的数据,才有必要存储到 vuex 中;对于组件中的私有数据,依旧存储在组件 自身的 data 中即可。

vuex中通常会保存哪些数据? 网站的名称,用户信息,token,商品数量等等。

2. Vuex 的基本使用

安装 | Vuex

1. 安装 vuex 依赖包

npm instaall vuex --save

2. 导入 vuex 包

// import store from './store' 已经给你引入ok了
import Vuex from 'vuex'
Vue.use(Vuex)

3. 创建 store 对象

const store = new Vuex.Store({
// state 中存放的就是全局共享的数据 
state: { count: 0 }
})

4. 将 store 对象挂载到 vue 实例中

new Vue({
el: '#app',
render: h => h(app),
router,
// 将创建的共享数据对象,挂载到 Vue 实例中
// 所有的组件,就可以直接从 store 中获取全局的数据了 
store
})

5. 创建带有vuex的vue项目,打开终端,输入命令:vue ui

3.使用Vuex完成计数器案例

6.1打开刚刚创建的vuex项目,找到src目录中的App.vue组件,将代码重新编写如下:

<template><div><my-addition></my-addition><p>----------------------------------------</p><my-subtraction></my-subtraction></div>
</template><script>
import Addition from './components/Addition.vue'
import Subtraction from './components/Subtraction.vue'export default {data() {return {}},components: {'my-subtraction': Subtraction,'my-addition': Addition}
}
</script><style>
</style>

6.2在components文件夹中创建Addition.vue组件,代码如下:

<template><div><h3>当前最新的count值为:</h3><button>+n</button></div>
</template><script>
export default {data() {return {}}
}
</script><style>
</style>

6.3在components文件夹中创建Subtraction.vue组件,代码如下:

<template><div><h3>当前最新的count值为:</h3><button>-n</button></div>
</template><script>
export default {data() {return {}}
}
</script><style>
</style>

4.Vuex中的核心特性

4.1 Vuex 中主要核心:

  • State,控制所有的共享数据

  • Mutation,只能在Mutation中修改State中的数据

  • Action,执行异步操作

  • Getter,用于对Store中的数据进行加工处理形成新的数据

4.2.State

  • State提供唯一的公共数据源,所有共享的数据都要统一放到Store中的State中存储

例如,打开项目中的store.js文件,在State对象中可以添加我们要共享的数据,如:count:0

// 创建store数据源,提供唯一公共数据 
const store = new Vuex.Store({state: {count: 0 }
})

在组件中访问State的方式:2种

在组件中访问State的方式:
1).this.$store.state.全局数据名称  如:this.$store.state.count<h3>当前最新的count值为:{{this.$store.state.count}}</h3>2).先按需导入mapState函数: import { mapState } from 'vuex'然后数据映射为计算属性: computed:{ ...mapState(['全局数据名称']) }<template><div><h3>当前最新的count值为:{{count}}</h3><button>-n</button></div>
</template><script>
import { mapState } from 'vuex'
export default {data () {return {}},computed: {//扩展运算符...mapState(['count'])}
}
</script>

4.3.Mutation

  • Mutation用于修改变更$store中的数据

1 只能通过 mutation 变更 Store 数据,不可以直接操作 Store 中的数据。 2 通过这种方式虽然操作起来稍微繁琐一些,但是可以集中监控所有数据的变化。

使用方式: 打开store.js文件,在mutations中添加代码如下

mutations: {add(state,step){//第一个形参永远都是state也就是$store对象//第二个形参是调用add时传递的参数state.count+=step;}}

然后在Addition.vue中给按钮添加事件代码如下:

<button @click="Add">+n</button>methods:{Add(){//使用commit函数调用mutations中的对应函数,//第一个参数就是我们要调用的mutations中的函数名//第二个参数就是传递给add函数的参数//固定触发mutations中的方法this.$store.commit('add',10)}
}

使用mutations的第二种方式:

mutations: {add(state, step) {state.count += step},sub(state, step) {state.count -= step}},

在Subtraction.vue组件中

import { mapMutations } from 'vuex'methods:{...mapMutations(['sub'])
}

如下:

<button @click="Sub">-n</button>import { mapState,mapMutations } from 'vuex'export default {data() {return {}},methods:{//获得mapMutations映射的sub函数...mapMutations(['sub']),//当点击按钮时触发Sub函数Sub(){//调用sub函数完成对数据的操作this.sub(10);}},computed:{...mapState(['count'])}
}

4.4.Action

  • 在mutations中不能编写异步的代码,会导致vue调试器的显示出错。

  • 在vuex中我们可以使用Action来执行异步操作。

  • 如果通过异步操作变更数据,必须通过 Action,而不能使用 Mutation,但是在 Action 中还是要通过触发 Mutation 的方式间接变更数据。操作步骤如下: 打开store.js文件,修改Action,如下:

  • //mutations只能处理同步任务,比如定时器,ajax,异步任务就一定不可以去操作mutations//actions 是专门处理异步任务的,但是没有权限修改store中的数据。// 那就在actions中调用mutations中的方法,间接去修改state中的数据//这里的context就是store对象actions: {addAsync(context, step) {// 在action中不能直接修改state中的数据,// 必须通过context.commit()触发某个mutation才行context.commit('add', step);}}, actions: {addAsync(context, step) {setInterval(() => {context.commit('add', step);},1000)}

    然后在Addition.vue中给按钮添加事件代码如下:

  •  <button @click="AddAsync(10)">+10</button>methods: {AddAsync(n) {//固定触发action中的异步方法this.$store.dispatch("addAsync", n);},}    

    在Subtraction.vue组件中

  • import { mapActions } from 'vuex'methods:{...mapActions(["subAsync"]),SubAsync(n) {this.subAsync(n);},
    }

    4.5.Getters

  • Getter用于对Store中的数据进行加工处理形成新的数据

  • 它只会包装Store中保存的数据,并不会修改Store中保存的数据,

  • 当Store中的数据发生变化时,Getter生成的内容也会随之变化 打开store.js文件,添加getters,如下:

  • export default new Vuex.Store({.......getters:{//添加了一个showNum的属性showCount(state) {return '最新的count值为:' + state.count}}
    })

    第一种方式

    然后打开Addition.vue中,添加插值表达式使用getters

  •  <h3>{{$store.getters.showCount}}</h3>

  • 第二种方式

  • <h5>{{ showCount }}</h5>在Subtraction.vue,导入mapGetters,并将之映射为计算属性
    import { mapGetters } from 'vuex'computed:{			...mapGetters(['showNum'])
    }

    4.6总结

  • 修改state状态必须通过mutations

  • mutations只能执行同步代码,类似ajax,定时器之类的代码不能在mutations中执行

  • 执行异步代码,要通过actions,然后将数据提交给mutations才可以完成

  • state的状态即共享数据可以在组件中引用

  • 组件中可以调用action

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/249072.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【LUA】mac状态栏添加天气

基于网络上的版本修改的&#xff0c;找不到出处了。第一个摸索的lua脚本&#xff0c;调了很久。 主要修改&#xff1a;如果风速不大&#xff0c;就默认不显示&#xff0c;以及调整为了一些格式 local urlApi http://.. --这个urlApi去申请个免费的就可以了 然后打开对应的json…

Vue学习Element-ui

声明&#xff1a;本文来源于黑马程序员PDF讲义 Ajax 我们前端页面中的数据&#xff0c;如下图所示的表格中的学生信息&#xff0c;应该来自于后台&#xff0c;那么我们的后台和前端是 互不影响的2个程序&#xff0c;那么我们前端应该如何从后台获取数据呢&#xff1f;因为是2…

什么是git,怎样下载安装?

简介&#xff1a; 应用场景&#xff1a; 应用场景&#xff1a;团队企业开发 作用&#xff1a; 安装&#xff1a; 1.网址&#xff1a;Git - Downloads 很卡很慢 2.可以选择镜像网站下载&#xff08;推荐&#xff09; CNPM Binaries Mirror

k8s从私有库harbor中拉取镜像

一、前言 Docker镜像是构建应用程序的基础。然而&#xff0c;许多组织和开发团队希望保留他们的Docker镜像在私有仓库中&#xff0c;并从中拉取镜像&#xff0c;而不是从公共Docker Hub中下载。这样做的原因有很多&#xff0c;包括&#xff1a; 1. 安全性&#xff1a;私有仓库可…

利用onenet mqtt协议 ,ESP32上传温湿度数据流成功(arduinoIDE)

目标&#xff1a;开发esp32通过onenet平台远程控制LED、继电器等其它设备&#xff0c;并利用onenet可视化功能开发出一个简单的控制页面。 原以为能够快速完成&#xff0c;没想到接入mqtt协议、数据流上传、可视化按键都不同程度遇到了问题&#xff0c;还好经过一番查找和修改…

Android 使用高德地图

一、获取高德平台key 【1】基于application包名&sha1值在高德控制台获取key值&#xff0c;详情参考&#xff1a; 获取Key-创建工程-开发指南-Android 地图SDK | 高德地图API 【2】在manifest中声明权限 【3】将拿到的key值在manifest中进行声明 <!--允许程序打开网络…

HTTPS实现原理

1 为什么需要HTTPS&#xff1f; HTTP 在进行数据传输时采用明文传输&#xff0c;数据包中的用户信息等隐私数据可以被第三方通过抓包等方式窃取&#xff0c;是不安全的。 如果客户端使用 MD5 加密算法对数据进行加密&#xff0c;由于加密后的结果是不可逆的&#xff0c;服务器…

adf4159 直接调制/快速波形产生13 GHz小数N分频频率合成器

优势和特点 RF带宽达13 GHz高速和低速FMCW斜坡发生25位固定模数可提供次赫兹频率分辨率PFD频率最高达110 MHz归一化相位噪底&#xff1a;−224 dBc/HzFSK和PSK功能锯齿波、三角波和抛物线波形发生斜坡与FSK叠加具有2种不同扫描速率的斜坡斜坡延迟、频率回读和中断功能可编程相…

Blender教程(基础)-面的细分与删除、挤出选区-07

一、Blender之面的细分 新建一个立方体&#xff0c;在编辑模式下、选中一个面。 在选中的面上单击右键弹出细分选项&#xff0c;选择细分。 在选中细分后、会默认细分1次。修改细分次数在左下角 二、Blender之面的删除 选择中需要操作的面&#xff0c;在英文状态下按X键弹…

【计算机视觉】万字长文详解:卷积神经网络

以下部分文字资料整合于网络&#xff0c;本文仅供自己学习用&#xff01; 一、计算机视觉概述 如果输入层和隐藏层和之前一样都是采用全连接网络&#xff0c;参数过多会导致过拟合问题&#xff0c;其次这么多的参数存储下来对计算机的内存要求也是很高的 解决这一问题&#x…

linux 04 进程管理

02.进程管理 ps 在命令行输入ps后按回车键就能查看当前系统中正在运行的进程。 第一. 查看进程ps 进程的状态STAT 进程的周期 fork&#xff0c;产生一个新进程 第二.排序进程表 ps aux --sort -%cpu 降序cpu %cpu 增序cpu 第三.父子关系 ps ef 第四.自定义 五.动态查看…

FileZilla 的安装与使用

目录 一. FileZilla 是什么二. FileZilla 的安装1. 下载 FileZilla2. 安装 三. FileZilla 的使用 一. FileZilla 是什么 FileZilla 是一个免费的开源 FTP&#xff08;文件传输协议&#xff09;客户端软件&#xff0c;用于在计算机之间传输文件。它提供了一个直观的用户界面&am…

轮转数组[中等]

优质博文&#xff1a;IT-BLOG-CN 一、题目 给定一个整数数组nums&#xff0c;将数组中的元素向右轮转k个位置&#xff0c;其中k是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,…

VueFire:一个一流的 Vue 和 Firebase 体验,包括对 Nuxt 的支持,现在已经稳定了

VueFire&#xff0c;一个一流的 Vue 和 Firebase 体验 — 包括对 Nuxt 的支持&#xff0c;现在已经稳定了。 Vue 和 Firebase 现在比以往任何时候都更好了。 构建更好的VueFire 去年&#xff0c;我们宣布与 Eduardo San Martin Morote 合作&#xff0c;构建一个成熟的 Vue 和…

蓝桥杯嵌入式第七届真题(完成) STM32G431

蓝桥杯嵌入式第七届真题(完成) STM32G431 题目 相关文件 main.c /* USER CODE BEGIN Header */ /********************************************************************************* file : main.c* brief : Main program body**********************…

我的创作纪念日和前端碎碎念

机缘 作为一个前端开发者&#xff0c;我一直热衷于将设计和技术相结合&#xff0c;尽可能提升用户体验。我最初成为创作者的初心源于学习记录&#xff0c;把创作当作一个笔记&#xff0c;希望把自己遇到的问题&#xff0c;以及学习到的实用技巧记录下来&#xff0c;方便学习回…

第九节HarmonyOS 常用基础组件22-Marquee

1、描述 跑马灯组件&#xff0c;用于滚动展示一段单行文本&#xff0c;仅当文本内容宽度超过跑马灯组件宽度时滚动。 2、接口 Marquee(value:{start:boolean, step?:number, loop?:number, fromStart?: boolean ,src:string}) 3、参数 参数名 参数类型 必填 描述 st…

智能指针——浅析

智能指针 本人不才&#xff0c;只能将智能指针介绍一下&#xff0c;无法结合线程进行深入探索 介绍及作用 在异常产生进行跳转时&#xff0c;通过栈帧回收进行内存释放&#xff0c;防止内存泄漏 基于RAII思想可以创建出只能指针 RAII(Resource Acquisition Is Initializatio…

备战蓝桥杯---数据结构与STL应用(入门4)

本专题主要是关于利用优先队列解决贪心选择上的“反悔”问题 话不多说&#xff0c;直接看题&#xff1a; 下面为分析&#xff1a; 很显然&#xff0c;我们在整体上以s[i]为基准&#xff0c;先把士兵按s[i]排好。然后&#xff0c;我们先求s[i]大的开始&#xff0c;即规定选人数…

Neo4j介绍

1.Neo4j概述 Neo4j是一个开源的 无Shcema的 基于java开发的 图形数据库&#xff0c;它将结构化数据存储在图中而不是表中。它是一个嵌入式的、基于磁盘的、具备完全的事务特性的Java持久化引擎。程序数据是在一个面向对象的、灵活的网络结构下&#xff0c;而不是严格、静态的表…