加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

Vue组件间通信六种方式(完整版)

发布时间:2019-05-17 21:06:54 所属栏目:建站 来源:浪里行舟
导读:前言 组件是 vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用。一般来说,组件可以有以下几种关系: 如上图所示,A 和 B、B 和 C、B 和 D 都是父子关系,C 和 D 是兄弟关系,A 和 C 是隔代关系(可能隔

这里需要注意的是:由于vuex里,我们保存的状态,都是数组,而localStorage只支持字符串,所以需要用JSON转换:

  1. JSON.stringify(state.subscribeList);   // array -> string 
  2. JSON.parse(window.localStorage.getItem("subscribeList"));    // string -> array  

方法四、$attrs/$listeners

1.简介

多级组件嵌套需要传递数据时,通常使用的方法是通过vuex。但如果仅仅是传递数据,而不做中间处理,使用 vuex 处理,未免有点大材小用。为此Vue2.4 版本提供了另一种方法----$attrs/$listeners

  • $attrs:包含了父作用域中不被 prop 所识别 (且获取) 的特性绑定 (class 和 style 除外)。当一个组件没有声明任何 prop 时,这里会包含所有父作用域的绑定 (class 和 style 除外),并且可以通过 v-bind="$attrs" 传入内部组件。通常配合 interitAttrs 选项一起使用。
  • $listeners:包含了父作用域中的 (不含 .native 修饰器的) v-on 事件监听器。它可以通过 v-on="$listeners" 传入内部组件

接下来我们看个跨级通信的例子:

  1. // index.vue 
  2. <template> 
  3.   <div> 
  4.     <h2>浪里行舟</h2> 
  5.     <child-com1 
  6.       :foo="foo" 
  7.       :boo="boo" 
  8.       :coo="coo" 
  9.       :doo="doo" 
  10.       title="前端工匠" 
  11.     ></child-com1> 
  12.   </div> 
  13. </template> 
  14. <script> 
  15. const childCom1 = () => import("./childCom1.vue"); 
  16. export default { 
  17.   components: { childCom1 }, 
  18.   data() { 
  19.     return { 
  20.       foo: "Javascript", 
  21.       boo: "Html", 
  22.       coo: "CSS", 
  23.       doo: "Vue" 
  24.     }; 
  25.   } 
  26. }; 
  27. </script> 
  1. // childCom1.vue 
  2. <template class="border"> 
  3.   <div> 
  4.     <p>foo: {{ foo }}</p> 
  5.     <p>childCom1的$attrs: {{ $attrs }}</p> 
  6.     <child-com2 v-bind="$attrs"></child-com2> 
  7.   </div> 
  8. </template> 
  9. <script> 
  10. const childCom2 = () => import("./childCom2.vue"); 
  11. export default { 
  12.   components: { 
  13.     childCom2 
  14.   }, 
  15.   inheritAttrs: false, // 可以关闭自动挂载到组件根元素上的没有在props声明的属性 
  16.   props: { 
  17.     foo: String // foo作为props属性绑定 
  18.   }, 
  19.   created() { 
  20.     console.log(this.$attrs); // { "boo": "Html", "coo": "CSS", "doo": "Vue", "title": "前端工匠" } 
  21.   } 
  22. }; 
  23. </script> 
  1. // childCom2.vue 
  2. <template> 
  3.   <div class="border"> 
  4.     <p>boo: {{ boo }}</p> 
  5.     <p>childCom2: {{ $attrs }}</p> 
  6.     <child-com3 v-bind="$attrs"></child-com3> 
  7.   </div> 
  8. </template> 
  9. <script> 
  10. const childCom3 = () => import("./childCom3.vue"); 
  11. export default { 
  12.   components: { 
  13.     childCom3 
  14.   }, 
  15.   inheritAttrs: false, 
  16.   props: { 
  17.     boo: String 
  18.   }, 
  19.   created() { 
  20.     console.log(this.$attrs); // { "boo": "Html", "coo": "CSS", "doo": "Vue", "title": "前端工匠" } 
  21.   } 
  22. }; 
  23. </script> 
  1. // childCom3.vue 
  2. <template> 
  3.   <div class="border"> 
  4.     <p>childCom3: {{ $attrs }}</p> 
  5.   </div> 
  6. </template> 
  7. <script> 
  8. export default { 
  9.   props: { 
  10.     coo: String, 
  11.     title: String 
  12.   } 
  13. }; 
  14. </script> 

Vue组件间通信六种方式(完整版)

如上图所示$attrs表示没有继承数据的对象,格式为{属性名:属性值}。Vue2.4提供了$attrs , $listeners 来传递数据与事件,跨级组件之间的通讯变得更简单。

简单来说:$attrs与$listeners 是两个对象,$attrs 里存放的是父组件中绑定的非 Props 属性,$listeners里存放的是父组件中绑定的非原生事件。

方法五、provide/inject

1.简介

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读