vue父子组件通信的高级用法示例


Posted in Javascript onAugust 29, 2019

前言

vue项目的一大亮点就是组件化。使用组件可以极大地提高项目中代码的复用率,减少代码量。但是使用组件最大的难点就是父子组件之间的通信。

子通信父

父组件

<template>
<div class="parent">
我是父组件
<!--父组件监听子组件触发的say方法,调用自己的parentSay方法-->
<!--通过:msg将父组件的数据传递给子组件-->
<children :msg="msg" @say="parentSay"></children>
</div>
</template>

<script>
import Children from './children.vue'
export default {
data () {
return {
msg: 'hello, children'
}
},
methods: {
// 参数就是子组件传递出来的数据
parentSay(msg){
console.log(msg) // hello, parent
}
},

// 引入子组件
components:{
children: Children
}
}
</script>

子组件

<template>
<div class="hello">
<div class="children" @click="say">
我是子组件
<div>
父组件对我说:{{msg}}
</div>
</div>

</div>
</template>

<script>

export default {
//父组件通过props属性传递进来的数据
props: {
msg: {
type: String,
default: () => {
return ''
}
}
},
data () {
return {
childrenSay: 'hello, parent'
}
},

methods: {
// 子组件通过emit方法触发父组件中定义好的函数,从而将子组件中的数据传递给父组件
say(){
this.$emit('say' , this.childrenSay);
}
}
}
</script>

子组件使用$emit方法调用父组件的方法,达到子通信父的目的。

父通信子

父组件

<!--Html-->
<template>
<!--父组件触发click方法-->
<div class="parent" @click="say">
我是父组件
<!--通过ref标记子组件-->
<children ref="child"></children>
</div>
</template>

<script>
import Children from './children.vue'
export default {
data () {
return {
msg: "hello,my son"
}
},
methods: {
// 通过$refs调用子组件的parentSay方法
say(){
this.$refs.child.parentSay(this.msg);
}
},

// 引入子组件
components:{
children: Children
}
}
</script>

子组件

<template>
<div class="hello">
<div class="children" >
我是子组件
<div>
父组件对我说:{{msg}}
</div>
</div>

</div>
</template>

<script>

export default {
data () {
return {
msg: ''
}
},

methods: {
// 父组件调用的JavaScript方法parentSay
parentSay(msg){
this.msg = msg;
}
}
}
</script>

父组件通过 $refs 调用子组件的方法。

以上就是父子组件通信的方式,父子组件传递数据直接用props,或者使用 $emit 和 $refs 依靠事件来传递数据。

父子组件通信提升篇

上文中,子通信父是在 子中触发点击事件 然后调用父组件的方法,父通信子是在 父中触发点击事件 调用子组件的方法。但是实际情况中可能存在 子通信父时子组件不允许有点击事件 而事件在父中或者 父通信子时点击事件在子组件 中。

子通信父时击事件在父组件

这种情况其实很常见,例如提交一个表单时表单的内容为子组件,而保存按钮在父组件上。此时点击保存按钮想要获取子组件表单的值。这种情况下已经不单单是子通信父和父通信子了,需要将两者结合在一起使用才能完成整个通信过程。

实现的思路是在父组件中点击事件时,先通过父子通信调用子组件的方法,然后在子组件中的该方法里使用子父通信调用父组件的另一个方法并将信息传递回来。以下是代码演示:

父组件

<template>
<div class="parent" @click="getData">
我是父组件
<!--父组件监听子组件触发的transData方法,调用自己的transData方法-->
<!--通过ref标记子组件-->
<children ref="child" @transData="transData"></children>
</div>
</template>

<script>
import Children from './children.vue'
export default {
data () {
return {
msg: 'hello, children'
}
},
methods: {
getData(){
// 调用子组件的getData方法
this.$refs.child.getData();
},
// 参数就是子组件传递出来的数据
transData(msg){
console.log(msg) // hello, parent
}
},

// 引入子组件
components:{
children: Children
}
}
</script>

子组件

<template>
<div class="hello">
<div class="children" >
我是子组件
<div>
子组件的数据:{{childrenSay}}
</div>
</div>

</div>
</template>

<script>

export default {
data () {
return {
childrenSay: 'hello, parent'
}
},
methods: {
// 子组件通过emit方法触发父组件中定义好的函数,从而将子组件中的数据传递给父组件
getData() {
this.$emit('transData' , this.childrenSay);
}
}
}
</script>

