组件通信(props,emit,mitt,v-model,$attrs,$refs,$parent,provide和inject)

news2024/10/8 18:32:22

一、props

<template>
  <h3>父组件</h3>
  <span v-if='toy'>儿子给的玩具{{toy}}</span>
  <Child :car='car' :getToy='getToy'></Child>
</template>
<script setup>
import  Child from './Child.vue'
import {ref} from 'vue'
let car=ref('宝马')
let toy=ref('')
const getToy=(value)=>{
  toy.value=value
}
</script>

<template>
  <h4>子组件父亲给的车{{props.car}}</h4>
  <button @click='getToy(toy)'> 把玩具给父亲</button>
</template>
<script setup>
import{ref,defineProps} from 'vue'
const props=defineProps(['car','getToy'])
let toy=ref('奥特曼')
</script>

二、自定义事件CustomEvent

<template>
  <h3>父组件</h3>
  <span v-if='toy'>儿子给的玩具{{toy}}</span>
  <hr>
  <Child @getToy='getToy'></Child>
</template>
<script setup>
import  Child from './Child.vue'
import {ref} from 'vue'
let toy=ref('')
const getToy=(value)=>{
  toy.value=value
}
</script>

<template>
  <h4>子组件玩具{{toy}}</h4>
  <button @click='getToy'> 把玩具给父亲</button>
</template>
<script setup>
import{ref,defineEmits} from 'vue'
const emit = defineEmits(['getToy'])
let toy=ref('奥特曼')
const getToy=()=>{
  emit('getToy',toy.value)
}
</script>

三、mitt

npm i mitt

utils/emitter.js
//引入mitt
import mitt from 'mitt';
//调用mitt得到emitter,emitter能绑定事件,触发事件
const emitter=mitt();
// //绑定事件
// emitter.on('test1',()=>{
//     console.log('test1事件被调用');
// })
// emitter.on('test2',()=>{
//     console.log('test2事件被调用');
// })
// setInterval(()=>{
//     emitter.emit('test1')
//     emitter.emit('test2')
// },1000)
// setTimeout(()=>{
//     // emitter.off('test1')
//     // emitter.off('test2')
//     emitter.all.clear()
// },5000)
export default emitter;
<template>
  <h4>子组件1玩具{{toy}}</h4>
  <p v-if='eat'>老二给的零食{{eat}}</p>
  <button @click='getToy'> 把玩具给老二</button>
</template>
<script setup>
import{ref,onUnmounted} from 'vue'
import emitter from '../../utils/emitter'
let toy=ref('奥特曼')
let eat=ref('')
const getToy = ()=>{
  emitter.emit('send-toy',toy.value)
}
emitter.on('send-eat',(value)=>{
  eat.value=value
})
onUnmounted(()=>{
  emitter.off('send-eat')
})
</script>

<template>
  <h4>子组件2零食{{eat}}</h4>
  <p v-if='toy'>老大给的玩具{{toy}}</p>
  <button @click='sendEat'> 把零食给老大</button>
</template>

<script setup>
import{ref,onUnmounted} from 'vue'
import emitter from '../../utils/emitter'
let eat=ref('奥利奥')
let toy=ref('')
emitter.on('send-toy',(value)=>{
  toy.value=value
})
const sendEat=()=>{
  emitter.emit('send-eat',eat.value)
}
onUnmounted(()=>{
  emitter.off('send-toy')
})
</script>

四、v-model

UI组件库,组件封装会用

1.v-model用在html标签上
<template>
  <h3>父组件</h3>
  <!-- v-model用在html标签上 -->
  <input type="text" :value="username" @input="$event.target.value">
  <input type="text" v-model="username">
</template>
<script setup>
import {ref} from 'vue'
let username=ref('张三')
</script>
2. v-model用在组件标签上
<template>
  <h3>父组件</h3>
  <!-- v-model用在组件标签上 -->
  <CustomInput v-model="username" />
  <!-- <CustomInput :modelValue="username" @update:modelValue="username=$event" /> -->
</template>

<script setup>
import  CustomInput from './CustomInput.vue'
import {ref} from 'vue'
let username=ref('张三')
</script>

<template>
  <input type="text" :value="props.modelValue" @input="emit('update:modelValue',$event.target.value)"><br>
</template>
<script setup>
import{ref,defineProps} from 'vue'
const props=defineProps(['modelValue'])
const emit=defineEmits(['update:modelValue'])
</script>

对于原生事件,$event就是事件对象

