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 触发select onchange事件代码
Mar 20 Javascript
JavaScript原生对象之String对象的属性和方法详解
Mar 13 Javascript
JS使用ajax从xml文件动态获取数据显示的方法
Mar 24 Javascript
整理JavaScript创建对象的八种方法
Nov 03 Javascript
javascript判断元素存在和判断元素存在于实时的dom中的方法
Jan 17 Javascript
C#微信小程序服务端获取用户解密信息实例代码
Mar 10 Javascript
浅谈webpack打包之后的文件过大的解决方法
Mar 07 Javascript
vue初始化动画加载的实例
Sep 01 Javascript
详解Vue、element-ui、axios实现省市区三级联动
May 07 Javascript
微信小程序如何调用图片接口API并居中显示
Jun 29 Javascript
Vue数据驱动表单渲染,轻松搞定form表单
Jul 19 Javascript
VUE使用draggable实现组件拖拽
Apr 06 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
javascript的函数作用域
2014/11/12 Javascript
chrome浏览器当表单自动填充时如何去除浏览器自动添加的默认样式
2015/10/09 Javascript
vue.js将unix时间戳转换为自定义时间格式
2017/01/03 Javascript
jQuery层级选择器实例代码
2017/02/06 Javascript
vue.js动态数据绑定学习笔记
2017/05/19 Javascript
jQuery+SpringMVC中的复选框选择与传值实例
2018/01/08 jQuery
微信小程序实现长按删除图片的示例
2018/05/18 Javascript
详解vue 项目白屏解决方案
2018/10/31 Javascript
详解vue中$nextTick和$forceUpdate的用法
2019/12/11 Javascript
Python易忽视知识点小结
2015/05/25 Python
Python selenium 三种等待方式解读
2016/09/15 Python
django manage.py扩展自定义命令方法
2018/05/27 Python
python/sympy求解矩阵方程的方法
2018/11/08 Python
Python安装Flask环境及简单应用示例
2019/05/03 Python
Python虚拟环境库virtualenvwrapper安装及使用
2020/06/17 Python
CSS3之边框多颜色Border-color属性使用示例
2013/10/11 HTML / CSS
HTML5的标签的代码的简单介绍 HTML5标签的简介
2012/05/28 HTML / CSS
canvas实现滑动验证的实现示例
2020/08/11 HTML / CSS
雅诗兰黛美国官网:Estee Lauder美国
2016/07/21 全球购物
英国在线汽车和面包车零件商店:Car Parts 4 Less
2018/08/15 全球购物
为什么UNION ALL比UNION快
2016/03/17 面试题
TCP/IP中的TCP和IP分别承担什么责任
2012/04/21 面试题
初级软件工程师面试题 Junior Software Engineer Interview
2015/02/15 面试题
介绍一下Ruby的特点
2013/01/20 面试题
打架检讨书400字
2014/01/17 职场文书
基层干部十八大感言
2014/01/19 职场文书
材料专业毕业生求职信
2014/02/26 职场文书
单位租房协议书样本
2014/10/30 职场文书
三年级学生评语大全
2014/12/26 职场文书
4S店收银员岗位职责
2015/04/07 职场文书
2015年超市工作总结
2015/04/09 职场文书
2015年“世界无车日”活动方案
2015/05/06 职场文书
晚会主持人开场白台词
2015/05/28 职场文书
小学体育跳绳课教学反思
2016/02/16 职场文书
2019终止劳动合同协议书最新范本!
2019/07/09 职场文书
Java多线程并发FutureTask使用详解
2022/06/28 Java/Android