Vue3 组件之间父子通信

news2024/11/23 9:12:54

文章目录

  • Vue3 组件之间父子通信
    • 概述
    • 选项式API
      • 父传子
      • 子传父
    • 组合式API
      • 父传子
      • 子传父

Vue3 组件之间父子通信

概述

所有的 props 都遵循着单向绑定原则,props 因父组件的更新而变化,自然地将新的状态向下流往子组件,而不会逆向传递。

选项式API

父传子

父组件:Father.vue

  • 静态prop:在定义组件时确定值,如abc="ABC"
  • 动态prop:在组件被渲染时确定值,需要使用 v-bind 或缩写 : 来进行动态绑定的 props,如:message="msg":list="list"
  • 每次父组件更新后,所有的子组件中的 props 都会被更新到最新值。
<script>
import Child from "./Child.vue"

export default {
    data() {
        return {
            message: "hello",
            list: ["北京", "上海", "广州"]
        }
    },
    methods: {
        changeMessage() {
            this.message = "你好"
        }
    },
    components: {
        Child
    }
}
</script>

<template>
    <h2>父组件</h2>
	<button @click="changeMessage">修改message</button>
    <Child abc="ABC" :message="message" :list="list"></Child>
</template>

子组件:Child.vue

需要通过props属性接收来自父组件的数据,子组件不能直接修改接收到值——单项数据流。

方式一:只接收

<script>
export default {
    props: ["abc", "message", "list"]
}
</script>

<template>
    <h2>子组件</h2>
    <p>abc: {{ abc }}</p>
    <p>message: {{ message }}</p>
    <p>list: {{ list }}</p>
</template>

在这里插入图片描述

方式二:限制类型

支持类型:

  • String
  • Number
  • Boolean
  • Array
  • Object
  • Date
  • Function
  • Symbol
<script>
export default {
    props: {
        abc: String,
        message: String,
        list: Array
    }
}
</script>

<template>
    <h2>子组件</h2>
    <p>abc: {{ abc }}</p>
    <p>message: {{ message }}</p>
    <p>list: {{ list }}</p>
</template>

方式三:限制类型、限制必填、指定默认值

  • type
  • required
  • default
<script>
export default {
    props: {
        abc: {
            type: String,
            default: "66666"
        },
        message: {
            type: String, //数据类型
            default: "你好", //默认值
            required: true //是否必填
        },
        list: {
            type: Array,
            default() { //默认值,对象或数组需要调用default()方法
                return []
            }
        }
    }
}
</script>

<template>
    <h2>子组件</h2>
    <p>abc: {{ abc }}</p>
    <p>message: {{ message }}</p>
    <p>list: {{ list }}</p>
</template>

子传父

子组件:Child.vue

<script>
export default {
    data() {
        return {
            childMsg: "哈喽 来自子组件的消息"
        }
    },
    methods: {
        // 第二步:定义事件,传递数据
        sendFatherData() {
            this.$emit("onReceive", this.childMsg)
        }
    }
}
</script>

<template>
    <div>
        <!-- 第一步:发送消息 -->
        <button @click="sendFatherData">向父组件发送数据</button>
    </div>
</template>

<style scoped>
div {
    border: 1px dashed silver;
}
</style>

父组件:Father.vue

<script>
import Child from "./Child.vue"

export default {
    data() {
        return {
            childMsg: ""
        }
    },
    methods: {
        // 第四步:接收数据
        receiveChildMsg(value) {
            this.childMsg = value
        }
    },
    components: {
        Child
    }
}
</script>

<template>
    <h2>父组件</h2>
    <!-- 第三步:监听事件,回调receiveChildMsg方法 -->
    <Child abc="ABC" :message="message" :list="list" @onReceive="receiveChildMsg"></Child>
    <p>接收子组件数据:{{ childMsg }}</p>
</template>

组合式API

父传子

  • 在父组件中给子组件绑定属性。
  • 在子组件中通过props接收数据。

父组件:Father2.vue

<script setup>
import { ref } from "vue";
import Child2 from "./Child2.vue"

let message = ref("hello")
const list = ref(["北京", "上海", "广州"])
</script>

<template>
    <h2>父组件</h2>
    <Child2 abc="ABC" :message="message" :list="list"></Child2>
</template>

子组件:Child2.vue

<script setup>
// 方式一:只接收
// const props = defineProps(["abc", "message", "list"])

// 方式二:限制类型
const props = defineProps({
    abc: String,
    message: String,
    list: Array
})
</script>

<template>
    <div>
        <h2>子组件</h2>
        <p>abc: {{ abc }}</p>
        <p>message: {{ message }}</p>
        <p>list: {{ list }}</p>
    </div>