另一种情况思路也和这个一样,基础就在与父通信子和子通信父的灵活运用。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
ExtJS 2.2.1的grid控件在ie6中的显示问题
May 04 Javascript
JQuery读取XML文件数据并显示的实现代码
Dec 16 Javascript
CSS+jQuery实现的一个放大缩小动画效果
Sep 24 Javascript
php实例分享之实现显示网站运行时间
May 20 Javascript
js使用removeChild方法动态删除div元素
Aug 01 Javascript
js拆分字符串并将分割的数据放到数组中的方法
May 06 Javascript
利用vueJs实现图片轮播实例代码
Jun 03 Javascript
jQuery扩展_动力节点Java学院整理
Jul 05 jQuery
Vue-cli Eslint在vscode里代码自动格式化的方法
Feb 23 Javascript
JavaScript实现多张图片放大镜效果示例【不限定图片尺寸,rem单位】
May 14 Javascript
layui表格数据复选框回显设置方法
Sep 13 Javascript
使用element-ui +Vue 解决 table 里包含表单验证的问题
Jul 17 Javascript
Elementui表格组件+sortablejs实现行拖拽排序的示例代码
Aug 28 #Javascript
JS中async/await实现异步调用的方法
Aug 28 #Javascript
基于Node的Axure文件在线预览的实现代码
Aug 28 #Javascript
详解用async/await来处理异步
Aug 28 #Javascript
vue中监听返回键问题
Aug 28 #Javascript
微信小程序 拍照或从相册选取图片上传代码实例
Aug 28 #Javascript
小程序中this.setData的使用和注意事项
Aug 28 #Javascript
You might like
配置php网页显示各种语法错误
2013/09/23 PHP
thinkphp路由规则使用示例详解和伪静态功能实现(apache重写)
2014/02/24 PHP
PHP中spl_autoload_register()和__autoload()区别分析
2014/05/10 PHP
php实现按照权重随机排序数据的方法
2015/01/09 PHP
php判断输入是否是纯数字,英文,汉字的方法
2015/03/05 PHP
Yii2选项卡的简单使用
2017/05/26 PHP
Laravel给生产环境添加监听事件(SQL日志监听)
2017/06/19 PHP
详解laravel安装使用Passport(Api认证)
2018/07/27 PHP
JS模拟多线程
2007/02/07 Javascript
利用jquery.qrcode在页面上生成二维码且支持中文
2014/02/12 Javascript
JS面向对象编程详解
2016/03/06 Javascript
分离与继承的思想实现图片上传后的预览功能:ImageUploadView
2016/04/07 Javascript
javascript基础语法——全面理解变量和标识符
2016/06/02 Javascript
原生js仿jquery实现对Ajax的封装
2016/10/04 Javascript
javascript实现鼠标点击页面 移动DIV
2016/12/02 Javascript
jQuery实现可拖动进度条实例代码
2017/06/21 jQuery
Vue2 Vue-cli中使用Typescript的配置详解
2017/07/24 Javascript
记一次webapck4 配置文件无效的解决历程
2018/09/19 Javascript
基于vue通用表单解决方案的思考与分析
2019/03/16 Javascript
laydate只显示时分 不显示秒的功能实现方法
2019/09/28 Javascript
vue导航栏部分的动态渲染实例
2019/11/01 Javascript
[48:41]VP vs VG Supermajor小组赛 B组胜者组决赛 BO3 第二场 6.2
2018/06/03 DOTA
[01:21]DOTA2 新英雄 森海飞霞
2020/12/18 DOTA
python根据距离和时长计算配速示例
2014/02/16 Python
Python中列表元素转为数字的方法分析
2016/06/14 Python
老生常谈Python进阶之装饰器
2017/05/11 Python
python实现最长公共子序列
2018/05/22 Python
Django网络框架之创建虚拟开发环境操作示例
2019/06/06 Python
Python 文件操作之读取文件(read),文件指针与写入文件(write),文件打开方式示例
2019/09/29 Python
详解Python绘图Turtle库
2019/10/12 Python
Python实现京东抢秒杀功能
2021/01/25 Python
英国排名第一的礼品体验公司:Red Letter Days
2018/08/16 全球购物
应届生学校辅导员求职信
2013/11/07 职场文书
财务工作个人求职的自我评价
2013/12/19 职场文书
新闻通讯稿模板
2015/07/22 职场文书
Python办公自动化PPT批量转换操作
2021/09/15 Python