vue父子组件通讯的几种方式总结学习

一直都是公司前端在写组件,我想着自己也写一波,然后先看看父子组件传值的内容,想写一写小demo然后练习一下这个内容,也算是系统学习一下怎么处理这个内容

其实就是2种父传子和子传父

1.父组件传子组件数据

其实就是父在标签中可以给子传值主要利用props

子组件

<template><h3>Child<div>{{ name }}</div><div>{{ age }}</div></h3></template>
<script>
export default{name:"childCompont",props:{name:{type:String,default:"",require:true},age:{type:Number,default:1}},data(){return{}},}
</script>

父组件

<template><div><h3>{{ message }}</h3><child-compont :name=name :age=age />   </div>
</template><script>import childCompont from './childCompont.vue';  //1、导入Child组件export default {name: 'parentCompont',components: { childCompont }, //2、注入Child组件data() {return {name:"娃哈哈",age:"1",message: "Parent"}},}</script>

父组件可以1.动态传值,2.直接传字符串
子组件可以1.设置默认值,2.必传校验,3.然后设置默认值,类型校验

亲自试了了一下,如果校验不通过确实会报红
在这里插入图片描述
  这个小学习其实就是通过props属性将父组件的值传递给子组件,任何类型的值都可以作为props的值被传递,另外需要注意的是props传递数据,只能从父级传递到子级,不能反其道而行。只能接收
  props对数据类型的校验,用type规定父组件传过来的数据类型,如果不相符,控制台会抛出警告;默认值,default,数字和数组可以直接default:数据类型,而数组和对象,必须通过工厂函数返回默认值;必选项,通过required:true,要求父组件传值过来,否则控制台会抛出警告,最后要注意的是props接收的值是只读的,不能进行修改操作。

2.利用事件子组件传父组件数据

实际应用的场景,比如说我封装了一个下拉组件,然后下拉 然后再一个组件中使用这个下拉组件,然后我点击了这个下拉组件后,需要把下拉中的相关信息复写到父组件中,其实就是需要用这个内容,简单的说就是想把子组件的内容暴露给父的时候需要这个样子去处理。

可以在子组件中通过$emit(event, […参数])触发一个自定义的事件,这样,父组件可以在使用子组件的地方直接用 v-on来监听子组件触发的事件, 并且可以在监听函数中依次取得所有从子组件传来的参数,但是这个前提是说,在子组件有东西可以传递这个时间的情况下,可以这么去做。

例如:
在子组件中某个部分写入:

this.emit('aaa', arg);

然后你就可以在父组件的子组件模板里监听:
// 这里是父组件的Template:

<child  @ aaa= "functionYours" />

子组件

<template><h3>Child<button @click="click1">按钮给父传值1</button><button @click="click2">按钮给父传值2</button></h3></template>
<script>
export default{name:"childCompont",props:{},data(){return{}},methods: {click1(){console.log("按钮1答应打印1")   this.$emit("slectChange","按钮1点击了第一个参数","按钮1点击了第二个参数")},click2(){console.log("slectChange","按钮2点击了") this.$emit("slectChange","按钮2点击了")}},
}
</script>

父组件

<template><div><h3>{{ data }}</h3><h3>{{ data2 }}</h3><child-compont @slectChange = "change"/>   </div>
</template><script>import childCompont from './childCompont.vue';  //1、导入Child组件export default {name: 'parentCompont2',components: { childCompont }, //2、注入Child组件data() {return {data:"默认值",data2:"默认值2",}},methods: {change(data,data2){this.data = datathis.data2 = data2}},}</script>

3通过ref属性在父组件中直接取得子组件的数据修改(data)

上面说的有个局限性就是它们都需要以事件机制为基础(无论是像click那样的原生事件还是自定义事件),而在事件发生的时候才能调用函数将数据传递过来,就是肯定要有事件产生才能传值,