</template>

子传父

  • 在父组件中给子组件通过@绑定事件。
  • 在子组件中通过emit方法触发事件。

子组件:Child2.vue

<script setup>
// 第二步:通过defineEmits生成emit方法
const emit = defineEmits("onReceive")

function sendFatherData() {
    // 第三步:触发事件,发送数据
    emit("onReceive", "哈喽 这一条来自子组件的消息")
}

</script>

<template>
    <div>
        <!-- 第一步:发送消息 -->
        <button @click="sendFatherData">向父组件发送数据</button>
    </div>
</template>

父组件:Father2.vue

<script setup>
import { ref } from "vue";
import Child2 from "./Child2.vue"
    
let childMsg = ref("")

// 接收数据
function receiveChildMsg(value) {
    childMsg.value = value
}
</script>

<template>
    <h2>父组件</h2>
    <!-- 第四步:监听事件,回调receiveChildMsg方法 -->
    <Child2 abc="ABC" :message="message" :list="list" @onReceive="receiveChildMsg"></Child2>
    <p>接收子组件数据:{{ childMsg }}</p>
</template>

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

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

相关文章

虚拟现实:将数字融入现实

随着科技的不断进步&#xff0c;虚拟现实正逐渐走进我们的现实生活&#xff0c;为我们带来了许多新的体验和可能性。虚拟现实技术将数字世界与真实世界融合在一起&#xff0c;为我们创造了令人惊叹的沉浸式体验。让我们一起探索虚拟现实正在走进现实的意义和影响。 虚拟现实为我…

C语言进阶之通讯录的实现(静态版和动态版)以及动态内存管理

通讯录的实现及动态内存管理 1.通讯录实现要求2.静态版通讯录实现2.1 contact.h文件实现2.2 contact.c文件实现2.3 main.c文件实现2.4 静态版通讯录全部文件代码 3.动态内存管理3.1 为什么存在动态内存分配3.2 动态内存函数的介绍3.3 常见的动态内存错误3.4 C/C程序的内存开辟3…

海盗搜身-2022年全国青少年信息素养大赛Python国赛第9题

[导读]&#xff1a;超平老师计划推出《全国青少年信息素养大赛Python编程真题解析》50讲&#xff0c;这是超平老师解读Python编程挑战赛真题系列的第11讲。 全国青少年信息素养大赛&#xff08;原全国青少年电子信息智能创新大赛&#xff09;是“世界机器人大会青少年机器人设…

vue3+ts+element-plus管理系统实际开发业务之增删改查

文章目录 功能一&#xff1a; 实现一个表格增、删、改、查功能✏️ 1. 表格、添加按钮、删除按钮、搜索框和搜索按钮、编辑按钮添加&#x1f4d2; 运行后页面效果&#xff1a;如下 ✏️ 2. 使用添加按钮添加一条新纪录&#xff0c;逻辑点击按钮弹出带有表单的弹窗进行输入添加。…

Elasticsearch--查询(nested、join)

nested 嵌套类型 数据的某个值是json、object对象&#xff1b;不再是简单的数据类型&#xff0c;或者简单数据类型的数组&#xff1b;那么还用之前的查询方式就有问题了。因为ES在存储复杂类型的时候会把对象的复杂层次结果扁平化为一个键值对列表 。此时&#xff0c;需要用n…

一文了解OLED拼接屏优点

随着科技的不断发展&#xff0c;显示技术也在不断地更新换代。其中&#xff0c;OLED技术是目前最为先进的显示技术之一。 OLED拼接屏是一种利用OLED技术制作的大屏幕显示设备&#xff0c;可以将多个OLED屏幕拼接在一起&#xff0c;形成一个更大的显示屏幕。济南OLED拼接屏是一…

分布式锁的实现方式

文章目录 一、分布式锁概述1.1 为什么需要分布式锁1.2 概述分布式锁1.3 分布式锁的特性1.4 分布式锁的类型1.5 实现重点 二、Mysql数据库实现分布式锁2.1 表结构2.2 加锁2.3 解锁2.4 锁超时2.5 实现重入锁 三、Redis实现分布式锁3.1 加锁3.2 解锁3.3 锁超时3.4 redlock的容错性…

设计模式-简单工厂模式

文章目录 简单工厂设计模式什么是简单工厂?为什么使用简单工厂工厂模式代码实现简单工厂优缺点优点&#xff1a; 简单工厂设计模式 学习视频 什么是简单工厂? 简单工厂模式属于类的创建型模式&#xff0c;又叫做静态工厂方法模式。通过专门定义一个类来负责创建其他类的实…

