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 相关文章推荐
js计数器代码
Nov 04 Javascript
JQuery实现简单验证码提示解决方案
Dec 20 Javascript
[将免费进行到底]在Amazon的一年免费服务器上安装Node.JS, NPM和OurJS博客
Aug 18 Javascript
JavaScript中的单引号和双引号报错的解决方法
Sep 01 Javascript
JavaScript获取网页中第一个链接ID的方法
Apr 03 Javascript
JavaScript文本框脚本编写的注意事项
Jan 25 Javascript
js实现瀑布流效果(自动生成新的内容)
Mar 16 Javascript
node.js 抓取代理ip实例代码
Apr 30 Javascript
微信小程序-API接口安全详解
Jul 16 Javascript
Vue 3.0 全家桶抢先体验
Apr 28 Javascript
vue实现几秒后跳转新页面代码
Sep 09 Javascript
Openlayers实现地图的基本操作
Sep 28 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伪静态页面函数附使用方法
2008/06/20 PHP
php将时间差转换为字符串提示
2011/09/07 PHP
thinkphp实现分页显示功能
2016/12/03 PHP
php中序列化与反序列化详解
2017/02/13 PHP
如何实现动态删除javascript函数
2007/05/27 Javascript
高效的获取当前元素是父元素的第几个子元素
2013/10/15 Javascript
用IE重起计算机或者关机的示例代码
2014/03/10 Javascript
js 设置缓存及获取设置的缓存
2014/05/08 Javascript
js实现当前输入框高亮显示的方法
2015/08/19 Javascript
js验证身份证号有效性并提示对应信息
2015/10/19 Javascript
jquery实现图片放大镜功能
2015/11/23 Javascript
基于JavaScript实现拖动滑块效果
2017/02/16 Javascript
JavaScript实现的仿新浪微博原生态输入字数即时检查功能【兼容IE6】
2017/09/26 Javascript
JS运动改变单物体透明度的方法分析
2018/01/23 Javascript
详解如何使用babel进行es6文件的编译
2018/05/29 Javascript
JS事件绑定的常用方式实例总结
2019/03/02 Javascript
bootstrap+spring boot实现面包屑导航功能(前端代码)
2019/10/09 Javascript
JS实现简易留言板(节点操作)
2020/03/16 Javascript
Python格式化压缩后的JS文件的方法
2015/03/05 Python
python实现文本界面网络聊天室
2018/12/12 Python
numpy concatenate数组拼接方法示例介绍
2019/05/27 Python
tensorflow对图像进行拼接的例子
2020/02/05 Python
Python处理mysql特殊字符的问题
2020/03/02 Python
python 实现控制鼠标键盘
2020/11/27 Python
利用css3实现的简单的鼠标悬停按钮
2014/11/04 HTML / CSS
10分钟理解CSS3 Grid布局
2018/12/20 HTML / CSS
大学本科毕业生的自我鉴定范文
2013/11/19 职场文书
城市精细化管理实施方案
2014/03/04 职场文书
小学语文国培感言
2014/03/04 职场文书
征婚广告词
2014/03/17 职场文书
介绍信样本
2015/01/31 职场文书
2015庆祝七一建党节94周年活动总结
2015/03/20 职场文书
四十年同学聚会致辞
2015/07/28 职场文书
安全教育培训心得体会
2016/01/15 职场文书
员工给公司的建议书
2019/06/24 职场文书
Python深度学习之实现卷积神经网络
2021/06/05 Python