再也不用担心组件跨层级的数据共享和方法驱动了

news2024/11/17 23:46:43

文章目录

    • 兄弟组件的传值和方法调用
    • 多个独立组件的数据共享和方法调用
        • 多个组件内的方法和数据互相驱动:eventBus
        • 多个组件的数据共享以及数据修改:vuex

项目中关于组件的使用经常会碰到这种情况:父子组件传和方法调用、兄弟组件的传值和方法调用、多个独立组件的数据共享和方法调用,例如:a、b组件的的数据共享,该数据是由c传出的,通过a、b组件修改共享参数,调用c方法实现a、b组件的数据更新。本文总结了上述的几种情况并分别讲解。

兄弟组件的传值和方法调用

框架:vue2
通过组件ref调用组件内的方法
父组件

<template>
      <div>
         <MyA @save="save"></MyA>
         <MyB ref="listNode"></MyB>
      </div>
</template>

<--! js部分 -->
methods: {
   save() {
      // 通过ref调用兄弟组件的方法
      this.$refs.listNode.submit();
   }
}

组件一

// MyA
<el-button type="parimary" size="mini" @click="sure">确定</el-button>
// js
methods: {
   sure() {
      // 保存点击,数据通过$emit传出
      this.$emit('save')
   }
}

组件二

// MyB
<el-button type="parimary" size="mini" @click="submit">提交</el-button>
// js
methods: {
   submit() {
      console.log('方法被触发了')
   }
}

A组件通过emit将方法回传,父组件触发A组件回传的事件,在父组件中通过ref在调用B组件内的事件。


多个独立组件的数据共享和方法调用

多个组件内的方法和数据互相驱动:eventBus

框架:vue2
新建一个eventBus.js,定义事件全局事件总线。

// eventBus.js
import Vue from 'vue'
export default new Vue();
// 该文件就两行

引入到main文件,挂载到vue原型上

// main.js
import Vue from 'vue'
import eventBus from '@/utils/eventBus.js'
// .....

Vue.prototype.$bus = eventBus // 挂载到原型
// ...

然后就可以在页面中使用了,使用的页面需要引入eventBus.js

// A组件
import bus from '@/utils/eventBus.js'

methods: {
      // 分页
      handleSizeChange(val) {
      // 广播方法
        bus.$emit('sizeChange',{page : val })
      },
}
// B组件
import bus from '@/utils/eventBus.js'

created() {
      // $off解绑
      bus.$off( 'sizeChange' );   // 使用前先解绑,否则在某些情况下会触发两次
      // $on监听触发
      bus.$on('sizeChange', (val) => {
        // 事件内的操作....
        this.getTable(val);
      })
},
methods: {
      getTable(val) {
          // 通过bus触发
          console.log(val); // { page: val }
      },
}

需要注意的是,eventBus$on 事件需要在created等生命周期中使用,如果写在methods中使不会自动触发的。使用 $on 事件的时候需要先解绑,否则页面刷新后监听事件没有解绑,后续再次广播事件会触发两次。解绑可以在beforeDestory中操作也可以 $off 后接 $on 解绑后监听

在这里插入图片描述
eventBus相当于一个全局事件池,向全局事件池中添加和传入事件,事件池的事件可以作用于全局。


多个组件的数据共享以及数据修改:vuex

框架:vue3
vuex中可以存储全局数据以及事件,我们可以在任何页面访问vuex中的事件和方法,随着项目持续维护,我们不可能直接在store中的index中直接添加数据和方法,因此vuex提供了module功能,可以让我们分别管理自己独立的module模块。

官网上是这么说的:
由于使用单一状态树,应用的所有状态会集中到一个比较大的对象。当应用变得非常复杂时,store 对象就有可能变得相当臃肿。
为了解决以上问题,Vuex 允许我们将 store 分割成模块(module)。每个模块拥有自己的 state、mutation、action、getter、甚至是嵌套子模块——从上至下进行同样方式的分割。

npm install vuex@next --save
// sotre -> my_module
const my_module = {
    state: () => ({ 
        my_count : 0,
        my_info : {
            id : 1,
            name : '我的模块'
        }
    }),
    mutations: { 
        countChange(state,val) {
            state.my_count += val
        }
     },
    actions: { 
        // actions不直接修改数据
        // context为store中的上下文,通过commit驱动mutations的方法来实现数据修改
        countTen(context,num){
            setTimeout(()=>{
                context.commit('countChange',num.num)
            },500)
        }
     },
    getters: { 
        getMyName (state) {
           return `这是${state.my_info.name}`
        },
        getMyCount (state) {
            return `我的总数:${state.my_count}`
         }
     }
}

export default my_module;
// store -> index.js
import { createStore } from "vuex";
import my_module from "./my_module";
// 创建store实例
const store = createStore({
    // 将my_module 挂载到modules中
    modules: {
        my_module
    }
})

export default store;
// main.js
import { createApp } from 'vue'
import './style.css'
import App from './App.vue'
import store from './store/index'  // 导入vuex

