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 相关文章推荐
MSN消息提示类
Sep 05 Javascript
JavaScript中出现乱码的处理心得
Dec 24 Javascript
cnblogs TagCloud基于jquery的实现代码
Jun 11 Javascript
原生javascript模仿win8等待提示圆圈进度条
Apr 24 Javascript
jQuery实现可用于博客的动态滑动菜单完整实例
Sep 17 Javascript
理解Angular数据双向绑定
Jan 10 Javascript
浅谈vue引用静态资源需要注意的事项
Sep 28 Javascript
WEEX环境搭建与入门详解
Oct 16 Javascript
js实现一款简单踩白块小游戏(曾经很火)
Dec 02 Javascript
vue $mount 和 el的区别说明
Sep 11 Javascript
JavaScript获取时区实现过程解析
Sep 24 Javascript
JS操作JSON常用方法(10w阅读)
Dec 06 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 类型转换函数intval
2009/06/20 PHP
PHP 缓存实现代码及详细注释
2010/05/16 PHP
详解WordPress中添加友情链接的方法
2016/05/21 PHP
PHP使用两个栈实现队列功能的方法
2018/01/15 PHP
Laravel定时任务的每秒执行代码
2019/10/22 PHP
jquery默认校验规则整理
2014/03/24 Javascript
Javascript实现获取窗口的大小和位置代码分享
2014/12/04 Javascript
JS验证IP,子网掩码,网关和MAC的方法
2015/07/02 Javascript
jQuery检测返回值的数据类型
2015/07/13 Javascript
jquery实现树形菜单完整代码
2015/12/29 Javascript
setTimeout函数的神奇使用
2017/02/26 Javascript
如何把vuejs打包出来的文件整合到springboot里
2018/07/26 Javascript
layui实现下拉框三级联动
2019/07/26 Javascript
详细解读Python的web.py框架下的application.py模块
2015/05/02 Python
Python列表删除的三种方法代码分享
2017/10/31 Python
python实现决策树
2017/12/21 Python
Python基于生成器迭代实现的八皇后问题示例
2018/05/23 Python
解决Pycharm后台indexing导致不能run的问题
2019/06/27 Python
Django单元测试工具test client使用详解
2019/08/02 Python
使用pytorch完成kaggle猫狗图像识别方式
2020/01/10 Python
Python semaphore evevt生产者消费者模型原理解析
2020/03/18 Python
Python Numpy中数据的常用保存与读取方法
2020/04/01 Python
python3通过udp实现组播数据的发送和接收操作
2020/05/05 Python
python 图像增强算法实现详解
2021/01/24 Python
HTML5边玩边学(3)像素和颜色
2010/09/21 HTML / CSS
吃透移动端 Html5 响应式布局
2019/12/16 HTML / CSS
解决python 输出到csv 出现多空行的情况
2021/03/24 Python
小学教师学期末自我评价
2013/09/25 职场文书
校园门卫岗位职责
2013/12/09 职场文书
残疾人创业典型事迹
2014/02/01 职场文书
信用卡结清证明怎么写
2014/09/13 职场文书
党的群众路线对照检查材料(个人)
2014/09/24 职场文书
护士长2014年度工作总结
2014/11/11 职场文书
谢师宴答谢词
2015/01/05 职场文书
扬州个园导游词
2015/02/06 职场文书
PostGIS的安装与入门使用指南
2022/01/18 PostgreSQL