首页 > 其他分享 >Vue3中组件通信的几种方式

Vue3中组件通信的几种方式

时间:2024-09-14 15:29:50浏览次数:17  
标签:toy value 几种 事件 Vue3 组件 import emitter


Vue3组件通信和Vue2的区别:

  • 移出事件总线,使用mitt代替。
  • vuex换成了pinia
  • .sync优化到了v-model里面了。
  • $listeners所有的东西,合并到$attrs中了。
  • $children被砍掉了。

【1】props

概述:props是使用频率最高的一种通信方式,常用与 :父 ↔ 子

  • 父传子:属性值是非函数
  • 子传父:属性值是函数

父组件:

<template>
  <div class="father">
    <h3>父组件</h3>
		<h4>汽车:{{ car }}</h4>
		<h4 v-show="toy">子给的玩具:{{ toy }}</h4>
		//传递数据和方法
		<Child :car="car" :sendToy="getToy"/>
  </div>
</template>

<script setup lang="ts" name="Father">
	import Child from './Child.vue'
	import {ref} from 'vue'
	// 数据
	let car = ref('奔驰')
	let toy = ref('')
	// 方法
	function getToy(value:string){
		toy.value = value
	}
</script>

子组件:

<template>
  <div class="child">
    <h3>子组件</h3>
		<h4>玩具:{{ toy }}</h4>
		<h4>父给的车:{{ car }}</h4>
		// 点击会触发父组件的方法
		<button @click="sendToy(toy)">把玩具给父亲</button>
  </div>
</template>

<script setup lang="ts" name="Child">
	import {ref} from 'vue'
	// 数据
	let toy = ref('奥特曼')
	// 声明接收props
	defineProps(['car','sendToy'])
</script>

