Vue 父子组件间的通信

前言 在 Vue 项目中父子组件的通信是非常常见的,最近做项目的时候发现对这方面的知识还不怎么熟练,在这边做一下笔记,系统学习一下吧。

1 父组件传值给子组件

1.1 传值写法

父组件传值给子组件,这个就比较常见了,直接用 props 就可以了。但是就算是 props 子组件那边也有三种写法,如下面代码所示:
父组件

```<!-- 两种情况 --> <!--静态传值--> <child name="xhm"></child> <!--动态传值--> <child :name="userName"></child> ```

子组件


// 1 简单粗暴就给个名称的情况
props:['name'],
// 2 给个名称顺便指定个类型,如果父组件传递过来的值类型不对的话就会报错
props:{name:String
},
// 3 给个名称不仅指定了类型,还顺便送了个默认值,当父组件传个空过来或者啥都没传过来的时候就用默认值了
props: {name: {type: String,default: 'xhm',}
},

注意一下的话,如果是数组或者是对象要默认值的话,直接设置默认数组或者默认对象会报错,需要用工厂函数返回,如下:


props: {arr:{type:Array,default:()=&gt;{return [1,2,3]}}
},
// 对象也是和上面一个用工厂函数

1.2 子组件使用父组件的值

由于单向数据流的限制,我们不能直接在子组件中修改 props 的值,当我们修改的时候会报错,官方的说法是:

所有的 prop 都使得其父子 prop 之间形成了一个单向下行绑定:父级 prop 的更新会向下流动到子组件中,但是反过来则不行。这样会防止从子组件意外改变父级组件的状态,从而导致你的应用的数据流向难以理解。

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

所以啊,如果你不只是想在子组件中简单的渲染父组件传过来的值的话,那么可以用下面的两种方法。

  1. 这个 prop 用来传递一个初始值;这个子组件接下来希望将其作为一个本地的 prop 数据来使用。在这种情况下,最好定义一个本地的 data 属性并将这个 prop 用作其初始值:

props: ['name'],
data() {return {userName:this.name,};
},
  1. 这个 prop 以一种原始的值传入且需要进行转换。在这种情况下,最好使用这个 prop 的值来定义一个计算属性:

props: ['name'],
computed: {userName(){return this.firstName + this.name}
},

2 子组件传值给父组件

虽然我们说是要单向数据流,但是很多时候,我们在子组件改变了某些值之后,还是要反馈给父组件,让父组件做一下修改,那么这个时候就要想着子组件向父组件传值啦。有下面这么两种方式

2.1 emit 方法

这个基本都是用 emit 来传递了,用法直接看代码吧:
子组件


// props:['name]// methods 里
update(){this.$emit('update','ljy');// 第一个参数:事件名,第二个参数:传递给事件方法的参数
}

父组件

/* template 里面的代码,监听子组件里面的 update 事件,调用父组件的 childUpdate 方法&lt;child :name="userName" @update="childUpdate"&gt;&lt;/child&gt;*/
// methods
chidlUpdate(val){// val 参数就是子组件传递过来的数据this.userName = val;
}

虽然这样是可以实现子组件向父组件传值,但是写多一个方法感觉很烦,所以 vue 官方高出了一个 以 update:myPropName 的模式触发事件。,这个是啥,举个例子,我们的子组件中有一个 name 的 props,我们用下面这个形式通知父组件


this.$emit('update:name', newName)
// this.$emit('update:props中的变量名', 新的值)

然后父组件可以监听那个事件并根据需要更新一个本地的数据属性:

```<child :name="userName" @update:name="userName = $event"></child> ```

这样当我们在子组件触发那个修改的方法的时候,父组件的 userName 变量就会更新为 newName了,然后为了方便起见,官方提供了一个缩写,即 .sync 修饰符。看代码吧:

```<child :name.sync="userName"></child> ```

上面的代码和前面的代码是一个效果,是不是方便了很多。舒服了吧。

2.2 利用浅拷贝(不推荐)

这个的话是针对于 对象和数组那些引用类型的数据而言的,由于这些存在浅拷贝的问题(不明白浅拷贝的看这篇文章),所以可以利用这点来实现子父组件的「同生共死」,看代码吧


// 假设 name 是一个对象或者数组
props:['name'],
return {userName:this.name,
};

就这样?!

没错就是这么简单粗暴,由于浅拷贝的问题,我们在子组件修改 userName 的时候,从父组件传递过来的那个值也会改变的,然后就会实现 props 的「双向绑定」了。但是一般没人会这么干,因为这样会造成维护上的问题,会让人觉得咋没干啥父组件的值咋就变了,会让人头秃啊,所以除非你项目中非得要搞这么一个子父组件 props 的「同生共死」,那就这么干吧。

