组件以及组件间的通讯

news2024/9/30 23:33:21

组件 & 组件通讯

:::warning 注意
阅读本文章之前,你应该先要了解 ESM 模块化的 import export,如需要请查看 ESM 模块化。
:::

上一篇有介绍到什么是组件化,就是把一个页面拆分成若干个小模块,然后重新组成一个页面。其中的每个小模块就是对应一个 .vue 文件。在组件的使用上我们还需要注意组件的引入和调用的命名方式,以及组件之间的数据是如何传递的。

组件注册

组件在使用之前必须要先注册。注册后才能够使用该组件。

<template>
    <div class="hello">
        <!-- 调用组件 -->
        <MyChildren></MyChildren>

        <!-- 或者简化写法 -->
        <MyChildren />
    </div>
</template>

<script>
import MyChildren from './MyChildren.vue' // 引入组件

export default {
    components: { MyChildren } // 注册组件
}
</script>

组件命名

组件的命名一般有两种,上面的例子中就是属于第一种,PascalCase 大写驼峰的形式。第二种是 kebab-case 小写横杠形式。

<template>
    <div class="hello">
        <!-- 调用组件 -->
        <my-children></my-children>

        <!-- 或者简化写法 -->
        <my-children />
    </div>
</template>

<script>
import MyChildren from './my-children.vue' // 引入组件

export default {
    components: { MyChildren } // 或者简化写法
}
</script>

当使用 kebab-case 注册一个组件时,你只能使用 kebab-case 形式进行调用组件,例如 <my-component-name />

当使用 PascalCase 注册一个组件时,你可以使用 PascalCase 或者 kebab-case 形式进行调用组件。例如 <my-component-name /> 或者 <MyComponentName />

组件通讯

组件通讯分为父子组件通讯、兄弟组件通讯、祖孙组件通讯。本章重点介绍父子组件通讯。
以上面的例子继续讲解。

Props

props 是用来接收父组件传递过来的静态/动态数据。

Home.vue

<template>
    <div class="hello">
        <MyChildren name="xiaoming" :age="age" />
    </div>
</template>

<script>
import MyChildren from 'MyChildren.vue'

export default {
    components: { MyChildren },
    data() {
        return {
            age: 18
        }
    }
}
</script>

MyChildren.vue

<template>
    <div class="my-children">
        {{ name }}
        {{ age }}
    </div>
</template>

<script>
export default {
    props: {
        name: {
            type: String,
            default: ''
        },
        age: {
            type: Number,
            default: 0
        }
    }
}
</script>

通过上面的例子可以看到父组件 Home.vue 向子组件 MyChildren.vue 传递了 nameage 属性。子组件如果想要使用该属性,就必须在 props 选项中进行接收。

Props 接收的语法有几种,分别是数组、对象的形式。推荐使用对象形式,并且设置默认值。


Props 语法

使用字符串数组的形式。

<script>
export default {
    props: ['title', 'likes', 'isPublished', 'commentIds', 'author']
}
</script>

但是,通常都会希望每个 prop 都有指定的值类型。这时,你可以以对象形式列出 prop,这些 property 的名称和值分别是 prop 各自的名称和类型。

<script>
export default {
    props: {
        title: String,
        likes: Number,
        isPublished: Boolean,
        commentIds: Array,
        author: Object,
        callback: Function,
        contactsPromise: Promise // or any other constructor
    }
}
</script>

如果设置了每个 prop 的类型,但是你没有按照规定的类型传递数据进来,Vue 会在浏览器的控制台中发出警告。


单向数据流

单向数据流指的是数据的流向是从父组件流向子组件,从上往下流。父级 prop 的更新会向下流动到子组件中,但是反过来则不行。这样会防止从子组件意外变更父级组件的状态,从而导致你的应用的数据流向难以理解。

额外的,每次父级组件发生变更时,子组件中所有的 prop 都将会刷新为最新的值。这意味着你不应该在一个子组件内部改变 prop。如果你这样做了,Vue 会在浏览器的控制台中发出警告。

一个尝试修改 props 值的错误示范

<template>
    <div class="base-header">我修改了 props 的值 {{ age }}</div>
</template>

<script>
export default {
    props: {
        age: {
            type: Number,
            default: 0
        }
    },
    mounted() {
        this.age = 100
    }
}
</script>

在这里插入图片描述

单向数据流其实很好理解的,当一个父组件里面有 n 个子组件,并且分别给 n 个子组件传递了同一个 age 属性,在每个子组件中都进行修改了 age。那么展示的时候以谁改的为准呢?因为父组件和 n 个子组件是共享了 age ,所以一个地方改了 age 那么大家展示的时候都一起被改了。

