面试题:vue组件之间有哪些通信方式?

父子组件通信

绝大部分vue本身提供的通信方式,都是父子组件通信

prop

最常见的组件通信方式之一,由父组件传递到子组件

event

最常见的组件通信方式之一,当子组件发生了某些事,可以通过event通知父组件

style和class

父组件可以向子组件传递style和class,它们会合并到子组件的根元素中

示例

父组件

        importHelloWorldfrom"./components/HelloWorld.vue";exportdefault{components:{    HelloWorld,  },};

子组件

     

{{msg}}

  exportdefault{name:"HelloWorld",props:{msg:String,  },};

渲染结果:

attribute

如果父组件传递了一些属性到子组件,但子组件并没有声明这些属性,则它们称之为attribute,这些属性会直接附着在子组件的根元素上

不包括style和class,它们会被特殊处理

示例

父组件

  <!--除 msg 外,其他均为 attribute-->  importHelloWorldfrom"./components/HelloWorld.vue";exportdefault{components:{    HelloWorld,  },};

子组件

 

   

{{msg}}

 
exportdefault{name:"HelloWorld",props:{msg:String,  },created() {console.log(this.$attrs);//得到: { "data-a": "1", "data-b": "2" }  },};

渲染结果:


子组件可以通过inheritAttrs: false配置,禁止将attribute附着在子组件的根元素上,但不影响通过$attrs获取

natvie修饰符

在注册事件时,父组件可以使用native修饰符,将事件注册到子组件的根元素上

示例

父组件

        importHelloWorldfrom"./components/HelloWorld.vue";exportdefault{components:{    HelloWorld,  },methods:{handleClick() {console.log(1);    },  },};

子组件

 

   

Hello World

 

渲染结果

$listeners

子组件可以通过$listeners获取父组件传递过来的所有事件处理函数

v-model

后续章节讲解

sync修饰符

和v-model的作用类似,用于双向绑定,不同点在于v-model只能针对一个数据进行双向绑定,而sync修饰符没有限制

示例

子组件

 

   

      -      {{ num1 }}      +   

   

      -      {{ num2 }}      +   

 
exportdefault{props:["num1","num2"],};

父组件

      <!--等同于-->  importNumbersfrom"./components/Numbers.vue";exportdefault{components:{    Numbers,  },data() {return{n1:0,n2:0,    };  },};

$parent和$children

在组件内部,可以通过$parent和$children属性,分别得到当前组件的父组件和子组件实例

$slots和$scopedSlots

后续章节讲解

ref

父组件可以通过ref获取到子组件的实例

跨组件通信

Provide和Inject

示例

详见:https://cn.vuejs.org/v2/api/?#provide-inject

router

如果一个组件改变了地址栏,所有监听地址栏的组件都会做出相应反应

最常见的场景就是通过点击router-link组件改变了地址,router-view组件就渲染其他内容

vuex

适用于大型项目的数据仓库

store模式

适用于中小型项目的数据仓库

eventbus

组件通知事件总线发生了某件事,事件总线通知其他监听该事件的所有组件运行某个函数

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • (掌握)简单说下setTimeout(fn, 0)中的0代表的是什么?如果我想在vue实现此功能可以用什么方法代替...
    Enginner_XZ阅读 10,947评论 0 40
  • (掌握)简单说下setTimeout(fn, 0)中的0代表的是什么?如果我想在vue实现此功能可以用什么方法代替...
    Grit_1024阅读 5,218评论 0 22
  • #同一个路由下,父向子组件传值 props属性 -- 单向绑定 父组件中给childOne绑定一个自定义静态pro...
    似风的蜗牛阅读 3,982评论 0 0
  • 做这个的初心是希望能巩固自己的基础知识,当然也希望能帮助更多的开发者,如发现答案不准确或者不完整的可前往 Gith...
    打不死的强丿阅读 38,111评论 5 123
  • 今天感恩节哎,感谢一直在我身边的亲朋好友。感恩相遇!感恩不离不弃。 中午开了第一次的党会,身份的转变要...
    迷月闪星情阅读 13,585评论 0 11