3 子组件调用父组件的方法

不知道这样的叫法对不对,反正就这样啦。总结之后又下面这几种方法

3.1 emit

其实本来 emit 就是用于子组件向父组件通信的,上面的子组件传值给父组件其实也就是父组件监听子组件的事件,然后触发父组件的方法的,换个说法,也就是子组件调用了父组件的方法,再写一下代码吧:

子组件


// methods 里
update(){this.$emit('update','ljy');// 第一个参数:事件名,第二个参数:传递给事件方法的参数
}

父组件

/* template 里面的代码,监听子组件里面的 update 事件,调用父组件的 childUpdate 方法&lt;child :name="userName" @update="childUpdate"&gt;&lt;/child&gt;*/
// methods
chidlUpdate(val){// val 参数就是子组件传递过来的数据this.userName = val;
}

上面的代码中,从某种意义上来说,就是子组件调用了父组件的 childUpdate 方法。

3.2 this.$paarent.event

这个就比较简单了,我们假设我们在父组件定义了一个 fatherMethod() 方法,然后我们子组件就可以通过下面的代码实现调用 fatherMethod() 的方法


childClick(){this.$parent.fatherMethod();
}

3.3 props

props 能传递 Function 类型的数据,所以,我们通过 props 当然也是可以直接的调用父组件传递过来的方法啦。不多说,直接撸代码:
父组件

```<!-- 假设父组件里定义了一个 fatherMethod() 方法 --> <child :fatherMethod="fatherMethod"></child> ```

子组件


props: {fatherMethod: {type: Function,default: null}
},
methods: {childClick() {this.fatherMethod();}
},

这样我们也是调用了父组件的方法啦。

4 父组件调用子组件的方法

这个,暂时没有遇到过这种情况,不过以备不时之需,也写一下吧。父组件调用子组件的方法的话是利用 ref 获取到子组件实例,从而调用子组件的方法,假设我们子组件有这么一个 childMethod() 方法。那么我们的父组件就可以这么来调用子组件的方法了


/* &lt;child ref="con"&gt;&lt;/child&gt; 子组件 */methods: {update() {this.$refs.con.childMethod();},
}

至此,关于父子组件通信的的话题就聊到这边了,如果有啥错误或者遗漏的,欢迎在下面斧正啦。

原文地址:https://segmentfault.com/a/1190000017346476

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

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

相关文章

夜视仪

国民兵所用F-16的驾驶舱&#xff0c;机员配有夜视镜以备观察领空的客机或飞行物体使用夜视镜时看到的影像夜视仪〈night vision device&#xff0c;简称NVD〉&#xff0c;也称夜视镜&#xff0c;是透过光学科技强化黑暗中光源的科技装置&#xff0c;通常用于军事用途。目前在民…

【物理/数学】—— 概念的理解 moment、momentum

moment&#xff1a;矩&#xff0c;momentum&#xff1a;[物] 动量&#xff1b;动力&#xff1b;冲力&#xff1b; 数学意义上的 moment&#xff08;矩&#xff09;概念其实源自于物理范畴。首先我们来介绍物理学意义上的矩&#xff08;Momentum&#xff09;的概念。 1. 物理学意…

JAVA多线程实现的三种方式

JAVA多线程实现方式主要有三种&#xff1a;继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。 其中前两种方式线程执行完后都没有返回值&#xff0c;只有最后一种是带返回值的。 前两种省略&#xff0c;着重看看第三种&#xff…

2springboot:快速创建springboot项目

使用IDEA快速创建springboot项目流程&#xff1a; 创建新的项目选择 项目的命名以及包名 需要什么包就导入什么包 进行测试的单元 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId>&…

如何做好渠道销售?

作者&#xff1a;路人李志强链接&#xff1a;https://www.zhihu.com/question/19689177/answer/28508799来源&#xff1a;知乎著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。作为一名一线品牌的渠道销售&#xff0c;如何让代理商放弃其他小品…

2017浙江省赛 B - Problem Preparation ZOJ - 3959

地址&#xff1a;http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode3959 题目&#xff1a; Its time to prepare the problems for the 14th Zhejiang Provincial Collegiate Programming Contest! Almost all members of Zhejiang University programming conte…

jQuery导入代码片段并绑定事件

a.html <div><button class"button" >点我达</button> </div> b.html <html> <head><script type"text/javascript" src"./js/jquery-1.0.1.js"></script><meta http-equiv"Content-Ty…

验证码识别

基于Keras&#xff0c;识别简单的4位字符的验证码。 https://github.com/ypwhs/captcha_break