在举例一个糟糕的情况,一个父组件传递了 age 属性给 n 个子组件,n 个子组件又把这个 age 传递给了它们的子组件,以此类推 n 层深度。当你发现 age 展示的数值不正确的时候,你能在这 n _ n _ n * n 个组件中找到是谁改了吗?

如果使用单向数据流,当你遇到不可描述的错误的时候,你就会很容易排查问题。假设你发现 age 显示不正确。那么你只需要在最顶级的父组件中去排查即可,而不需要每个子组件里面都去排查。


自定义事件 $emit

在父组件中可以通过 v-on 或者 @ 在子组件身上进行监听事件,子组件通过调用 $emit 可以触发父组件监听的事件,同时还能够传递参数。

:::warning 注意
监听的事件名必须和触发的事件名保持一致。
:::

Home.vue

<template>
    <div class="home">
        <MyChildren name="xiaoming" :age="age" @changeAge="handleChange" />
    </div>
</template>

<script>
import MyChildren from './MyChildren.vue'

export default {
    components: { MyChildren },
    data() {
        return {
            age: 18
        }
    },
    methods: {
        handleChange(val) {
            this.age = val
        }
    }
}
</script>

MyChildren.vue

<template>
    <div class="my-children">
        {{ age }}

        <button @click="handleClick">点我修改父组件的 age</button>
    </div>
</template>

<script>
export default {
    props: {
        age: {
            type: Number,
            default: 0
        }
    },
    methods: {
        handleClick() {
            this.$emit('changeAge', this.age + 1)
        }
    }
}
</script>

原文链接:菜园前端

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

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

相关文章

iPhone 15有始终显示功能吗?它会出现在更多的苹果手机上吗?

和我们一样&#xff0c;你可能也在犹豫&#xff0c;iPhone 15将增加一个“始终显示”的功能&#xff0c;与一年前苹果Pro版手机的功能相匹配。然而&#xff0c;随着苹果9月活动的临近&#xff0c;没有太多传言可以让我们相信我们会如愿以偿。 你可能还记得&#xff0c;去年iPh…

导出Excel的技术分享-综合篇