但如果子组件里没有类似“按钮”的东西,因而无法制造原生事件,同时也没办法找到一个触发自定义事件的时机的时候,怎么从子组件向父组件传递数据呢?

这个时候, 我们就只能从父组件中“直接取”子组件的数据了,借助ref属性

ref是我们经常用到的Vue属性,利用它可以简单方便地从本组件的template中取得DOM实例,而实际上,如果你在父组件中为子组件设置ref的话, 就可以直接通过vm.$refs.[子组件的ref].[子组件的属性]去拿到数据啦,例如:

实际的场景使用:就是你想从父直接修改或者触发子组件的方法的时候,可以使用这个内容,和上面时间不同的是,就是上面那个需要有事件才行,但是ref没这个限制,直接就可以从父访子。

handleAdd() {this.$refs.addEdit.type = "add";this.$refs.addEdit.beforeLoadForm();this.$refs.addEdit.visible = true;
},

4通过sync实现数据双向绑定, 从而同步父子组件数据

通过以上三种方式, 我想你应该能解决绝大多数父子组件通信的场景了,但让我们再仔细考虑一下上面的通信场景,就会发现它们还可能存在的问题:

从子组件向父组件传递数据时,父子组件中的数据仍不是每时每刻都同步的

但在某些特殊的需求场景下,我们可能会希望父子组件中的数据时刻保持同步, 这时候你可能会像下面这样做:

这是父组件中的template:

<son :foo="bar" v-on:update="val => bar = val"></son>

在子组件中, 我们通过props声明的方式接收foo并使用

props: {foo: [type]
}

同时每当子组件中数据改变的时候,通过

this.$emit('update', newValue)

把参数newValue传递给父组件template中监听函数中的"val"。然后通过

val => bar = val

这个表达式就实现了bar = newValue. 这个时候,我们发现父组件这个表达式就实现了bar = newValue. 这个时候,我们发现父组件中的关键数据bar被子组件改变(相等)了!

通过数据的双向绑定, 父(组件)可以修改子的数据, 子也可以修改父的数据

Vue提供了sync修饰符简化上面的代码,例如:

<comp :foo.sync="bar"></comp>

会被扩展为:

<comp :foo="bar" @update:foo="val => bar = val"></comp>

然后你需要在子组件中改变父组件数据的时候, 需要触发以下的自定义事件:

this.$emit("update:foo", newValue)

【注意】你可能觉得这好像和我上面提到的二中的“通过自定义事件(emit)从子组件向父组件中传递数据”的那一节的内容似乎重叠了,。然而并不是, 两者有着父子组件关系上的不同,

1.在我们讲解sync的这一小节里, 自定义事件发生时候运行的响应表达式是:

<son :foo="bar" v-on:update="val => bar = val"></son> 中的 "val => bar = val"

2.在二中的“通过自定义事件从子组件向父组件中传递数据” 里,自定义事件发生时候运行的响应表达式是:

<Son v-on: eventYouDefined = "arg => functionYours(arg)" /> 中的 "arg => functionYours(arg)"

对前者, 表达式 val => bar = val意味着强制让父组件的数据等于子组件传递过来的数据, 这个时候,我们发现父子组件的地位是平等的。 父可以改变子(数据), 子也可以改变父(数据),2者的关系完全不像是父和子的关系,更像是朋友,这种的。就是父组件中的数据变化可以后可以影响子组件,然后子改变了以后也可以改变父组件

对后者, 你的functionYours是在父组件中定义的, 在这个函数里, 你可以对从子组件接受来的arg数据做任意的操作或处理, 决定权完全落在父组件中, 也就是: 父可以改变子(数据), 但子不能直接改变父(数据)(就是说你需要触发父组件的时间来改变父的内容)!

数据双向绑定是把双刃剑

从好处上看:

1.它实现了父子组件数据的“实时”同步, 在某些数据场景下可能会使用到这一点,
4.sync提供的语法糖使得双向绑定的代码变得很简单

从坏处上看:

它破环了单向数据流的简洁性, 这增加了分析数据时的难度

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

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

相关文章

学习Android的第八天

目录 Android ImageView 图像视图 ImageView 的基本使用 src属性和background属性的区别 范例 解决 anndroid:blackground 属性拉伸导致图片变形的方法 设置透明度的问题 范例 android:src 和 android:background 结合 范例 Java 代码中设置 blackground 和 src 属性…

分享66个表单按钮,总有一款适合您

分享66个表单按钮&#xff0c;总有一款适合您 66个表单按钮下载链接&#xff1a;https://pan.baidu.com/s/19lOG5sxI2Uy3KBIscffHRw?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不…

社区店经营策划书:从零到一,打造特色店铺

作为一名资深的鲜奶吧创业者&#xff0c;我深知开一家社区店并非易事&#xff0c;但凭借五年的经营经验和不断的学习&#xff0c;我成功地将我的鲜奶吧打造成为了一个特色店铺。 今天&#xff0c;我将与大家分享这份经营策划书&#xff0c;希望能为那些想开鲜奶吧或开其他店铺…

国产光耦2024:发展机遇与挑战全面解析

随着科技的不断进步&#xff0c;国产光耦在2024年正面临着前所未有的机遇与挑战。本文将深入分析国产光耦行业的发展现状&#xff0c;揭示其在技术创新、市场需求等方面的机遇和挑战。 国产光耦技术创新的机遇&#xff1a; 国产光耦作为光电器件的重要组成部分&#xff0c;其技…

TELNET 远程终端协议

远程终端协议 TELNET TELNET 是一个简单的远程终端协议&#xff0c;也是互联网的正式标准。 用户用 TELNET 就可在其所在地通过 TCP 连接注册&#xff08;即登录&#xff09;到远地的另一个主机上&#xff08;使用主机名或 IP 地址&#xff09;。 TELNET 能将用户的击键传到…

针对Sodinokibi黑客组织供应链攻击Kaseya VSA的分析溯源

前言 2021年7月2日&#xff0c;Sodinokibi(REvil)勒索病毒黑客组织疑似利用0day漏洞&#xff0c;通过Kaseya VSA发起大规模供应链攻击行动&#xff0c;此次事件影响范围广泛&#xff0c;目前瑞典最大链锁超市之一的Coop受此供应链勒索攻击事件影响被迫关闭全国约800多家商店服…

springboot169基于vue的工厂车间管理系统的设计

基于VUE的工厂车间管理系统设计与实现 摘 要 社会发展日新月异&#xff0c;用计算机应用实现数据管理功能已经算是很完善的了&#xff0c;但是随着移动互联网的到来&#xff0c;处理信息不再受制于地理位置的限制&#xff0c;处理信息及时高效&#xff0c;备受人们的喜爱。本…

使用Pillow来生成简单的红包封面

Pillow库&#xff08;Python Imaging Library的后继&#xff09;是一个强大而灵活的图像处理库&#xff0c;适用于Python。Pillow 库&#xff08;有时也称 PIL 库&#xff09; 是 Python 图像处理的基础库&#xff0c;它是一个免费开源的第三方库&#xff0c;由一群 Python 社区…

卫星通讯领域FPGA关注技术:算法和图像方面(2)

最近关注的公众号提到了从事移动通信、卫星通讯等领域的FPGA、ASIC、信号处理算法等工程师可能需要关注的技术&#xff0c;有MVDR算法、高速基带芯片、RF芯片、毫米波有源相控阵天线、无线AI&#xff0c;以下做了一些基础的调研&#xff1a; 1 MVDR算法 声源定位是一个阵列信…

【动态规划】【字符串】1092. 最短公共超序列

作者推荐 【动态规划】【前缀和】【C算法】LCP 57. 打地鼠 本文涉及知识点 动态规划汇总 LeetCode1092最短公共超序列 给你两个字符串 str1 和 str2&#xff0c;返回同时以 str1 和 str2 作为 子序列 的最短字符串。如果答案不止一个&#xff0c;则可以返回满足条件的 任意…