LinCode落单的数

easy 落单的数 查看执行结果 60% 通过给出2*n 1 个的数字&#xff0c;除当中一个数字之外其它每一个数字均出现两次。找到这个数字。 您在真实的面试中是否遇到过这个题&#xff1f; Yes例子 给出 [1,2,2,1,3,4,3]。返回 4 挑战 一次遍历&#xff0c;常数级的额外空间复杂度…

汉邦高科范俊峰:关于透雾摄像机那点事

慧聪安防网讯 生活在北方的人们&#xff0c;隔三差五就和雾霾来一次亲密接触&#xff0c;雾霾对人们的出行和交通有很大的影响&#xff0c;雾霾笼罩之下&#xff0c;人们出行如果闯红灯、车辆违规行驶发生交通事故&#xff0c;交通监控摄像头只能“雾里看花”&#xff0c;透雾摄…

SpringBoot注解大全(转)

原文链接&#xff1a;[springBoot系列]--springBoot注解大全 一、注解(annotations)列表 SpringBootApplication&#xff1a;包含了ComponentScan、Configuration和EnableAutoConfiguration注解。其中ComponentScan让spring Boot扫描到Configuration类并把它加入到程序上下文。…

祭奠我的2018

提前写这篇文章&#xff0c;是因为深深的感觉到自己的无能 18年伊始&#xff0c;在浪潮干了大半年的我 还沉醉在深深的满足感中&#xff0c;感觉自己对工作游刃有余 那种自大和自我满足感充斥着我的心态 已经变得不会学习了 后来有一次机遇&#xff0c;让我有了跳出舒适的机会 …

工业摄像头传感器尺寸与像元尺寸的关系

http://www.mv186.com/show-list.php?id462 在机器自动化行业检测应用中&#xff0c;工业摄像头是必备的硬件&#xff0c;而图像传感器又是工业摄像头中最最关键核心的东西。图像传感器的尺寸&#xff08;靶面大小&#xff09;&#xff0c;往往直接关系到成像的质量。通常来讲…

CF-798B

B. Mike and stringstime limit per test2 secondsmemory limit per test256 megabytesinputstandard inputoutputstandard outputMike has n strings s1, s2, ..., sn each consisting of lowercase English letters. In one move he can choose a string si, erase the fi…

微信小程序倒计时实现

思路&#xff1a;跟一般js倒计时一样&#xff0c;主要在于this的变相传递。 实现效果&#xff1a; wxml文件部分代码&#xff1a; common.js文件 : 引用页JS文件: PS: 1.在data里初始化时间格式&#xff0c;是避免时间加载的第1秒显示为空白&#xff0c;因为setTimeOut是在1s以…

基于Kubeadm的Flannel分析

Flannel概述 Flannel是将多个不同子网&#xff08;基于主机Node&#xff09;通过被Flannel维护的Overlay网络拼接成为一张大网来实现互联的&#xff0c;通过官方的一张网络拓扑图我们可以对其基本原理一目了然&#xff1a; 值得探讨的是&#xff0c;flannel的这个overlay网络支…

sensor的skipping and binning 模式

1、第一种理解 关于sensor的缩放存在两种模式 binning mode 和skip mode skipping mode 就是把想要的数据采集上来 把其余的数据扔掉 如下所示 column skip 2 row skip 2 留下的就是白色的像素 黑色的像素丢掉。 binning mode 就是把相邻的像素合成一个像素&#xff0c;然后再…

5 结构型模式之 - 适配器模式

5 结构型模式之 - 适配器模式 适配器模式的介绍&#xff1a;适配器模式在开发中使用率很高&#xff0c;适配器是将两个不兼容的类融合在一起&#xff0c;它有点像粘合剂&#xff0c;将不同的东西通过一种转换使得它们能够协作起来。例如经常碰到两个不相关的类之间进行交互&…

Android进程保活

凡是做过几年Android开发的&#xff0c;都不能不面对进程保活这一问题。特别是这两年&#xff0c;面对谷歌&#xff0c;国内定制ROM&#xff0c;安全软件等多方围剿的情况下&#xff0c;app在后台保活的难度越来越大&#xff0c;可以说包括QQ、微信在内的所有app&#xff0c;都…

治安卡口摄像机与电警抓拍机之间有什么区别?

接下来小编和大家说说它们有哪些相同和不同的地方&#xff0c;供大家参考。 治安卡口&#xff1a; 卡口摄像机主要是用于城市道路或高速公路出入口、收费站等重点治安监控地段的全天候实时检测与记录收费站、交通或治安检查站等地点。 治安卡口监控系统的前端部分主要由三个单元…