导出Excel的技术分享-综合篇 简单的EasyExcel使用 /*** 最简单的写*/public void simpleWrite() {// 注意 simpleWrite在数据量不大的情况下可以使用&#xff08;5000以内&#xff0c;具体也要看实际情况&#xff09;&#xff0c;数据量大参照 重复多次写入// 写法1 JDK8// s…

GMSL技术让汽车数据传输更为高效(转)

目前&#xff0c;大部分车企都在其旗舰车型上配备了达到Level 2水平的自动驾驶技术&#xff0c;也就是高级自动驾驶辅助 ADAS系统。ADAS系统硬件主要由以下几部分组成&#xff0c;包括传感器、串行器、解串器、ADAS处理器等。 除了ADAS系统&#xff0c;包括传感器融合、音视频影…

Python实现SSA智能麻雀搜索算法优化LightGBM回归模型(LGBMRegressor算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 麻雀搜索算法(Sparrow Search Algorithm, SSA)是一种新型的群智能优化算法&#xff0c;在2020年提出&a…

山西电力市场日前价格预测【2023-09-08】

日前价格预测 预测明日&#xff08;2023-09-08&#xff09;山西电力市场全天平均日前电价为356.28元/MWh。其中&#xff0c;最高日前电价为409.23元/MWh&#xff0c;预计出现在19: 30。最低日前电价为323.46元/MWh&#xff0c;预计出现在24: 00。 价差方向预测 1&#xff1a; 实…

封装flexible.js,页面替换px为rem,实现不同分辨率适配

做的vue项目需要做个大屏&#xff0c;需要适配不同电脑的分配率&#xff0c;想到了rem&#xff0c;但是直接通过npm install flexible 安装的flexible.js默认设置的分辨率范围不符合现有的需求&#xff0c;所以就把安装包里面的flexible.js单独拿出来&#xff0c;然后改下分辨率…

idea的git入门

&#xff08;1&#xff09;安装好git之后&#xff0c;在idea的设置里面&#xff0c;按照下面三步&#xff0c;配置git &#xff08;2&#xff09;创建本地git仓库 选择本地仓库的根目录&#xff0c;点击ok &#xff08;3&#xff09;创建成功之后&#xff0c;会发现文件名称都变…

C/C++输出第二个整数 2019年9月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析

目录 一、题目要求 1、编程实现 2、输入输出 二、解题思路 1、案例分析 三、程序代码 四、程序说明 五、运行结果 六、考点分析 2019年9月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 输入三个整数&#xff0c;把第二个输入的整数输出。 2、输入输出 输…

腾讯混元助手使用指南

一、腾讯混元助手简介 腾讯混元助手是什么&#xff1f; 腾讯混元助手是由腾讯研发的大语言模型的平台产品&#xff0c;具备跨领域知识和自然语言理解能力&#xff0c;实现基于人机自然语言对话的方式&#xff0c;理解用户指令并执行任务&#xff0c;帮助用户实现人获取信息&am…

利用观测云实现业务数据驱动的弹性扩缩容

背景 在使用观测云对业务系统进行观测的过程中&#xff0c;除了可以实现业务系统的全面感知&#xff0c;我们还可以基于观测云数据处理开发平台 DataFlux Func &#xff0c;结合故障模型对被测系统进行主动管理&#xff0c;例如弹性扩容或系统故障自愈&#xff0c;从而实现系统…

VirtualBox的菜单栏被隐藏

一、virtualbox虚拟机里面最顶部没有控制&#xff0c;设置和帮助选项 的解决办法&#xff1a; 右边的CtrlC 二、linux终端上下滚动 向上滚动&#xff1a;Shift Page Up 向下滚动&#xff1a;Shift Page Down

使用T2-U和Sensor_Hub开发一款智能温湿度计

文章目录 传感器 SHT30SHT30 概述数据读取1. 单次读取2. 周期读取3. 数据转换 产品创建第一步&#xff1a;选择品类第二步&#xff1a;选择功能第三步&#xff1a;选择控制面板第四步&#xff1a;选择开发方式 Sensor Hub 应用使用示例1. 设备注册、查找设备获取设备句柄2. 设备…

Qt 4设置界面区域外的颜色

Qt4界面小于显示屏, 设置界面范围之外的背后的显示颜色&#xff1a;

期权交易策略主要有哪些?期权交易策略指南

在学习更复杂的看涨和看跌期权策略之前&#xff0c;普通投资者应该彻底了解一些关于期权的基本知识&#xff0c;这样有助你后期的交易能力和理论知识水平提升有很大的帮助&#xff0c;下文科普期权交易策略主要有哪些&#xff1f;期权交易策略指南&#xff01;本文来自&#xf…

利用transform和border 创造简易图标,以适应uniapp中多字体大小情况下的符号问题

heml: <text class"icon-check"></text> css: .icon-check {border: 2px solid black;border-left: 0;border-top: 0;height: 12px;width: 6px;transform-origin: center;transform: rotate(45deg);} 实际上就是声明一个带边框的div 将其中相邻的两边去…

抖音小店爆款制造指南:打造抖音爆款商品的八大技巧

抖音小店作为一种电商模式&#xff0c;通过短视频形式展示商品&#xff0c;吸引用户购买。在抖音平台上&#xff0c;打造爆款商品是每个抖音小店主的梦想。以下是四川不若与众整理的一些抖音小店如何打造爆款商品的技巧。 1. 产品选择&#xff1a;选择适合抖音平台的产品非常重…

mysql数据库,字符串使用双引号““导致报错,使用单引号‘‘不报错,Unknown column ‘user-test‘ in ‘where clause‘

文章目录 一、完整报错二、报错数据三、报错原因四、解决方式1、更改执行sql2、更改sql数据校验模式&#xff08;改为默认校验&#xff09; 一、完整报错 > 1054 - Unknown column user-test in where clause二、报错数据 SELECT * FROM config_info WHERE config_info.da…

肖sir__设计测试用例方法之正交表08_(黑盒测试)

设计测试用例方法之正交 一、正交表定义 正交试验设计法&#xff0c;是从大量的试验点中挑选出适量的、有代表性的点&#xff0c;应用依据迦罗瓦理论导出的“正交表”&#xff0c;合理的安排试验的一种科学的试验设计方法。 二、 正交常用的术语 指标&#xff1a;通常把判断试验…

Mongodb 安装脚本(附服务器自启动)

shell脚本 #!/bin/bash #mail:xuelanchnet.com #function:auto install mongodb [ $(id -u) ! "0" ] && echo "Error: You must be root to run this script" && exit 1 logfile"/var/log/mongod_install.log" softdir"/s…

索尼 toio™ 应用创意开发征文|小巧机器,大无限,探索奇妙世界

文章目录 前言微型机器人的未来&#xff1a;toio™小机器人简介toio™小机器人&#xff1a;创新功能一览toio™小机器人&#xff1a;多领域的变革者toio™小机器人贪吃蛇游戏代码实现写在最后 前言 当我们谈到现代科技的创新时&#xff0c;往往会联想到复杂的机器和高级的编程…