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 相关文章推荐
javascript学习笔记之函数定义
Jun 25 Javascript
easyui window refresh 刷新两次的解决方法(推荐)
May 18 Javascript
浅谈JavaScript前端开发的MVC结构与MVVM结构
Jun 03 Javascript
基于JavaScript实现跳转提示页面
Sep 24 Javascript
JavaScript之WebSocket技术详解
Nov 18 Javascript
Bootstrap基本组件学习笔记之按钮组(8)
Dec 07 Javascript
微信小程序 点击控件后选中其它反选实例详解
Feb 21 Javascript
JS组件系列之MVVM组件构建自己的Vue组件
Apr 28 Javascript
JS实现自定义弹窗功能
Aug 08 Javascript
Vue开发中遇到的跨域问题及解决方法
Feb 11 Javascript
vue-router 控制路由权限的实现
Sep 24 Javascript
vue3自定义dialog、modal组件的方法
Jan 04 Vue.js
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读取ACCESS数据到MYSQL的代码
2011/05/11 PHP
分享一下贝贝成长进度的php代码
2012/09/14 PHP
php创建桌面快捷方式实现方法
2015/12/31 PHP
程序员的表白神器“520”大声喊出来
2016/05/20 PHP
JavaScript OOP类与继承
2009/11/15 Javascript
jquery CSS选择器笔记
2010/03/29 Javascript
js判断undefined类型,undefined,null, 的区别详细解析
2013/12/16 Javascript
Jquery对select的增、删、改、查操作
2015/02/06 Javascript
JavaScript实现字符串与日期的互相转换及日期的格式化
2016/03/07 Javascript
使用bootstrap实现多窗口和拖动效果
2016/09/22 Javascript
NODE.JS跨域问题的完美解决方案
2016/10/20 Javascript
详解nodejs 文本操作模块-fs模块(四)
2016/12/22 NodeJs
web.js.字符串与正则表达式操作
2017/05/13 Javascript
JS获取短信验证码倒计时的实现代码
2017/05/22 Javascript
javascript简单写的判断电话号码实例
2017/05/24 Javascript
layui多iframe页面控制定时器运行的方法
2019/09/05 Javascript
jquery中attr、prop、data区别与用法分析
2019/09/25 jQuery
[01:15:44]首部DOTA2纪录片今日23时全网上映
2014/03/19 DOTA
让 python 命令行也可以自动补全
2014/11/30 Python
Python实现的彩票机选器实例
2015/06/17 Python
Python合并字典键值并去除重复元素的实例
2016/12/18 Python
Python编程把二叉树打印成多行代码
2018/01/04 Python
浅谈python正则的常用方法 覆盖范围70%以上
2018/03/14 Python
Python3实现二叉树的最大深度
2019/09/30 Python
通过自学python能找到工作吗
2020/06/21 Python
python读取excel进行遍历/xlrd模块操作
2020/07/12 Python
在vscode中启动conda虚拟环境的思路详解
2020/12/25 Python
HTML5实现移动端弹幕动画效果
2019/08/01 HTML / CSS
中粮集团旗下食品网上购物网站:我买网
2016/09/22 全球购物
Yves Rocher捷克官方网站:植物化妆品的创造者
2019/07/31 全球购物
集团公司总经理岗位职责
2013/12/20 职场文书
师生聚会感言
2014/01/26 职场文书
退休教师欢送会主持词
2014/03/31 职场文书
大学生个人总结范文
2015/02/15 职场文书
国庆阅兵观后感
2015/06/15 职场文书
vue el-table实现递归嵌套的示例代码
2022/08/14 Vue.js