Vue3中使用 EventBus 实现兄弟组件传参

news2024/10/1 15:25:39

前言:EventBus vue3中没有了,EventBus,所以我们要自己写,但是非常简单。

步骤一:创建(EventBus 容器)

在src目录,创建个bus文件夹,存放 自己建立的 bus.js 

class Bus {
	constructor() {
		this.list = {};  // 收集订阅
	}
	// 订阅
	$on(name, fn) {
		this.list[name] = this.list[name] || [];
		this.list[name].push(fn);
	}
	// 发布
	$emit(name, data) {
		if (this.list[name]) {
      		this.list[name].forEach((fn) => {	fn(data);   });
    	}
	}
	// 取消订阅
	$off(name) {
		if (this.list[name]) {
			delete this.list[name];
		}
	}
}
export default new Bus;

步骤二:创建(发布者)

调用订阅 并且传参数   记住:需要引入Bus.js文件

  Bus.$emit('userinfo',this.users);

发布后,在订阅者的组件就会执行,注意对应的发布和订阅的name 要一样

步骤三:创建(订阅者)

发布之后开始执行  记住:也是需要引入Bus.js文件

mounted() {
    Bus.$on("userinfo", (userinfo) => {
      this.userinfo = userinfo;
    });
  },

完整代码:

父组件:

<template>
   <Send/>
  <On/>
 
</template>

<script>
import Send from "./components/Send.vue";
import On from "./components/On.vue";
export default {
  name: "App",
  components: {
    Send,
    On
  },
}
</script>

<style>

</style>

兄弟组件1 (发送方):

<template>
  <h3>用户注册</h3>
  <ul>
    <li>
      <label>用户名:</label
      ><input
        type="text"
        @blur="checkUserName"
        v-model="username"
        placeholder="请输入用户名"
      />
      <span :class="[this.errors.username == '校验通过' ? 'green' : 'red']">{{
        errors.username
      }}</span>
    </li>
    <li>
      <label>密码:</label
      ><input
        type="password"
        @blur="checkPass"
        v-model="password"
        placeholder="请输入密码"
      />
      <span>{{ errors.password }}</span>
    </li>
    <li>
      <label>性别:</label>
      <input type="radio" name="gender" value="male" v-model="gender" />男
      <input type="radio" name="gender" value="female" v-model="gender" />女
    </li>
    <li>
      <label>地址:</label>
      <select v-model="selectedCity">
        <option :value="c.name" v-for="c in cities">{{ c.text }}</option>
      </select>
    </li>
  </ul>
  <button @click="handleRegister">注册</button>
</template>

<script>
import Bus from "../bus/bus.js";
export default {
  data() {
    return {
      username: "",
      password: "",
      gender: "male",
      cities: [
        { name: "cq", text: "重庆" },
        { name: "bj", text: "北京" },
      ],
      selectedCity: "cq",
      errors: {},
      id: "",
      users: [],
    };
  },
  methods: {
    handleModify() {
      const user = this.users.find((u) => {
        return u.id == this.id;
      });
      user.username = this.username;
      user.password = this.password;
      user.gender = this.gender;
      user.city = this.selectedCity;
    },
    handleRegister() {
      if (
        this.errors.username == "校验通过" &&
        this.errors.password == "校验通过"
      ) {
        console.log({
          username: this.username,
          password: this.password,
          gender: this.gender,
          city: this.selectedCity,
        });
        this.users.push({
          username: this.username,
          password: this.password,
          gender: this.gender,
          city: this.selectedCity,
        });
        console.log(this.users);
        Bus.$emit('userinfo',this.users);
      }
    },
    checkUserName() {
      if (this.username == "" || this.username == null) {
        this.errors.username = "用户名不能为空";
      } else {
        this.errors.username = "校验通过";
      }
    },
    checkPass() {
      if (this.password == "" || this.password == null) {
        this.errors.password = "密码不能为空";
      } else {
        if (this.password.length < 6) {
          this.errors.password = "密码长度不正确";
        } else {
          this.errors.password = "校验通过";
        }
      }
    },
    handleCity(name) {
      let text = "";
      this.cities.forEach((c) => {
        if (c.name == name) {
          text = c.text;
        }
      });
      return text;
    },
  },
};
</script>

<style>
li {
  list-style: none;
}

.center {
  margin: 0 auto;
  width: 400px;
  text-align: center;
}

.red {
  color: red;
}

.green {
  color: green;
}
</style>

兄弟组件2 (接受方):

