vue2.0组件通信各种情况总结与实例分析

 

Props在vue组件中各种角色总结

在Vue中组件是实现模块化开发的主要内容,而组件的通信更是vue数据驱动的灵魂,现就四种主要情况总结如下:

使用props传递数据---组件内部

  1. //html
  2. <div id="app1">
  3. <i>注意命名规定:仅在html内使用my-message</i>
  4. <child my-message="组件内部数据传递"></child>
  5. </div>
  6. //js
  7. <script>
  8. Vue.component('child', {
  9. props: ['myMessage'],
  10. template: '<mark>{{ myMessage }}<mark/>'
  11. });
  12. new Vue({
  13. el: '#app1'
  14. })
  15. </script>

动态props通信---组件与根节点(父子之间)

  1. <div id="app2">
  2. <input v-model="parentMsg">
  3. <br>
  4. <child :parent-msg="parentMsg"></child>
  5. </div>
  6. <script>
  7. Vue.component('child', {
  8. props: ['parentMsg'],
  9. template: '<mark>{{ parentMsg }}<mark/>'
  10. });
  11. new Vue({
  12. el: '#app2',
  13. data: {
  14. parentMsg: 'msg from parent!'
  15. }
  16. })
  17. </script>
  • 对比分析:
  • 例子1:

    1. <comp some-prop="1"></comp>
    2. //组件内部数据传递,对应字面量语法:传递了一个字符串"1"
  • 例子2:

    1. <comp v-bind:some-prop="1"></comp>
    2. //组件与根节点数据传递,对应动态语法:传递实际的数字:js表达式

    单向数据流动特点:父组件属性变化时将传导给子组件,反之不可

  • 两种改变prop情况
  • 注意在 JavaScript 中对象和数组是引用类型,指向同一个内存空间,如果 prop 是一个对象或数组,在子组件内部改变它会影响父组件的状态。

    1. //定义一个局部data属性,并将 prop 的初始值作为局部数据的初始值
    2. props: ['initialCounter'],
    3. data: function () {
    4. return { counter: this.initialCounter }
    5. }
    6. //定义一个局部computed属性,此属性从 prop 的值计算得出
    7. props: ['size'],
    8. computed: {
    9. normalizedSize: function () {
    10. return this.size.trim().toLowerCase()
    11. }
    12. }

    子组件索引

    尽管有 props 和 events ,但是有时仍然需要在 JavaScript 中直接访问子组件。为此可以使用 ref 为子组件指定一个索引 ID

    1. <div id="parent">
    2. <!-- vm.$refs.p will be the DOM node -->
    3. <b ref="p">hello</b>
    4. <!-- vm.$refs.child will be the child comp instance -->
    5. <user-profile v-for='i in 3' ref="profile"></user-profile>
    6. </div>
    7. <script>
    8. var userPf=Vue.component('user-profile',{
    9. template:'<div>hello $refs</div>'
    10. });
    11. var parent = new Vue({ el: '#parent' });
    12. // 访问子组件
    13. var child = parent.$refs.profile;
    14. console.log(child[0]);
    15. console.log(parent.$refs.p);
    16. </script>

    $refs 只在组件渲染完成后才填充,并且它是非响应式的。它仅仅作为一个直接访问子组件的应急方案——应当避免在模版或计算属性中使用 $refs 。

数据反传---自定义事件

自定义事件的根基在于每个vue实例都实现了事件接口(Event interface)
Vue的事件系统分离自浏览器的EventTarget API。尽管它们的运行类似,但是$on 和 $emit 不是addEventListener 和 dispatchEvent 的别名。
父组件可以在使用子组件的地方直接用 v-on 来监听子组件触发的事件

  • 监听:$on(eventName)
  • 触发:$emit(eventName)

    1. <div id="app3">
    2. <p>Look at the parent's data: <mark>{{t}}</mark> & the child's data: <mark>{{childWords}}</mark></p>
    3. <child v-on:add="pChange"></child>
    4. <child v-on:add="pChange"></child>
    5. <child v-on:click.native="native"></child>
    6. </div>
    7. <script>
    8. Vue.component('child', {
    9. template: `<button @click="add">{{ c }}</button>`,
    10. data: function () {
    11. return {
    12. c: 0,
    13. msg: 'I am from child\'s data'
    14. }
    15. },
    16. methods: {
    17. add: function () {
    18. this.c += 1;
    19. this.$emit('add',this.msg);
    20. }
    21. },
    22. });
    23. new Vue({
    24. el: '#app3',
    25. data: {
    26. t: 0,
    27. childWords: ''
    28. },
    29. methods: {
    30. pChange: function (msg) {
    31. this.t += 1;
    32. this.childWords=msg;
    33. },
    34. native:function () {
    35. alert('I am a native event ,which comes from the root element!');
    36. }
    37. }
    38. })
    39. </script>

    兄弟间通信---简单场景用bus,复杂场景用vuex

  1. <div id="app4">
  2. <display></display>
  3. <increment></increment>
  4. </div>
  5. <script>
  6. var bus = new Vue();
  7. Vue.component('increment', {
  8. template: `<button @click="add">+</button>`,
  9. data: function () {
  10. return {count: 0}
  11. },
  12. methods: {
  13. add: function () {
  14. bus.$emit('inc', this.count+=1)
  15. }
  16. }
  17. });
  18. Vue.component('display', {
  19. template: `<span>Clicked: <mark>{{c}}</mark> times</span>`,
  20. data: function () {
  21. return {c: 0}
  22. },
  23. created: function () {
  24. var self=this;
  25. // bus.$on('inc', function (num) {
  26. // self.c = num
  27. // });
  28. bus.$on('inc', (num) =>
  29. this.c = num
  30. );
  31. }
  32. });
  33. vm = new Vue({
  34. el: "#app4",
  35. })
  36. </script>