【2】自定义事件

  1. 概述:自定义事件常用于:子 => 父。
  2. 注意区分好:原生事件、自定义事件。
  • 原生事件:
  • 事件名是特定的(clickmosueenter等等)
  • 事件对象$event: 是包含事件相关信息的对象(pageXpageYtargetkeyCode
  • 自定义事件:
  • 事件名是任意名称
  • 事件对象$event: 是调用emit时所提供的数据,可以是任意类型!!!

父组件

<template>
  <div class="father">
    <h3>父组件</h3>
		<h4 v-show="toy">子给的玩具:{{ toy }}</h4>
		<!-- 给子组件Child绑定事件 -->
    <Child @send-toy="saveToy"/>
  </div>
</template>

<script setup lang="ts" name="Father">
  import Child from './Child.vue'
	import { ref } from "vue";
	// 数据
	let toy = ref('')
	// 用于保存传递过来的玩具
	function saveToy(value:string){
		console.log('saveToy',value)
		toy.value = value
	}
</script>

子组件

<template>
  <div class="child">
    <h3>子组件</h3>
		<h4>玩具:{{ toy }}</h4>
		<button @click="emit('send-toy',toy)">测试</button>
  </div>
</template>

<script setup lang="ts" name="Child">
	import { ref } from "vue";
	// 数据
	let toy = ref('奥特曼')
	// 声明事件
	const emit =  defineEmits(['send-toy'])
</script>

【3】mitt

概述:与消息订阅与发布(pubsub)功能类似,可以实现任意组件间通信。

安装mitt

npm i mitt

新建文件:src\utils\emitter.ts

// 引入mitt 
import mitt from "mitt";
// 创建emitter
const emitter = mitt()

// 暴露mitt
export default emitter

接收数据的组件中:绑定事件、同时在销毁前解绑事件:

import emitter from "@/utils/emitter";
import { onUnmounted } from "vue";

// 绑定事件
emitter.on('send-toy',(value)=>{
  console.log('send-toy事件被触发',value)
})

onUnmounted(()=>{
  // 解绑事件
  emitter.off('send-toy')
})

提供数据的组件,在合适的时候触发事件

import emitter from "@/utils/emitter";

function sendToy(){
  // 触发事件
  emitter.emit('send-toy',toy.value)
}


标签:toy,value,几种,事件,Vue3,组件,import,emitter
From: https://blog.51cto.com/Janusel/12017049

相关文章

  • Vue3中Pinia存储和修改数据应用实践
    安装pinia:npminstallpiniamain.ts中使用pinia://引入createApp用于创建应用import{createApp}from'vue'//引入App根组件importAppfrom'./App.vue'//引入路由器importrouterfrom'./router'//创建一个应用constapp=createApp(App)//使用路由器app.use......
  • Vue3中路由传参的几种方式实践
    【1】RouterLink+query父组件脚本如下:<scriptsetuplang="ts"name="News">import{reactive}from'vue'import{RouterView,RouterLink}from'vue-router'constnewsList=reactive([{id:'asfdtrfay01',......
  • Vue2/Vue3中编程式路由导航实践总结
    【1】Vue2编程式路由导航①router.push除了使用<router-link>创建a标签来定义导航链接,我们还可以借助router的实例方法,通过编写代码来实现。router.push(location,onComplete?,onAbort?)注意:在Vue实例内部,你可以通过$router访问路由实例。因此你可以调用this.$router......
  • vscode下vue3+vite+ts+eslint项目配置
    一、创建项目pnpmcreatevue@latest注意:是否引入ESLint用于代码质量检测?选择否二、安装依赖pnpmi-Deslint@antfu/eslint-config三、在项目根目录创建文件:eslint.config.js//eslint.config.jsimportantfufrom'@antfu/eslint-config'exportdefaultantfu({......
  • Vue3 + Echarts 实现中国地图
    基本概念    echarts是一个基于JavaScript的开源可视化库,用于创建和展示各种交互式图表和图形。它可以用于数据分析、数据可视化、数据探索和数据报告等方面。我们一般使用echarts来实现数据可视化,本文我们使用vue3+echars来实现中国地图。准备echarts基本结构首......
  • 推荐3款卓越的 .NET 开源搜索组件库
    前言最近有不少同学在提问;.NET有哪些开源的搜索组件库可以推荐的吗?,今天大姚给大家推荐3款卓越的.NET开源搜索组件库,希望可以帮助到有需要的同学。Elasticsearch.NETElasticsearch的.NET客户端为ElasticsearchAPI提供强类型请求和响应。它将协议处理委托给Elastic.Transpo......
  • 推荐3款卓越的 .NET 开源搜索组件库
    前言最近有不少同学提问;.NET有哪些开源的搜索组件库可以推荐的吗?,今天大姚给大家推荐3款卓越的.NET开源搜索组件库,希望可以帮助到有需要的同学。Elasticsearch.NETElasticsearch的.NET客户端为ElasticsearchAPI提供强类型请求和响应。它将协议处理委托给Elastic.Trans......
  • Form组件
    1.1初识Form组件基于注册为例来进行测试。详细见示例:1-form组件.zip1.2错误信息1.3展示所有的字段对象和可迭代对象。1.4问题:关于样式手动操作classRegisterForm(forms.Form):v1=forms.CharField(label="手机号",required=True,......
  • uniapp - 最新详细实现web-view网页与安卓苹果App端之间互相通信功能,苹果app/安卓app
    前言在uni-app项目开发中,详解实现web-view和App之间的互相通信完整流程及代码教程,Uniappapp端向webview网站传递数据,同时webview又可以向app端传递数据参数,完成二者的数据通信方案,支持嵌入本地移动端H5页面、第三方网站、自定义网页,附带各种常见问题,解决发送数据通信没......
  • vue3 登录页视频背景 开发
    方法比较笨,可以参考,思路如下:    我把这个页面看成三层。最里面是视频,中间挂个蒙板,然后最上层放内容,这样简单粗暴的达到效果 然后来说说中间这个蒙板吧,主要是两个想法,      一个就是客户,领导们的想法比较多,如果仅仅只是说有个视频虚化啥的,有可能并不能完全解......