父传子

说明:父组件将数据绑定在组件标签上;子组件props接收

父组件:

<template>
<Child :msg="msg" />
</template> <script setup>
import Child from './child.vue'
import { ref } from 'vue' const msg = ref('hello world')
</script>

子组件,使用defineProps接收:

<template>
<div>收到父组件传的值:{{ msg }}</div>
</template> <script setup>
const props = defineProps({
msg: {
type: String
}
})
</script>

子传父

说明:父组件定义自定义事件,绑定在子组件标签上;子组件使用emit,触发方法、传值

父组件:

<template>
<Child @addCount="addCount" @resetCount="resetCount" />
<div>count: {{ count }}</div>
</template> <script setup>
import { ref } from 'vue'
import Child from './child.vue' let count = ref(0) function addCount(e) {
count.value += e
} function resetCount() {
count.value = 0
}
</script>

子组件使用defineEmits声明事件:

<template>
<el-button type="primary" @click="addCount">累加count</el-button>
<el-button type="primary" @click="resetCount">重置count</el-button>
</template> <script setup>
import { defineEmits } from 'vue' const emit = defineEmits(['addCount', 'resetCount']) function addCount() {
emit('addCount', 22)
} function resetCount() {
emit('resetCount')
}
</script>

子组件直接修改父组件传过来的值

父组件:

vue2如果想让子组件能直接修改数据,使用的是.sync, vue3 使用v-model

<template>
<Child v-model:count="count" />
<div>count: {{ count }}</div>
</template> <script setup>
import { ref } from 'vue'
import Child from './child.vue' let count = ref(0)
</script>

子组件:

需要声明一个 update:count 事件

<template>
<el-button type="primary" @click="updateCount">修改count</el-button> </template> <script setup>
import { defineEmits } from 'vue' const props = defineProps({
count: {
type: Number
}
})
const emit = defineEmits(['addCount', 'resetCount', 'update:count']) function updateCount() {
emit('update:count', 100)
}
</script>

defineExpose

使用<script setup>的组件,不会暴露任何声明的变量属性,也就是无法向vue2中:this.$refs.child.data类似这样获取数据

如果想操作,可以使用defineExpose来显式的指定出,需要暴露出去的属性

父组件:

<template>
<el-button type="warning" @click="getChildVal">获取子组件中的值</el-button>
<div>{{ childMsg }}</div> <el-button type="primary" @click="runChildFunc">执行子组件的方法</el-button> <child ref="child" />
</template> <script setup>
import { ref } from 'vue'
import Child from './child.vue' // 必须跟子组件 ref 保持一致
const child = ref(null)
const childMsg = ref('') // 获取子组件的数据
function getChildVal() {
childMsg.value = child.value.msg
} // 执行子组件的方法
function runChildFunc() {
child.value.testFunc()
}
</script>

子组件需要使用defineExpose暴露变量和方法:

<template>
<div v-if="isShow">被父组件执行了,你个吊毛</div>
</template> <script setup>
import { ref } from 'vue' const msg = ref('在座的各位都是辣鸡!!!')
const isShow = ref(false) const testFunc = function () {
isShow.value = !isShow.value
} defineExpose({
msg,
testFunc
})
</script>

ref属性

使用ref获取DOM或者组件实例

与vue2写法的区别,vue2中:

this.$refs.child.data

vue3没有this,需要声明一个 和 标签ref保持一致的响应式变量,进行操作;如果想获取子组件的数据,可以看上面的defineExpose

  • 操作单个组件 或者 DOM
<template>
<child ref="child" />
</template> <script setup>
import Child from './child.vue' // 变量名称必须跟子组件 ref 保持一致
const child = ref() // 如果想获取子组件的数据,可以看上面的defineExpose
console.log(child.value)
console.log(child.value.msg)
</script>
  • 操作多个DOM

定义一个函数,动态绑定到ref上即可

<template>
<ul>
<li v-for="item in 10" :ref="setRef">{{ item }}</li>
</ul>
</template> <script setup>
const setRef = (el) => {
console.log(el)
}
</script>

上面写法不太好区分某个DOM,也可以写成如下:

<template>
<ul>
<li v-for="item in 10" :ref="el => setRef(el, item)">{{ item }}</li>
</ul>
</template> <script setup>
const setRef = (el, item) => {
console.log(el, item)
}
</script>