总结:Vue中关于组件间及组件与根节点间通信都可以人为是父子兄弟间的通信,另外父子关系是相对的即与上下文有关(比如A组件的父组件可能是B组件的子组件);上述四个例子分别演示了不同组件通信的机制。
澄清了上述问题不难理这句话:
编译作用域---父组件模板的内容在父组件作用域内编译;子组件模板的内容在子组件作用域内编译。分发内容是在父组件作用域内编译

 

通信vue2.0组件的更多相关文章

  1. vue2.0组件传值

    props down   emit up 嘿嘿    如果是第一次接触vue2.0组件传值的肯定很疑惑,这是什么意思(大神总结的,我也就是拿来用用) “down”—>指的是下的意思,即父组件向子 ...

  2. vue2.0组件库

    UI组件 element - 饿了么出品的Vue2的web UI工具套件 Vux - 基于Vue和WeUI的组件库 mint-ui - Vue 2的移动UI元素 iview - 基于 Vuejs 的开 ...

  3. Vue2.0组件之间通信(转载)

    Vue中组件这个特性让不少前端er非常喜欢,我自己也是其中之一,它让前端的组件式开发更加合理和简单.笔者之前有写过一篇Vue2.0子父组件通信,这次我们就来聊一聊平级组件之间的通信. 首先我们先搭好开 ...

  4. Vue2.0组件之间通信

    Vue中组件这个特性让不少前端er非常喜欢,我自己也是其中之一,它让前端的组件式开发更加合理和简单.笔者之前有写过一篇Vue2.0子父组件通信,这次我们就来聊一聊平级组件之间的通信. 首先我们先搭好开 ...

  5. Vue2.0组件实现动态搜索引擎(一)

    原文链接:https://blog.csdn.net/qwezxc24680/article/details/74550556 从github上看到一个不错的开源项目:https://github.c ...

  6. Vue2.0组件间数据传递

    Vue1.0组件间传递 使用$on()监听事件: 使用$emit()在它上面触发事件: 使用$dispatch()派发事件,事件沿着父链冒泡: 使用$broadcast()广播事件,事件向下传导给所有 ...

  7. Vue2.0+组件库总结

    转自:https://blog.csdn.net/lishanleilixin/article/details/84025459 UI组件 element - 饿了么出品的Vue2的web UI工具套 ...

  8. 转:Vue2.0+组件库总结

    UI组件 element - 饿了么出品的Vue2的web UI工具套件 Vux - 基于Vue和WeUI的组件库 mint-ui - Vue 2的移动UI元素 iview - 基于 Vuejs 的开 ...

  9. Vue2.0组件的继承与扩展

    如果有需要源代码,请猛戳源代码 希望文章给大家些许帮助和启发,麻烦大家在GitHub上面点个赞!!!十分感谢 前言 本文将介绍vue2.0中的组件的继承与扩展,主要分享slot.mixins/exte ...

随机推荐

  1. ubuntu解决arm-linux-gcc no such file的问题

    这种情况是因为你的操作系统是Ubuntu 64位的,而交叉编译工具链都是32位执行程序.要成功运行这些交叉编译工具链,需要与这些工具链相关的32位库.安装命令如下:sudo apt-get insta ...

  2. JSP page指令详解

    JSP指令用来设置整个JSP页面相关的属性,如网页的编码方式和脚本语言. 语法格式如下: <%@ directive attribute="value" %> 指令可以 ...

  3. 触发layoutSubviews的条件

    1. init初始化不会触发layoutSubviews 2. addSubview会触发layoutSubviews 3. 设置view的Frame会触发layoutSubviews,当然前提是fr ...

  4. Android Service使用拾遗[阿里工程师分享]

    Service作为android的四大组件之一常用来帮助我们完成一些需要放在后台处理的任务,通过startService和bindService两种方式被调用.因为Service也是在主线程中运行的, ...

  5. Web应用程序系统的多用户权限控制设计及实现-总述【1】

    中大型的Web系统开发均需要权限的配置,基于多角色,多用户的操作权限管理是一个系统开发的基础.搭建好一套权限,用户,角色,页面一体的开发架构,可以用于后期业务的开发,同时也可用于不同业务的系统开发. ...

  6. git proxy

    git config --global http.proxy http://127.0.0.1:1080 git config --global https.proxy https://127.0.0 ...

  7. LCS修改版(Longest Common Subsequence 最长公共子序列)

    题目描述 作为一名情报局特工,Nova君(2号)有着特殊的传达情报的技巧.为了避免被窃取情报,每次传达时,他都会发出两句旁人看来意义不明话,实际上暗号已经暗含其中.解密的方法很简单,分别从两句话里删掉 ...

  8. 【转载】改善数据质量从数据剖析(Data Profiling)开始

    市场研究公司Forrester副总裁Erin Kinikin曾经把低劣的数据质量做了一个形象的比喻“用更好的方法访问劣质的数据,结果类似于把已经腐烂了的桃子用更快的卡车,走更好的路线运输到达市场时,桃 ...

  9. Effective Java 27 Favor generic methods

    Static utility methods are particularly good candidates for generification. The type parameter list, ...

  10. 软件测试作业1--描述Error

    记忆犹新的错误: 上个学期选修了可视化这门课程,最后大作业用d3实现,在使用d3读取csv数据的时候出现了以下Error: 我先是在代码中读取了某csv格式的数据,并且将其存入变量root中,然后对r ...