GitLab CICD Day 08 - 环境变量

1.局部/全局环境变量 stages:- testing # stage编排- build- deployvariables:global_var: "全部变量" #全部变量build_image:stage: buildvariables: #局部环境变量my_name: "局部环境变量" tags:- shell script:- …

14款奔驰R400升级ACC自适应巡航系统,增加您的行车安全性

有的时候你是否厌倦了不停的刹车、加油&#xff1f;是不是讨厌急刹车&#xff0c;为掌握不好车距而烦恼&#xff1f;如果是这样&#xff0c;那么就升级奔驰原厂ACC自适应式巡航控制系统&#xff0c;带排队自动辅助和行车距离警报功能&#xff0c;感受现代科技带给你的舒适安全和…

window.getComputedStyle

遇见一个问题&#xff0c;一个元素样式用的 固定定位。但是 top 属性没有在 元素树&#x1f332;种显示。js获取不到。这个方法可以获取到 style 里面设置的样式

OI中好用的技巧——c++快读快写

在写一些题时&#xff0c;发现不对读写进行处理会 TLE or WA 此时就需要降低读写的时间 c读写速度 &#xff1a; 普通写法 < scanf和printf写法 ≈ 缓存禁用写法 < 字符处理写法 普通写法&#xff08;读写最慢&#xff09; #include<iostream> using namespace…

车载调频发射机-德阳广播电台应用机关车队车载电台移动解说系统

车载调频发射机-德阳广播电台应用机关车队车载电台移动解说系统 北京海特伟业科技任洪卓发布于2023年7月13日 一、车载调频发射机-机关车队车载电台移动解说系统用户需求 机关车队主要承担领导干部公务用车以及重要会议、公务接待、调研应急等公务用车的服务保障工作。为认真…

前段开发概述

目录 网站概述 网站&#xff08;web site&#xff09;&#xff1a; 网页概述 网站开发流程&#xff1a; HTML基本概念 开发工具的选择 网站概述 网站&#xff08;web site&#xff09;&#xff1a; 按照一定规则&#xff0c;使用HTML超文本标记语言等工具制作的。用于展示…

FPGA——静态数码管

文章目录 一、实验环境二、实验原理三、实验任务四、实验过程4.1 time_count模块4.2 seg_led_static模块4.3 top_seg_led_static模块4.4 引脚配置 五、仿真5.1 仿真代码5.2 仿真结果 六、实验结果七、总结 一、实验环境 quartus 18.1 modelsim vscode Cyclone IV开发板 二、实…

大坝安全监测中需要做好检查监测

大坝安全监测是人们了解大坝运行状态和安全状况的有效手段和方法。它的目的主要是了解大坝安全状况及其发展态势&#xff0c;是一个包括由获取各种环境、水文、结构、安全信息到经过识别、计算、判断等步骤&#xff0c;最终给出一个大坝安全 程度的全过程。 此过程包括&#xf…

阿里云无影云电脑和服务器有啥区别?

阿里云无影云电脑和云服务器有什么区别&#xff1f;云电脑是作为个人或企业办公电脑使用&#xff0c;云服务器是对外提供24小时高可用服务&#xff0c;云电脑是桌面服务&#xff0c;云服务器是提供背后的计算服务&#xff0c;阿里云百科分享阿里云无影云电脑和云服务器的区别&a…

互联网医院源码|互联网医院系统源码|互联网医院诊疗系统

互联网医院系统开发可以提供许多好用的功能&#xff0c;以下是一些常见的功能&#xff1a;   在线挂号预约&#xff1a;用户可以通过系统在线选择医生、科室和就诊时间&#xff0c;并进行挂号预约&#xff0c;避免了传统排队等候的麻烦。   问诊咨询&#xff1a;用户可以通…

Fiddler 抓包工具 手机抓包配置

1. 下载Fiddler 工具阿里云盘分享 2. 安装后进行设置 Tools -->Options 这些设置完后开始手机WLAN 设置 1. 打开手机的“设置” ->“WLAN”&#xff0c;找到你要连接的网络&#xff0c;在上面长按&#xff0c;然后选择“修改网络”&#xff0c;弹出网络设置对话框&…

探索Web自动化测试工具的特点

Web应用程序的快速发展使得自动化测试在软件开发生命周期中变得至关重要。Web自动化测试工具为开发人员和测试人员提供了一种高效、准确且可重复的方法来验证Web应用程序的功能和稳定性&#xff0c;我们一起来探索Web自动化测试工具的特点。 1.多浏览器兼容性&#xff1a; Web自…