Vue.js组件通信的几种姿势


Posted in Javascript onOctober 23, 2017

写在前面

因为对Vue.js很感兴趣,而且平时工作的技术栈也是Vue.js,这几个月花了些时间研究学习了一下Vue.js源码,并做了总结与输出。

文章的原地址: https://github.com/answershuto/learnVue 。

在学习过程中,为Vue加上了中文的注释 https://github.com/answershuto/learnVue/tree/master/vue-src ,希望可以对其他想学习Vue源码的小伙伴有所帮助。

可能会有理解存在偏差的地方,欢迎提issue指出,共同学习,共同进步。

什么是Vue组件?

组件 (Component) 是 Vue.js 最强大的功能之一。组件可以扩展 HTML 元素,封装可重用的代码。在较高层面上,组件是自定义元素,Vue.js 的编译器为它添加特殊功能。在有些情况下,组件也可以是原生 HTML 元素的形式,以 is 特性扩展。

Vue组件间通信

父组件向子组件通信

方法一:props

使用 props ,父组件可以使用props向子组件传递数据。

父组件vue模板father.vue

<template>
  <child :msg="message"></child>
</template>
<script>
import child from './child.vue';
export default {
  components: {
    child
  },
  data () {
    return {
      message: 'father message';
    }
  }
}
</script>

子组件vue模板child.vue

<template>
  <div>{{msg}}</div>
</template>
<script>
export default {
  props: {
    msg: {
      type: String,
      required: true
    }
  }
}
</script>

方法二 使用$children

使用 $children 可以在父组件中访问子组件。

子组件向父组件通信

方法一:使用 vue事件

父组件向子组件传递事件方法,子组件通过$emit触发事件,回调给父组件。

父组件vue模板father.vue

<template>
  <child @msgFunc="func"></child>
</template>
<script>
import child from './child.vue';
export default {
  components: {
    child
  },
  methods: {
    func (msg) {
      console.log(msg);
    }
  }
}
</script>

子组件vue模板child.vue

<template>
  <button @click="handleClick">点我</button>
</template>
<script>
export default {
  props: {
    msg: {
      type: String,
      required: true
    }
  },
  methods () {
    handleClick () {
      //........
      this.$emit('msgFunc');
    }
  }
}
</script>

方法二: 通过修改父组件传递的props来修改父组件数据

这种方法只能在父组件传递一个引用变量时可以使用,字面变量无法达到相应效果。因为饮用变量最终无论是父组件中的数据还是子组件得到的props中的数据都是指向同一块内存地址,所以修改了子组件中props的数据即修改了父组件的数据。

但是并不推荐这么做,并不建议直接修改props的值,如果数据是用于显示修改的,在实际开发中我经常会将其放入data中,在需要回传给父组件的时候再用事件回传数据。这样做保持了组件独立以及解耦,不会因为使用同一份数据而导致数据流异常混乱,只通过特定的接口传递数据来达到修改数据的目的,而内部数据状态由专门的data负责管理。

方法三:使用$parent

使用 $parent 可以访问父组件的数据。

非父子组件、兄弟组件之间的数据传递

非父子组件通信,Vue官方推荐 使用一个Vue实例作为中央事件总线 。

Vue内部有一个事件机制,可以参考 源码 。

$on方法用来监听一个事件。

$emit用来触发一个事件。

/*新建一个Vue实例作为中央事件总嫌*/
let event = new Vue();
/*监听事件*/
event.$on('eventName', (val) => {
  //......do something
});
/*触发事件*/
event.$emit('eventName', 'this is a message.');

多层级父子组件通信:

在Vue1.0中实现了$broadcast与$dispatch两个方法用来向子组件(或父组件)广播(或派发),当子组件(或父组件)上监听了事件并返回true的时候会向爷孙级组件继续广播(或派发)事件。但是这个方法在Vue2.0里面已经被移除了。

之前在学习饿了么的开源组件库 element 的时候发现他们重新实现了broadcast以及dispatch的方法,以mixin的方式引入,具体可以参考 《说说element组件库broadcast与dispatch》 。但是跟Vue1.0的两个方法实现有略微的不同。这两个方法实现了向子孙组件事件广播以及向多层级父组件事件派发的功能。但是并非广义上的事件广播,它需要指定一个commentName进行向指定组件名组件定向广播(派发)事件。

其实这两个方法内部实现还是用到的还是$parent以及$children,用以遍历子节点或是逐级向上查询父节点,访问到指定组件名的时候,调用$emit触发指定事件。