对于自定义事件,$event就是触发事件时,所传递的数据

<template>
  <h3>父组件</h3>
  <!-- v-model用在组件标签上 -->
  <CustomInput v-model:name="username" v-model:pass="password" />
</template>
<script setup>
import  CustomInput from './CustomInput.vue'
import {ref} from 'vue'
let username=ref('张三')
let password=ref('123456')
</script>

<template>
  <input type="text" :value="props.name" @input="emit('update:name',$event.target.value)"> 
  <br> 
  <input type="text" :value="props.pass" @input="emit('update:pass',$event.target.value)"> 
  <br> 
</template>
<script setup>
import{ref,defineProps} from 'vue'
const props=defineProps(['name','pass'])
const emit=defineEmits(['update:name','update:pass'])
</script>

五、$attrs

$attrs会自动排除props中声明的属性

<template>
  <h3>父组件</h3>
  a:{{a}}b:{{b}}c:{{c}}d:{{d}}
  <Child :a='a' :b='b' :c='c' :d='d' v-bind='{x:100,y:200}' :updateA='updateA'/>
</template>
<script setup>
import  Child from './Child.vue'
import {ref} from 'vue'
let a=ref('1')
let b=ref('2')
let c=ref('3')
let d=ref('4')
const updateA=(val)=>{
  a.value+=val
}
</script>

<template>
  <h4>子组件</h4>
  <ul>
    <li> a:{{props.a}}</li>
    <li>
      其他{{$attrs}}
    </li>
  </ul>
  <GrandChild v-bind='$attrs'/>
</template>
<script setup>
import  GrandChild from './GrandChild.vue'
import{ref,defineProps} from 'vue'
const props=defineProps(['a'])
</script>

<template>
  <h4>孙组件</h4>
  <ul>
    <li>a:{{props.a}}</li>
    <li>b:{{props.b}}</li>
    <li>c:{{props.c}}</li>
    <li>d:{{props.d}}</li>
    <li>x:{{props.x}}</li>
    <li>y:{{props.y}}</li>
  </ul>
  <button @click='updateA(6)'>更新A</button>
</template>
<script setup>
import{ref,defineProps} from 'vue'
const props=defineProps(['a','b','c','d','x','y','updateA'])
</script>

六、$refs,$parent

1.$refs
<template>
  <h3>父组件</h3>
  <button @click='changeChild1'>修改child1的玩具</button>
  <button @click='changeChild2'>修改child2的零食</button>
  <Child1 ref='child1'/>
  <Child2 ref='child2'/>
  <button @click='getAllChild($refs)'>获取所有子组件实例对象</button>
</template>
<script setup>
import  Child1 from './Child1.vue'
import  Child2 from './Child2.vue'
import {ref} from 'vue'
let child1=ref('')
let child2=ref('')
const changeChild1=()=>{
  child1.value.toy='小猪佩奇'
}
const changeChild2=()=>{
  child2.value.eat='汉堡'
}
const getAllChild=(refs)=>{
  console.log('refs',refs);
  for(let key in refs){
    refs[key].number+=3
  }
}
</script>

<template>
  <h4>子组件1玩具{{toy}}个数{{number}}</h4>
</template>
<script setup>
import{ref,defineExpose} from 'vue'
let toy=ref('奥特曼')
let number=ref(5)
defineExpose({toy,number})
</script>

<template>
  <h4>子组件2零食{{eat}} 个数{{number}}</h4>
</template>
<script setup>
import{ref,defineExpose} from 'vue'
let eat=ref('奥利奥')
let number=ref(3)
defineExpose({eat,number})
</script>
2.$parent
<template>
  <h3>父组件{{number}}</h3>
  <Child1 ref='child1'/
</template>
<script setup>
import  Child1 from './Child1.vue
import {ref} from 'vue'
let child1=ref('')
let number=ref(10)
defineExpose({number})
</script>

<template>
  <h4>子组件1玩具{{toy}}个数{{number}}</h4>
  <button @click=minusFather($parent)>修改父组件</button>
</template>
<script setup>
import{ref,defineExpose} from 'vue'
let toy=ref('奥特曼')
let number=ref(5)
const minusFather=(parent)=>{
  parent.number+=1
}
</script>

七、provide,inject

<template>
  <h3>父组件</h3>
  {{money}}
  品牌{{car.brand}}价格{{car.price}}数量{{car.count}}
  <Child />
