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 相关文章推荐
Open and Print a Word Document
Jun 15 Javascript
基于JavaScript实现继承机制之构造函数+原型链混合方式的使用详解
May 07 Javascript
css如何让浮动元素水平居中
Aug 07 Javascript
js遍历json的key和value的实例
Jan 22 Javascript
从零开始学习Node.js系列教程三:图片上传和显示方法示例
Apr 13 Javascript
详解基于vue的移动web app页面缓存解决方案
Aug 03 Javascript
AngularJS 中的数据源的循环输出
Oct 12 Javascript
vue组件发布到npm简单步骤
Nov 30 Javascript
jQuery实现为table表格动态添加或删除tr功能示例
Feb 19 jQuery
详解微信小程序-扫一扫 wx.scanCode() 扫码大变身
Apr 30 Javascript
vue resource发送请求的几种方式
Sep 30 Javascript
javascript实现异形滚动轮播
Nov 28 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
上海无线电三厂简史修改版
2021/03/01 无线电
php无限极分类实现的两种解决方法
2013/04/28 PHP
thinkphp3.x中cookie方法的用法分析
2016/05/19 PHP
JavaScript移除数组内重复元素的方法
2015/03/18 Javascript
JS实用的动画弹出层效果实例
2015/05/05 Javascript
JavaScript中的跨浏览器事件操作的基本方法整理
2016/05/20 Javascript
ionic js 模型 $ionicModal 可以遮住用户主界面的内容框
2016/06/06 Javascript
JavaScript函数中关于valueOf和toString的理解
2016/06/14 Javascript
极力推荐10个短小实用的JavaScript代码段
2016/08/03 Javascript
domReady的实现案例
2016/11/23 Javascript
BootStrap Datepicker 插件修改为默认中文的实现方法
2017/02/10 Javascript
jQuery plugin animsition使用小结
2017/09/14 jQuery
收集前端面试题之url、href、src
2018/03/22 Javascript
vue 配置多页面应用的示例代码
2018/10/22 Javascript
浅谈 Webpack 如何处理图片(开发、打包、优化)
2019/05/15 Javascript
layui复选框限制选择个数的方法
2019/09/18 Javascript
[01:32:10]NAVI vs VG Supermajor 败者组 BO3 第一场 6.5
2018/06/06 DOTA
使用httplib模块来制作Python下HTTP客户端的方法
2015/06/19 Python
Python实现解析Bit Torrent种子文件内容的方法
2017/08/29 Python
Python scikit-learn 做线性回归的示例代码
2017/11/01 Python
Python中支持向量机SVM的使用方法详解
2017/12/26 Python
Python DataFrame设置/更改列表字段/元素类型的方法
2018/06/09 Python
浅析python的优势和不足之处
2018/11/20 Python
关于python下cv.waitKey无响应的原因及解决方法
2019/01/10 Python
Python面向对象程序设计类的多态用法详解
2019/04/12 Python
Django 缓存配置Redis使用详解
2019/07/23 Python
Python使用循环神经网络解决文本分类问题的方法详解
2020/01/16 Python
Python终端输出彩色字符方法详解
2020/02/11 Python
Python+Kepler.gl轻松制作酷炫路径动画的实现示例
2020/06/02 Python
CSS3悬停效果案例应用
2012/11/21 HTML / CSS
凯特·丝蓓英国官网:Kate Spade英国
2016/11/07 全球购物
新西兰珠宝品牌:Michael Hill
2017/09/16 全球购物
阿玛瑞酒店中文官方网站:Amari.com
2018/02/13 全球购物
意大利在线大学图书馆:Libreria universitaria
2019/07/16 全球购物
Go语言使用select{}阻塞main函数介绍
2021/04/25 Golang
Python中的datetime包与time包包和模块详情
2022/02/28 Python