createApp(App)
.use(store)   // 挂载vuex
.mount('#app')
// 页面中使用
<template>
    <div>
        <div>vuex——module</div>
        <div>store中的值:{{ store.getters.getMyName }}</div>
        <div>store中的值:{{ store.getters.getMyCount }}</div>
        <button @click="addMyNum">count++</button>  
        <button @click="numMyTen">每次加10</button>  
    </div>
</template>

<script setup>
import { ref,computed} from "vue" 
import { useStore} from 'vuex' // vue3中通过useStore使用store
const store = useStore();

// vuex-module
const addMyNum = () => {
  store.commit('countChange',1)
}

const numMyTen = () => {
  store.dispatch('countTen',{num:10})
}
</script>

在这里插入图片描述

vuex一般用来做全局状态管理,并不建议向vuex中存储非全局的事件和方法,如果所有的跨组件事件和方法都向vuex中存储,随着项目的持续维护,store中的数据就会越来越多,会导致vuex维护成本变高。


vue3-setup组件传值 (👈点击直达)
微信小程序组件封装传值以及问题点规避 (👈点击直达)
vue3 语法糖setup 兄弟组件传值(👈点击直达)
微信小程序wxs封装使用以及公共js组件封装 (👈点击直达)
微信小程序的全局弹窗以及全局实例(👈点击直达)

如果觉得这篇文章对你有帮助,欢迎点赞👍、收藏💖、转发✨哦~

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Selenium该如何实现微博自动化运营:关注、点赞、评论

目录 前言&#xff1a; Selenium 是什么&#xff1f; 一、核心代码 二、步骤分解 三、自动化运营常用工具 前言&#xff1a; 使用 Selenium 实现微博自动化运营&#xff0c;可以提高效率、减少工作量&#xff0c;下面讲解如何使用 Selenium 实现微博的关注、点赞和评论功…

webSocket 学习

引子 WebSocket 是一种在单个 TCP 连接上进行全双工通信的网络协议。它是 HTML5 中的一种新特性&#xff0c;能够实现 Web 应用程序和服务器之间的实时通信&#xff0c;比如在线聊天、游戏、数据可视化等。 相较于 HTTP 协议的请求-响应模式&#xff0c;使用 WebSocket 可以建…

JVM零基础到高级实战之Java内存区域虚拟机栈

JVM零基础到高级实战之Java内存区域虚拟机栈 JVM零基础到高级实战之Java内存区域虚拟机栈 文章目录 JVM零基础到高级实战之Java内存区域虚拟机栈前言JVM内存模型之虚拟机栈总结 前言 JVM零基础到高级实战之Java内存区域虚拟机栈 JVM内存模型之虚拟机栈 虚拟机栈是什么&#x…

Ansys Lumerical | 光纤布拉格光栅温度传感器的仿真模拟

说明 该示例演示了一种基于光纤布拉格光栅&#xff08;FBG&#xff09;的温度传感器&#xff0c;因为光纤折射率会随温度而变化&#xff0c;导致其布拉格波长发生偏移&#xff0c;所以可以被用作温度的测量。&#xff08;联系我们获取文章附件&#xff09; 综述 在本示例中要考…

java八股文-并发篇

并发篇 1. 线程状态 要求 掌握 Java 线程六种状态掌握 Java 线程状态转换能理解五种状态与六种状态两种说法的区别 六种状态及转换 分别是 新建 当一个线程对象被创建&#xff0c;但还未调用 start 方法时处于新建状态此时未与操作系统底层线程关联 可运行 调用了 start …

在Linux上安装Zookeeper集群(zookeeper-3.5.9)

记录&#xff1a;455 场景&#xff1a;在CentOS 7.9操作系统上&#xff0c;使用zookeeper-3.5.9版本&#xff0c;在三台机器上&#xff0c;安装Zookeeper集群。 版本&#xff1a;zookeeper-3.5.9&#xff0c;CentOS 7.9,Linux kernel-5.4.218。 1.主机规划 目标&#xff1a…

接口自动化测试新玩法!Python构建mock服务让你的测试更加高效!

目录 引言 Flask mock接口开发示例 引言 Mock 即模拟&#xff0c;就是在测试过程中&#xff0c;对于某些不容易构造或者不容易获取的对象&#xff0c;用一个虚拟的对象来创建以便测试的测试方法&#xff0c;其最大的优势就是降级前后端耦合度&#xff0c; 使前端工程师可以不…

Alloy Tutorial(1)Alloy 基本使用