<template>
  <div style="display: flex; flex-direction: row; justify-content: center">
    <table border="1">
      <tr>
        <td>序号</td>
        <td>用户名</td>
        <td>性别</td>
        <td>地址</td>
      </tr>
      <tr v-for="(u, index) in userinfo">
        <td>{{ index + 1 }}</td>
        <td>{{ u.username }}</td>
        <td>{{ u.gender == "male" ? "男" : "女" }}</td>
        <td>{{ handleCity(u.city) }}</td>
      </tr>
    </table>
  </div>
</template>

<script>
import Bus from "../bus/bus.js";
export default {
  data() {
    return {
      userinfo: [],
    };
  },
  methods: {
    handleCity(e) {
      if (e === "cq") {
        return "重庆";
      }
      if (e === "bj") {
        return "北京";
      }
    },
  },
  mounted() {
    Bus.$on("userinfo", (userinfo) => {
      this.userinfo = userinfo;
    });
  },
};
</script>

<style>
</style>

最终效果:

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

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

相关文章

Springboot 中快速完成文件上传,整合多平台神器

哈喽&#xff0c;大家好~ 又是做好人好事的一天&#xff0c;有个小可爱私下问我有没有好用的springboot文件上传工具&#xff0c;这不巧了嘛&#xff0c;正好我私藏了一个好东西&#xff0c;顺便给小伙伴们也分享一下&#xff0c;demo地址放在文末了。 文件上传在平常不过的一…

1.黑马Springboot基础篇笔记

Springboot基础篇 1.快速上手Springboot 1.基础配置 1.parent 作用&#xff1a;指定jar包版本信息信息&#xff0c;避免依赖版本冲突 2.starter 作用:SpringBoot中常见项目名称&#xff0c;定义了当前项目使用的所有依赖坐标&#xff0c;以达到减少依赖配置的目的使用任意…

扬帆优配|逼近历史最高点!刚刚,A股这一板块沸腾!

今天早盘&#xff0c;A股整体小幅走强&#xff0c;上证指数创阶段性新高&#xff0c;并逼近年内最高点&#xff0c;科创50指数则大涨超2%领涨两市。 盘面上&#xff0c;新能源车、黄金、锂矿、建筑等板块涨幅居前&#xff0c;互联网、传媒娱乐、知识产权、博彩概念等板块跌幅居…

开源项目创始人的营销建议:让开源项目脱颖而出

来自开源创始人的营销建议 面对现实吧&#xff0c;如果你想让你的开源项目变成主业&#xff0c;就得投入一定的精力对它进行营销。 这并不意味着几篇空洞的文章加上夺人眼球的标题&#xff0c;而是要向用户清晰地传达产品的功能&#xff0c;并帮助他们轻松发现产品的优势。 本文…

什么是数智化招采?如何实现数智化招采(系统)?

数智化&#xff0c;是当今信息技术领域的一个热门话题。它的应用范围非常广泛&#xff0c;包括商业、医疗、科学、政府、城市、企业、社会等各个领域。随着现代信息技术的不断发展&#xff0c;数智化已经成为各行各业中的一个重要趋势。 什么是数智化招采 信息化是数据形成的…

ChatGPT实战100例 - (06) 10倍速可视化组织架构与人员协作流程

文章目录 ChatGPT实战100例 - (06) 10倍速可视化组织架构与人员协作流程一、需求与思路二、 组织架构二、 人员协作四、 总结 ChatGPT实战100例 - (06) 10倍速可视化组织架构与人员协作流程 一、需求与思路 管理研发团队的过程中&#xff0c;组织架构与人员协作流程的可视化是…

《商用密码应用与安全性评估》第一章密码基础知识1.7密码功能实现示例

保密性实现 访问控制&#xff1a;防止敌手访问敏感信息 信息隐藏&#xff1a;避免敌手发现敏感信息 信息加密&#xff1a;允许观测&#xff0c;但无法提炼信息 几种分组密码工作模式的区别&#xff1a; 名称全称优点缺点ECB电子密码本模式简单、快速、并行不抗重放CBC密码分组…

计算机:理解操作系统:内存篇(上)

内存篇 1. 什么是内存2. C/C内存模型2.1 代码段和数据段2.2 堆和栈 本节是操作系统系列教程的第三篇文章&#xff0c;属于操作系统第一章即基础篇&#xff0c;在真正开始操作系统相关章节前在这一部分回顾一些重要的主题&#xff0c;算是温故知新吧&#xff0c;以下是目录&…

瑞吉外卖项目——瑞吉外卖

软件开发整体介绍 软件开发流程 需求分析&#xff1a;产品原型、需求规格说明书 设计&#xff1a;产品文档、UI界面设计、概要设计、详细设计、数据库设计 编码&#xff1a;项目代码、单元测试 测试&#xff1a;测试用例、测试报告 上线运维&#xff1a;软件环境安装、配置…