</template>
<script setup>
import  Child from './Child.vue'
import {ref,reactive,provide} from 'vue'
let money=ref(100)
let car=reactive({
  brand:'宝马',
  price:'22w',
  count:3
})
const updateMoney=(val)=>{
  money.value-=val
}
provide('moneyContext',{money,updateMoney})
provide('car', car)
</script>

<template>
  <h4>子组件</h4>
  <GrandChild />
</template>
<script setup>
import  GrandChild from './GrandChild.vue'
</script>

<template>
  <h4>孙组件</h4>
  <p>{{money}} <button @click="updateMoney(5)">花钱</button>  </p>
  {{car.brand}}{{car.price}}{{car.count}}
</template>
<script setup>
import{ref,inject} from 'vue'
let {money,updateMoney}=inject('moneyContext',{money:0,updateMoney:()=>{}})
let car=inject('car',{brand:'xx',price:'xxx',count:'xxx'})
</script>

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

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

相关文章

JVM实现跨平台的关键因素:class文件和“翻译器”

文章目录 前言关键因素&#xff1a;class文件class文件格式说明Java 源代码在class文件中的体现涉及到的知识点&#xff08;面试题&#xff09; 关键因素&#xff1a;“翻译器”解释器即时编译器&#xff08;JIT&#xff09; 总结 前言 当你通过上文对JVM有了初步的认识后&…

【电路】1.3 电功率和能量

1.3 电功率和能量 电是一种能量存在形式。 1.3.1 电压的定义 将单位正电荷由A点移动至B点&#xff0c;电场力所做的功是 w w w&#xff0c;则 u A B d w d q u_{AB}\frac{dw}{dq} uAB​dqdw​&#xff0c; w w w是功&#xff0c; q q q是电荷量从A到B&#xff0c;沿着任意路…

Squid + Stunnel 配置

环境&#xff1a; 亚马逊服务器一台&#xff1a;3.26.80.132 华为云服务器一台&#xff1a;122.59.52.68 客户机一台&#xff1a; Win11 实现的需求&#xff1a;客户机通过设置华为云代理&#xff0c;实现透过亚马逊服务器上网 一、亚马逊服务器 1、安装Squid https://bl…

刚转Mac的新手如何卸载不需要的应用程序

最开始转Mac系统的时候很是苦恼&#xff0c;到底该怎么卸载App啊&#xff0c;App直接拖到废纸篓真的能卸载干净吗&#xff0c;卸载App时会不会留下一些文件残留&#xff0c;慢慢的会不会占满内存&#xff0c;于是我找到了一个免费的卸载工具——XApp。 这是一款Mac应用程序卸载…

《贪吃蛇小游戏 1.0》源码

好久不见&#xff01; 终于搞好了简易版贪吃蛇小游戏&#xff08;C语言版&#xff09;&#xff0c;邀请你来玩一下~ 目录 Snake.h Snake.c test.c Snake.h #include<stdio.h> #include<windows.h> #include<stdbool.h> #include<stdlib.h> #inclu…

某国有资本运营中心人才选拔项目纪实

某国有资本运营中心人才选拔项目纪实 【客户行业】 政府与事业单位 【问题类型】 人才招聘选拔 【客户背景】 在三年国企改革过程中&#xff0c;南方某省政府为响应国家政策&#xff0c;提出组建专业化国有资本投资运营公司&#xff0c;大力开展专业化资本运营&#xff0c;…

016 规格参数

文章目录 新增AttrController.javaAttrVo.javaAttrServiceImpl.javaAttrAttrgroupRelationEntity.javaAttrEntity.javaAttrGroupEntity.java 查询AttrController.javaAttrServiceImpl.javaAttrRespVo.java 修改回显AttrController.javaAttrServiceImpl.java 修改提交AttrContro…

京东云主机和云服务器有啥区别?轻量云主机就是轻量应用服务器吗?

京东云主机和云服务器有啥区别&#xff1f;轻量云主机就是轻量应用服务器吗&#xff1f;云主机就是云服务器的意思&#xff0c;是京东云给自家云服务器取的名字&#xff0c;阿里云叫云服务器ECS&#xff0c;腾讯云叫云服务器CVM&#xff0c;京东云服务器叫云主机&#xff0c;京…

C++ osgEarth 多窗口 同步绘制geometry

开发环境&#xff1a; win10 64bit、Qt5.15.2、C 、MSVC2019 、osg3.5.6、 osgEarth3.1 接触osgEarth不久&#xff0c;贴出来&#xff0c;希望大家指正。 注意osgEarth版本。 采用观察者设计模式&#xff0c;设置 master 和 slave 窗口&#xff0c;通过管理类和信号槽维护窗…