复杂的单页应用数据管理

当应用足够复杂情况下,请使用 vuex 进行数据管理。

总结

以上所述是小编给大家介绍的Vue.js组件通信的几种姿势,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
JavaScript常用对象的方法和属性小结
Jan 24 Javascript
类似php的js数组的in_array函数自定义方法
Dec 27 Javascript
js网页右下角提示框实例
Oct 14 Javascript
微信小程序 高德地图SDK详解及简单实例(源码下载)
Jan 11 Javascript
jquery实时获取时间的简单实例
Jan 26 Javascript
Echarts基本用法_动力节点Java学院整理
Aug 11 Javascript
JSON对象转化为字符串详解
Aug 11 Javascript
Vue.use源码学习小结
Jun 20 Javascript
vue中的自定义分页插件组件的示例
Aug 18 Javascript
在vue中使用v-bind:class的选项卡方法
Sep 27 Javascript
jQuery操作attr、prop、val()/text()/html()、class属性
May 23 jQuery
three.js 如何制作魔方
Jul 31 Javascript
Vue2.0+ElementUI实现表格翻页的实例
Oct 23 #Javascript
JavaScript之创意时钟项目(实例讲解)
Oct 23 #Javascript
浅谈js的解析顺序 作用域 严格模式
Oct 23 #Javascript
基于Vue2.0+ElementUI实现表格翻页功能
Oct 23 #Javascript
React操作真实DOM实现动态吸底部的示例
Oct 23 #Javascript
利用pm2部署多个node.js项目的配置教程
Oct 22 #Javascript
vue.js中父组件调用子组件的内部方法示例
Oct 22 #Javascript
You might like
用PHP写的MySQL数据库用户认证系统代码
2007/03/22 PHP
sourcesafe管理phpproj文件的补充说明(downmoon)
2009/04/11 PHP
使用zend studio for eclipse不能激活代码提示功能的解决办法
2009/10/11 PHP
解析PHP实现下载文件的两种方法
2013/07/05 PHP
PHP 面向对象程序设计(oop)学习笔记 (四) - 异常处理类Exception
2014/06/12 PHP
PHP间隔一段时间执行代码的方法
2014/12/02 PHP
php实现表单多按钮提交action的处理方法
2015/10/24 PHP
PHP中Http协议post请求参数
2015/11/02 PHP
php类的自动加载操作实例详解
2016/09/28 PHP
laravel 自定义常量的两种方案
2019/10/14 PHP
原生javascript实现图片轮播效果代码
2010/09/03 Javascript
深入理解JavaScript系列(1) 编写高质量JavaScript代码的基本要点
2012/01/15 Javascript
jquery.Ajax()方法调用Asp.Net后台的方法解析
2014/02/13 Javascript
jquery中map函数与each函数的区别实例介绍
2014/06/23 Javascript
js+css实现上下翻页相册代码分享
2015/08/18 Javascript
jquery实现可旋转可拖拽的文字效果代码
2016/01/27 Javascript
Node.js中常规的文件操作总结
2016/10/13 Javascript
JS经典正则表达式笔试题汇总
2016/12/15 Javascript
JavaScript 数组去重并统计重复元素出现的次数实例
2017/12/14 Javascript
详解新手使用vue-router传参时注意事项
2019/06/06 Javascript
微信小程序自定义tabBar在uni-app的适配详解
2019/09/30 Javascript
Python数据结构与算法之常见的分配排序法示例【桶排序与基数排序】
2017/12/15 Python
django自带的server 让外网主机访问方法
2018/05/14 Python
Python图像处理之简单画板实现方法示例
2018/08/30 Python
Python----数据预处理代码实例
2019/03/20 Python
Python 开发工具PyCharm安装教程图文详解(新手必看)
2020/02/28 Python
python 解决pycharm运行py文件只有unittest选项的问题
2020/09/01 Python
python+selenium实现12306模拟登录的步骤
2021/01/21 Python
中国第一家杂志折扣订阅网:杂志铺
2016/08/30 全球购物
巴西电子产品购物网站:Saldão da Informática
2018/01/09 全球购物
英国书籍、CD、DVD和游戏的第一道德零售商:Awesome Books
2020/02/22 全球购物
反腐倡廉标语
2014/06/24 职场文书
2014年科室工作总结
2014/11/20 职场文书
2015年技术工作总结范文
2015/04/20 职场文书
CPU不支持Windows11系统怎么办
2021/11/21 数码科技
使用SQL实现车流量的计算的示例代码
2022/02/28 SQL Server