Qt编写推流综合应用示例(文件推流/桌面推流/本地摄像头/网络摄像头/转发推流/视频分发)

一、功能特点 1.1 文件推流 指定网卡和监听端口&#xff0c;接收网络请求推送音视频等各种文件。实时统计显示每个文件对应的访问数量、总访问数量、不同IP地址访问数量。可指定多种模式&#xff0c;0-直接播放、1-下载播放。实时打印显示各种收发请求和应答数据。每个文件对…

Vivado布线和生成bit参数设置

本文主要介绍Vivado布线参数设置&#xff0c;基本设置方式和vivado综合参数设置基本一致&#xff0c;将详细说明如何设置布线参数以优化FPGA设计的性能&#xff0c;以及如何设置Vivado压缩BIT文件。 一、Vivado布线概述 Vivado布线是在FPGA设计中实现物理布局的关键步骤之一。…

C语言-字符串

sizeof和strlen 的区别&#xff1a; 区别1&#xff1a; 1.sizeof计算整个数组大小&#xff0c; 2.strlen 计算有效的数组大小 新建字符数组”hello“ char cdata[128]"hello"; printf("sizeof--cdata的长度&#xff1a;%d\n",sizeof(cdata)); pri…

Hive窗口函数全解

在SQL中有一类函数叫做聚合函数&#xff0c;例如sum()、avg()、max()等等&#xff0c;这类函数可以将多行数据按照规则聚集为一行&#xff0c;一般来讲聚集后的行数是要少于聚集前的行数的。但是有时我们想要既显示聚集前的数据&#xff0c;又要显示聚集后的数据&#xff0c;这…

零基础抽象MYSQL

既然完成了下载安装和密码登录&#xff0c;那么打开你的MYSQL MYSQL中最简单的 创建数据库、查看数据库、选择数据库、删除数据库 先从重要的创建数据库 直接输入create database data_a ; 注意了要打分号 &#xff1b; 如果查看你创建的数据库 show databases &#xff…

使用 Flask 快速构建 基于langchain 和 chatGPT的 PDF摘要总结

简介 这里不对 langchain 和 chatGPT 进行介绍&#xff0c;仅对实现过程进行整理 环境 Python >3.8 Flask2.2.3 Jinja23.1.2 langchain0.0.143 openai0.27.4 实现 总结功能 使用 langchain 和 openai 接口实现总结功能 实现逻辑&#xff1a;通过text_splitter 将pdf 分…

LeetCode 501: 二叉搜索树中的众数 | C++语言版

LeetCode 501. 二叉搜索树中的众数 | C语言版 LeetCode 501. 二叉搜索树中的众数题目描述解题思路思路一&#xff1a;使用迭代代码实现运行结果参考文章&#xff1a; 思路二&#xff1a;减少遍历节点数代码实现运行结果参考文章&#xff1a; LeetCode 501. 二叉搜索树中的众数 …

Edius抠像过程(实践笔记)

最近的工作有点烦&#xff0c;一个月左右的时间全是在帮别人做视频的过程&#xff08;在我所在的行业里&#xff0c;就是打杂&#xff09; 因为自己不专业&#xff0c;所有的操作都是现学现用&#xff0c;前几个视频还好说&#xff0c;随便剪剪&#xff0c;就是看他们本人录的…

水务行业怎么运用智能配电

摘要&#xff1a;在构建智慧水务和“双碳”时代背景下&#xff0c;智能配电系统在水务行业中发挥日益突出的重要作用。本文首先回顾了智能配电系统在水务行业的发展历程&#xff0c;并对其应用现状进行了分析&#xff0c;进而展望了智能配电系统在水务行业的发展趋势。 关键词&…

走进小程序【五】微信小程序架构之【逻辑层】详解

文章目录 &#x1f31f;前言&#x1f31f;小程序架构&#x1f31f;逻辑层 App Service&#x1f31f;注册小程序&#x1f31f;注册页面&#x1f31f;使用 Page 构造器注册页面&#x1f31f;在页面中使用 behaviors&#x1f31f;使用 Component 构造器构造页面 &#x1f31f;页面…

信创实力认证,创邻科技荣获“2023爱分析·信创产品及服务创新奖”

近日&#xff0c;数字化市场研究咨询机构爱分析正式发布“2023爱分析信创产品及服务创新奖”评选结果。经过申报、初评、调研、终评多轮角逐&#xff0c;创邻科技凭借自研产品Galaxybase国产原生高性能图平台以及国产化替代方案成功获评“2023爱分析信创产品及服务创新奖”。 据…