_c++11

嗨喽大家好呀&#xff0c;今天阿鑫给大家带来的是c进阶——c11的内容&#xff0c;好久不见啦&#xff0c;下面让我们进入本节博客的内容吧&#xff01; _c11 统一的列表初始化右值引用可变模板参数(了解&#xff0c;不常接触)lambda表达式function和bind包装器 1. 统一的列表…

JavaWeb 15.详解Servlet及其源码

所有受过的委屈&#xff0c;都在提醒你 要好好争气。 —— 24.10.7 一、Servlet简介 1.动态资源和静态资源 静态资源 无需在程序运行时通过代码运行生成的资源&#xff0c;在程序运行之前就写好的资源&#xff0c;例如&#xff1a;html、css、js、img、音频文件和视频文件 …

职场秘籍:面试加薪,竟然拥有不同的技巧!

假如你是一位测试主管&#xff0c;去评价一名测试工程师是否优秀&#xff0c;那么你将如何去判断呢&#xff1f;你最看重的是哪方面的能力呢&#xff1f; 对于这个问题&#xff0c;是不能一概而论的&#xff0c;要分为两种情况&#xff0c;情况不同&#xff0c;答案一定是不同…

高校新生报道管理系统使用SpringBootSSM框架开发

&#xff01;&#xff01;&#xff01;页面底部,文章结尾,加我好友,获取计算机毕设开发资料 目录 一、引言 二、相关技术介绍 三、系统需求分析 四、系统设计 五、关键技术实现 六、测试与优化 七、总结与展望 一、引言 当前高校新生报到过程中存在许多问题&#xff0c;…

从0到1:用Python构建你人生中的第一个人工智能AI模型

文章目录 摘要引言数据预处理&#xff1a;为模型打下坚实基础数据预处理的步骤Python示例代码说明&#xff1a;注意事项&#xff1a; 模型建立&#xff1a;选择合适的模型神经网络示例代码说明&#xff1a; 模型训练与测试训练示例代码说明&#xff1a; 解读模型结果性能指标 深…

原生小程序开发|小程序卡片(Widget) 开发指南

开发 Widget 代表应用的一个小程序卡片&#xff0c;负责小程序卡片的展示和交互。 小程序卡片(Widget) 的开发在智能小程序的基础上增加一个目录即可&#xff0c;用于存放小程序卡片(Widget)的代码。并在 project.tuya.json 中增加一个声明。 创建小程序卡片(Widget)项目 在 …

九、Drf序列化器

九、序列化器 9.1序列化 从数据库取QuerySet或数据对象转换成JSON 9.1.1序列化器的简易使用 #新建一张部门表 class Depart(models.Model):title=models.CharField(verbose_name=部门,max_length=32)order=models.IntegerField(verbose_name=顺序)count=models.IntegerFiel…

vscode中安装python的包

首先需要调出命令行。然后运行代码&#xff0c;找到你所需要的环境。 PS C:\Users\Administrator\AppData\Local\ESRI\conda\envs\arcgispro-env> conda env list # conda environments: #C:\ProgramData\Anaconda3 base * C:\Users\Administrator\.con…

【无人机设计与控制】无人机三维路径规划,对比蚁群算法,ACO_Astar_RRT算法

摘要 本文探讨了三种不同的无人机三维路径规划算法&#xff0c;即蚁群算法&#xff08;ACO&#xff09;、A算法&#xff08;Astar&#xff09;以及快速随机树算法&#xff08;RRT&#xff09;。通过仿真实验对比了各算法在不同环境下的性能&#xff0c;包括路径长度、计算效率…

软考越来越难了,2024年软考究竟还值不值得考?

最近不少同学沟通&#xff0c;聊到软考现在越来越难了&#xff0c;考了两三次都没过&#xff0c;也有不少新同学咨询软考考试的一些福利政策&#xff0c;投入大量的物力&#xff0c;财力&#xff0c;精力&#xff0c;那么到底软考值不值得考呢&#xff1f; 01 / 关于软考 软考…

【FlagScale】异构算力混合训练方案

背景以及必要性 算力需求的高峰&#xff1a;随着人工智能&#xff08;AI&#xff09;和生成内容&#xff08;AIGC&#xff09;的发展&#xff0c;对计算资源的需求急剧增加。尤其是参数规模达到数百亿的大模型训练&#xff0c;需要大量的计算资源。 算力市场供应紧张&#xff…