vue3-组件通信
Vue3
组件通信和Vue2`的区别:
- 移出事件总线,使用
mitt代替
vuex换成了pinia把
.sync优化到了v-model里面把
$listeners所有的东西,合并到$attrs
$children被移除
自定义事件(与vue2语法差异)
自定义事件常用于子组件向父组件传递数据
原生事件:特点的click、hover等
自定义事件:事件名是任意名称,事件对象$event: 是调用emit时所提供的数据,可以是任意类型
在子组件声明自定义事件
// 使用defineEmits在子组件声明一个test自定义事件
// 参数是一个数组,可以包含多个自定义事件
const emit = defineEmits(["test"])
在父组件绑定自定义事件
<!-- 在父组件的子组件标签里面,绑定test事件,触发getInfo回调 -->
<!-- 回调函数在父组件中 -->
<UserInfo @test="getInfo"></UserInfo>
在子组件触发自定义事件
// 在子组件中主动触发自定义事件
// 触发事件的名称,要传递的数据
emit("test",100)
mitt
与消息订阅与发布(
pubsub)功能类似,可以实现任意组件间通信
安装mitt
npm i mitt
创建mitt
// src/utils/emitter.ts // 引入
import mitt from "mitt"; // 创建emitter,emitter可以绑定、触发事件
const emitter = mitt() export default emitter绑定事件
// 要绑定的事件名,和处理的回调方法
emitter.on("test1",(value)=>{
console.log("on test1",value)
})
触发事件
// 要触发的组件名和传递的参数,在任意地方触发,所有绑定了对应事件的地方都会收到
emitter.emit("test1", 6666)
查看全部事件
emitter.all
解绑指定事件
emitter.off("test1")
清理全部事件
emitter.all.clear()
在接收数据的组件中,组件销毁之前解绑事件
// 生命周期钩子
onUnmounted(()=>{
// 解绑事件
emitter.off('test')
})
v-model(与vue2实现区别)
实现父组件、子组件直接互相通信
v-model的原理
<!-- 实现双向绑定-->
<input type="text" v-model="user"> <!-- v-model的本质是:先单向绑定user,然后有输入事件的时候,再将user赋值为输入的数据 -->
<input
type="text"
:value="user"
@input="user =(<HTMLInputElement>$event.target).value"
>
组件标签上的v-model
<!-- 单纯v-model无法实现和子组件双向绑定 -->
<UserInfo v-model="user"></UserInfo> <!-- 本质是: modelValue单向绑定数据到页面的显示,数据变化的时候 将user赋值为传递的数据 -->
<UserInfo :modelValue="user" @update:model-value="user = $event" ></UserInfo> <!--
user=$event的解释
原生事件:$event是事件对象,target.value就是对应的值
自定义事件,$event就是触发事件是所传递的值
-->父组件和子组件双向通信:
<UserInfo v-model="user"></UserInfo>
在子组件中
// 接收v-model的modelValue
defineProps(["modelValue"]) // 声明事件
const emit = defineEmits(['update:model-value'])
<!-- value是props接收的modelValue,触发输入事件的时候,触发emit触发update,值是event.target.value-->
<input type="text" :value="modelValue" @input="emit('update:model-value',(<HTMLInputElement>$event.target).value)">修改modelValue
<!-- :test 相当于不再使用modelValue传递数据,而是使用test -->
<UserInfo v-model:test="user"></UserInfo> <!-- 该方式一个表情上可以绑定多个不同的数据 -->
<UserInfo v-model:test="user" v-model:test2="user2"></UserInfo>
// 接收
defineProps(["test","test2"]) // 声明
const emit = defineEmits(['update:test','update:test2'])
<input type="text" :value="test" @input="emit('update:test',(<HTMLInputElement>$event.target).value)">
$attrs
$attrs用于实现当前组件的父组件,向当前组件的子组件通信(祖→孙)
$attrs是一个对象,包含所有父组件传入的标签属性,会自动排除props中声明的属性(可以认为声明过的props被子组件自己消费了)
父组件
<!-- 向子组件以props的形式传递 list 和user-->
<UserInfo :list="list" :name="user"></UserInfo>
当前组件
props只接收了name
// 当前组件只接受了name
defineProps(["name"])
使用attrs将没有接收的数据,向子传递
<Info v-bind="$attrs"></Info>
子组件
// 祖先传递的props,父组件没有接收,通过attrs,在孙组件使用props接受
// 如果在父组件props使用了,则子组件接收不到
defineProps(['list'])
可以在祖先中实现一个方法,传递给子孙,子孙中触发,实现子孙向祖先传递数据
$refs
$refs用于 :父向子传递数据
- 值为对象,包含所有被
ref属性标识的DOM元素或组件实例
ref属性
<UserInfo ref="userObj "></UserInfo>
// 通过该方法可以获取子组件实例对象,进行对应的操作,在子组件要进行defineExpose操作,将数据交给外部
let userObj = ref()$refs
// 回调函数,触发的地方参数传递$refs
function getAll(v){
// v是一个对象,包含所有有ref属性的子组件实例、DOM元素
console.log(v)
}
<!-- 参数传递$refs -->
<button @click="getAll($refs)"></button>
$parent
$parent用于:子向父传递数据
- 值为对象,当前组件的父组件实例对象
父组件中,使用defineExpose将允许子操作的数据暴露出去
子组件
// 回调函数,parent需要传递$parent
function getAll(parent){
// parent是一个对象,是当前组件的父组件的实例
console.log(parent)
}
<!-- 参数传递$parent -->
<button @click="getAll($parent)"></button>
provide和inject
实现祖孙组件直接通信,不需要通过中间组件
在祖先中通过provide配置向后代组件提供数据
import {provide} from 'vue'
// 给子孙提供的key、Value
provide("user",user)
// 也可以value传递一个对象,批量传递数据,也可以传递方法
在所有后代中都能通过inject配置声明接收的数据
import {inject} from 'vue'
// 接收祖先中传递的user
let user = inject("user")
插槽(部分语法区别)
默认插槽
父组件中编写代码
<!-- 在组件标签中嵌套代码-->
<UserInfo>
<p>hello world</p> </UserInfo>子组件
<template>
<!-- 在子组件中,合适的地方使用slot,决定代码显示在哪里, 如果父没有嵌套代码,则会显示默认内容-->
<slot> <p>default</p></slot> </template>
具名插槽
使用名字定义、使用插槽,可以插入多段不同名字的插槽代码
如果不定义名字,默认插槽的名字默认是default,在组件中使用多个默认擦嘴,因为都是default,会有数量问题
给插槽定义名字
<UserInfo>
<!-- v-slot 只能卸载组件标签和template -->
<template v-slot:p-message>
<p>hello world</p> </template> </UserInfo>
<!-- 简写方式 使用#代替 v-slot-->
<template #:p-message>
子组件使用
<slot name="p-message"></slot>
作用域插槽
数据在组件的自身,数据生成的结构由组件的使用者来决定
子组件
<!-- listData是子组件的数据 使用该方式,将listData传递到父组件 -->
<slot :listData='listData'></slot>
父组件
<!-- 如果又有名字又有参数,v-slot:插槽名字=参数名 --> <template v-slot="params">
<!-- params是自定义接收的名称,是一个对象 --> <!-- 怎么使用数据、什么结构,由父组件决定-->
<ul>
<li v-for=" data of params.ListData" :key="data.id">{{data.name}}</li>
</ul> </template>
vue3-组件通信的更多相关文章
- Vue中组件通信的几种方法(Vue3的7种和Vue2的12种组件通信)
Vue3组件通信方式: props $emit expose / ref $attrs v-model provide / inject Vuex 使用方法: props 用 props 传数据给子组 ...
- 【Vue】计算属性 监听属性 组件通信 动态组件 插槽 vue-cli脚手架
目录 昨日回顾 1 计算属性 插值语法+函数 使用计算属性 计算属性重写过滤案例 2 监听属性 3 组件介绍和定义 组件之间数据隔离 4 组件通信 父子通信之父传子 父子通信之子传父 ref属性 扩展 ...
- 关于React的父子组件通信等等
//==================================================此处为父子组件通信 1.子组件调用父组件: 父组件将子组件需要调用方法存入props属性内,子组 ...
- Angular2 组件通信
1. 组件通信 我们知道Angular2应用程序实际上是有很多父子组价组成的组件树,因此,了解组件之间如何通信,特别是父子组件之间,对编写Angular2应用程序具有十分重要的意义,通常来讲,组件之间 ...
- vue.js入门(3)——组件通信
5.2 组件通信 尽管子组件可以用this.$parent访问它的父组件及其父链上任意的实例,不过子组件应当避免直接依赖父组件的数据,尽量显式地使用 props 传递数据.另外,在子组件中修改父组件的 ...
- Intent进行组件通信的一些体会
Intent进行组件通信的原理 l Intent协助应用间的交互与通讯 Intent负责对应用中一次操作的动作.动作涉及数据.附加数据进行描述.Android则根据此Intent的描述,负责找到对应 ...
- 进程外组件通信之免注册com通信【原创】
最近在搞进程外组件通信的东西,写了个demo,免注册的,一直没调通,其实就是两个问题卡了好几天,也没找到有用的资料,试了好几天终于才解决,现简单记录下来,免得大家跟我走一样的弯路.下面com端程序名称 ...
- vue2.0 组件通信
组件通信: 子组件要想拿到父组件数据 props 子组件不允许直接给父级的数据, 赋值操作如果想更改,父组件每次穿一个对象给子组件, 对象之间引用. 例子: <script> window ...
- React之组件通信
组件通信无外乎,下面这三种父子组件,子父组件,平行组件(也叫兄弟组件)间的数据传输.下面我们来分别说一下: 父子组件: var Demo=React.createClass({ getInitialS ...
- Vue 非父子组件通信
组件是Vue核心的一块内容,组件之间的通信也是很基本的开发需求.组件通信又包括父组件向子组件传数据,子组件向父组件传数据,非父子组件间的通信.前两种通信Vue的文档都说的很清楚,但是第三种文档上确只有 ...
随机推荐
- SQL server temporal table 学习笔记
refer: https://blog.csdn.net/Hehuyi_In/article/details/89670462 https://docs.microsoft.com/en-us/sql ...
- Azure Computer Vision 之 Smart Crop 智能裁剪图片
前言 一个网站通常有许多地方会用到同一张图,但是比例又不一样. 一般的做法就是用 CSS 的 cover 和 contain 来处理. 由于 cover 只会保留中间信息, 所以很多时候需要人工裁剪. ...
- 数字产品护照 (DPP) 解决方案:利用 Blazor 和区块链实现产品全生命周期追踪
数字产品护照 (DPP) 解决方案:利用 Blazor 和区块链实现产品全生命周期追踪 随着全球对可持续发展和产品透明度的关注日益增加,企业需要一种可靠的方法来跟踪和管理产品生命周期中的关键数据.我们 ...
- Windows安装Powershell7.x
事件起因: 由于需要运行一个脚本,但是该脚本是广大网友群众使用Powershell7写的,我自带的是Powershell5,运行过程中总是出现莫名其妙的问题,于是决定将Powershell升级到Pow ...
- 2023年11月中国数据库排行榜:OPO组合持续两月,亚信、中兴闯进前十
长夜之中蓄力待,势如破晓初光披. 2023年11月的 墨天轮中国数据库流行度排行 火热出炉,本月共有283个数据库参与排名.本月排行榜前十名变动较大,TiDB 上升一位居第4,达梦奋勇向前重归第6,亚 ...
- ChallengeMobile
解题思路 获取到输入的字符串保存到s,调用Jformat方法对s进行验证,返回true则代表输入字符串正确反之错误. Jformat方法分析: 首先看到使用了LoadData加载了"ming ...
- vue前端开发仿钉图系列(3)右侧画点线面的开发详解
项目开发是完全仿照钉图的功能,参照钉图的逻辑和高德地图的参考手册以及aip文档,一点点的把功能做出来并呈现最后的效果.选中画点,在地图上获取经纬度并进行反地理编码,添加marker并弹出右侧编辑页面, ...
- Android复习(三)清单文件中的元素——>action、activity-alias、category、compatible-screens、data
<action> 语法: <action android:name="string" /> 包含于: <intent-filter> 说明: ...
- MySQL数据的导出
有时需要将MySQL数据库中的数据导出到外部存储文件中,MySQL数据库中的数据可以导出成sql文本文件.xml文件或者html文件.本节将介绍数据导出的常用方法. 11.4.1 使用SELECT- ...
- 160. 相交链表 Golang实现
题目描述: 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点.如果两个链表不存在相交节点,返回 null . 注意这里的相交节点表示的是值和物理位置都相同的 ...