redis-sentinel(哨兵模式)

目录 1、哨兵简介:Redis Sentinel 2、作用 3、工作模式 4、主观下线和客观下线 5、配置哨兵模式 希望能够帮助到大家&#xff01;&#xff01;&#xff01; 1、哨兵简介:Redis Sentinel Sentinel(哨兵)是用于监控redis集群中Master状态的工具&#xff0c;其已经被集成在re…

【MySQL】数据库基础 -- 详解

一、什么是数据库 存储数据用文件就可以了&#xff0c;为什么还要弄个数据库? 一般的文件确实提供了数据的存储功能&#xff0c;但是文件并没有提供非常好的数据&#xff08;内容&#xff09;的管理能力&#xff08;用户角度&#xff09;。 文件保存数据有以下几个缺点&…

证明之黄金分割比的无理性

黄金分割比的无理性 “黄金分割比的神奇之处&#xff1a;视觉化证明与数学的魅力” 人们在学习高等数学时&#xff0c;走到一个证明的结尾处&#xff0c;通常会经历这样的思考&#xff1a;“我理解每一行是怎样由前一行得到的&#xff0c;但是我却不明白为什么这个定理是正确…

DS:顺序栈的实现

创作不易&#xff0c;友友们给个三连吧&#xff01;&#xff01; 一、栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先…

[神奇代码岛】皮肤功能使用

前言 最近有很多人在制作地图的时候&#xff0c;因该会用到皮肤的功能&#xff0c;但是皮肤操作只知道UI操作&#xff0c;但缺点是&#xff0c;只能设置地图默认皮肤&#xff0c;根本都做不到想要的什么皮肤购买功能&#xff0c;自主穿戴功能&#xff0c;而API官方又放在非常隐…

python爬虫入门(一)

使用requests 库获取网站html信息 import requests response requests.get("https://jingyan.baidu.com/article/17bd8e52c76b2bc5ab2bb8a2.html#:~:text1.%E6%89%93%E5%BC%80%E6%B5%8F%E8%A7%88%E5%99%A8F12%202.%E6%89%BE%E5%88%B0headers%E9%87%8C%E9%9D%A2%E7%9A%84…

【C++】初识模板:函数模板和类模板

目录 一、模板函数 1、函数模板的概念 2、函数模板的格式 3、函数模板的原理 4、函数模板实例化 5、 模板参数的匹配原则 二、类模板 1 、类模板的定义格式 2 、类模板的实例化 3、模板类示例 一、模板函数 1、函数模板的概念 函数模板代表了一个函数家族&#xff0c…

2024年安全员-B证证模拟考试题库及安全员-B证理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年安全员-B证证模拟考试题库及安全员-B证理论考试试题是由安全生产模拟考试一点通提供&#xff0c;安全员-B证证模拟考试题库是根据安全员-B证最新版教材&#xff0c;安全员-B证大纲整理而成&#xff08;含2024年…

比较6*6范围内7个点182个结构的顺序

( A, B )---6*30*2---( 1, 0 )( 0, 1 ) 让网络的输入有6个节点&#xff0c;训练集AB各由6张二值化的图片组成&#xff0c;让A中有7个点&#xff0c;让B全是0&#xff0c;收敛误差7e-4&#xff0c;收敛199次&#xff0c;统计迭代次数平均值并排序。 得到顺序为 用6个点的结构标…

【Godot4.2】图片处理函数库 - textureDB

概述 Godot中节点使用的图片是Texture2D或其子类型&#xff0c;而涉及图片处理&#xff0c;大多数功能在Image类型中&#xff0c;并且我们通常需要频繁的构造Image和ImageTexture类型。 为了封装构造Image和ImageTexture类型的代码&#xff0c;提供直接从文件到直接可以赋值给…