vue3笔记 - 父子组件通信的更多相关文章

  1. vue 父子组件通信

    算是初学vue,整理一下父子组件通信笔记. 父组件通过 prop 给子组件下发数据,子组件通过事件给父组件发送消息. 一.父组件向子组件下发数据: 1.在子组件中显式地用props选项声明它预期的数据 ...

  2. 关于React的父子组件通信等等

    //==================================================此处为父子组件通信 1.子组件调用父组件: 父组件将子组件需要调用方法存入props属性内,子组 ...

  3. Vue 非父子组件通信

    组件是Vue核心的一块内容,组件之间的通信也是很基本的开发需求.组件通信又包括父组件向子组件传数据,子组件向父组件传数据,非父子组件间的通信.前两种通信Vue的文档都说的很清楚,但是第三种文档上确只有 ...

  4. Vue 非父子组件通信方案

    Vue 非父子组件通信方案 概述 在 Vue 中模块间的通信很普遍 如果是单纯的父子组件间传递信息,父组件可以使用 props 将数据向下传递到子组件,而在子组件中可以使用 events (父组件需要 ...

  5. vue父子组件及非父子组件通信

    1.父组件传递数据给子组件 父组件数据如何传递给子组件呢?可以通过props属性来实现 父组件: <parent> <child :child-msg="msg" ...

  6. Vue(二十六)父子组件通信

    今天写了一个分页公共组件,就出现了父子组件通信的问题,今天来总结下我遇到的父子组件通信问题 一.子组件调取父组件的数据或方法 (1)props 想要把父组件的值,传到子组件中,使用props 比如你在 ...

  7. 三大前端框架(react、vue、angular2+)父子组件通信总结

    公司业务需要,react.vue.angular都有接触[\无奈脸].虽然说可以拓展知识广度,但是在深度上很让人头疼.最近没事的时候回忆各框架父子组件通信,发现很模糊,于是乎稍微做了一下功课,记录于此 ...

  8. Vuejs——(10)组件——父子组件通信

    版权声明:出处http://blog.csdn.net/qq20004604   目录(?)[+]   本篇资料来于官方文档: http://cn.vuejs.org/guide/components ...

  9. 从$emit 到 父子组件通信 再到 eventBus

    故事还是得从$emit说起,某一天翻文档的时候看到$emit的说明 触发当前实例上的事件?就是自身组件上的事件呗,在父子组件通信中,父组件通过props传递给子组件数据(高阶组件可以用provide和 ...

  10. vue2.0父子组件以及非父子组件通信

    官网API: https://cn.vuejs.org/v2/guide/components.html#Prop 一.父子组件通信 1.父组件传递数据给子组件,使用props属性来实现 传递普通字符 ...

随机推荐

  1. SpringCloud入门(四)Ribbon负载均衡

    一.Ribbon负载均衡原理SpringCloud底层其实是利用了一个名为Ribbon的组件,来实现负载均衡功能的. SpringCloudRibbon的底层采用了一个拦截器,拦截了RestTempl ...

  2. 完美转发(模板)--T&&

    在C++模板编程中,完美转发(Perfect Forwarding)是一种技术,旨在保留函数参数的值类别,即在将参数传递到另一个函数时,无论参数是左值还是右值,都能够保持它的原始性质,而不会因为转发丢 ...

  3. OOOPS:零样本实现360度开放全景分割,已开源 | ECCV'24

    全景图像捕捉360°的视场(FoV),包含了对场景理解至关重要的全向空间信息.然而,获取足够的训练用密集标注全景图不仅成本高昂,而且在封闭词汇设置下训练模型时也受到应用限制.为了解决这个问题,论文定义 ...

  4. linux环境nginx配置记录

    nginx环境安装 1.联网下载 pcre压缩包 解压压缩文件使用命令 tar –xvf pcre-8.37.tar.gz ./configure 完成后,回到 pcre 目录下执行 make,最后执 ...

  5. Elasticsearch倒排索引结构【转载】

    一切设计都是为了提高搜索的性能 倒排索引(Inverted Index)也叫反向索引,有反向索引必有正向索引.通俗地来讲,正向索引是通过key找value,反向索引则是通过value找key. 先来回 ...

  6. (系列九)使用Vue3+Element Plus创建前端框架(附源码)

    说明 该文章是属于OverallAuth2.0系列文章,每周更新一篇该系列文章(从0到1完成系统开发). 该系统文章,我会尽量说的非常详细,做到不管新手.老手都能看懂. 说明:OverallAuth2 ...

  7. Java EasyExcel 导出报内存溢出如何解决

    大家好,我是 V 哥.使用EasyExcel进行大数据量导出时容易导致内存溢出,特别是在导出百万级别的数据时.你有遇到过这种情况吗,以下是V 哥整理的解决该问题的一些常见方法,分享给大家,欢迎一起讨论 ...

  8. CAD Plus 使用帮助

    English help 移动端使用帮助 文档更新日期: 2023-07-28; 这篇文章将介绍如何使用CAD Plus app; 如果您有疑问或需要帮助请发送邮件至 3167292926@qq.co ...

  9. OpenCompass使用LawBench数据测评本地Qwen大模型

    一.思维导图展示 二.OpenCompass简介 OpenCompass是一个大模型测评体系,开源.高效.同时集成CompassKit测评工具.CompassHub测评集社区,CompassRank测 ...

  10. 万字长文带你深入Redis底层数据结构

    Redis数据库的数据结构 Redis 的键值对中的 key 就是字符串对象,而 value 就是指Redis的数据类型,可以是String,也可以是List.Hash.Set. Zset 的数据类型 ...