文章目录 构造一个 graph谓词undirected 无向图undirected2 无向图的第二种写法assertFact扩展 构造一个 graph In this workshop we are going to use Alloy to model graphs. Mathematically, recall that a graph is just a pair ⟨V, E⟩ where V is a set of vertices (a…

参数估计和假设检验的区别与联系

1.参数估计和假设检验的区别与联系 笔记来源&#xff1a; 参数估计与假设检验 参数估计和假设检验有什么区别&#xff1f; 1.1 联系 参数估计和假设检验是推断统计的两个组成部分&#xff0c;它们都是根据样本信息对总体的数量特征进行推断 下图来自《统计学图鉴》 参数估计…

详解WEB集群服务(LNMP+Nginx+Tomcat+Rewrite重写+七层反向代理+SNAT|DNAT策略)

实战项目演练 1.问题描述2.实验操作步骤2.1 CentOS 7-1客户端配置2.2 CentOS 7-2网关服务器配置2.3 CentOS 7-8 (Web1:Tomcat服务器)2.3.1 安装Tomcat服务器2.3.2 提供四层反向代理的动态页面 2.4 CentOS 7-9 (Nginx服务器)2.4.1 安装Nginx服务2.4.2 安装MySQL服务2.4.3 安装配…

基于Python的接口自动化-读写配置文件

目录 引言 configparser模块功能介绍 引言 在编写接口自动化测试脚本时&#xff0c;有时我们需要在代码中定义变量并给变量固定的赋值。为了统一管理和操作这些固定的变量&#xff0c;咱们一般会将这些固定的变量以一定规则配置到指定的配置文件中&#xff0c;后续需要用到这…

如何在电脑上使用wink一键高清短视频

如何在电脑上使用wink一键高清优化短视频画质 文章目录 如何在电脑上使用wink一键高清优化短视频画质1.软件简介1.1痛点1.2解决方案 2.实际操作2.1准备工作2.1.1下载雷电模拟器2.1.2下载wink 2.2.安装软件2.2.1安装雷电模拟器2.2.2安装wink2.2.2.1在雷电模拟器中安装wink2.2.2.…

LeetCode 双周赛 106(2023/06/10)两道思维题

本文已收录到 AndroidFamily&#xff0c;技术和职场问题&#xff0c;请关注公众号 [彭旭锐] 加入知识星球提问。 往期回顾&#xff1a;LeetCode 单周赛第 348 场 数位 DP 模版学会了吗&#xff1f; 双周赛 106 概览 T1. 判断一个数是否迷人&#xff08;Easy&#xff09; 标…

如何做企业发布会直播/企业发布会直播流程

1 .企业发布会直播流程图 2 .发布会解决方案 A .发布会直播前 B .发布会直播中 C .发布会直播后 如何做一场企业新品、产品发布会直播&#xff1f;流程图&#xff1a; 01 发布会直播前 专业全案策划 全面深入挖掘客户直播需求&#xff0c;拆解需求&#xff0c;制定全流程落地方…

Selenium 必了解—如何测试REST API

目录 前言&#xff1a; Web UI测试存在的问题&#xff1a; REST API测试&#xff1a; 依赖包 程序示例&#xff1a; 1-获取联系人 2-GET Request&#xff1a; 3-POST Request: 4- 编辑请求 5- 删除请求 前言&#xff1a; Selenium WebDriver 可以用于测试 Web 应用的…

深度学习框架(Pytorch)学习第1步:包管理系统Anaconda的安装

PyTorch是一种开源的深度学习框架&#xff0c;以出色的灵活性和易用性著称。 并且与机器学习开发者和数据科学家喜欢的Python高级编程语言兼容。 什么是PyTorch PyTorch是一种构建深度模型功能完备的框架。通常用于图像识别和语言处理等。 使用Python编写&#xff0c;学习和…

UI自动化测试之Airtest让你的测试工作如虎添翼!

本文我们讲解下Airtest的使用&#xff0c;主要学习目标有以下几点&#xff1a; &#xff08;1&#xff09;认识Airtest &#xff08;2&#xff09;了解Airtest能做什么 &#xff08;3&#xff09;Airtest安装及环境搭建 &#xff08;4&#xff09;掌握Airtest图形化api使用 &am…

【MySQL】记录的基本操作

文章目录 插入数据为表中所有字段插入数据为表中指定字段插入数据同时插入多条数据 更新数据删除数据TRUNCATE和DETELE的区别 查询数据 插入数据 为表中所有字段插入数据 基本语法 INSERT INTO 表名&#xff08;字段名1,字段名2,…) VALUES (值 1,值 2,…); 示例 # 准备一张表…

算法模板(4):动态规划(4) 做题积累(2)

动态规划 9. 单调队列优化DP 1. 1088. 旅行问题 John 打算驾驶一辆汽车周游一个环形公路。 公路上总共有 n 个车站&#xff0c;每站都有若干升汽油&#xff08;有的站可能油量为零&#xff09;&#xff0c;每升油可以让汽车行驶一千米。 John 必须从某个车站出发&#xff…

接口自动化-让你了解数据库相关知识

目录 python接口自动化实战 数据库 写一个对数据库操作的类 python接口自动化实战 目标 学习数据库相关&#xff0c;用例增加对数据库校验 利用数据库完成对数据查询 如何校验数据库数据&#xff0c;怎样添加校验让程序自己校验&#xff08;充值、提现、投资接口对金额的…