Vue.js学习笔记-组件的高级通信方式

组件通信方式:
1、props
适用于的场景:父子组件通信
注意事项:
①如果父组件给子组件传递数据(函数):本质其实是子组件给父组件传递数据
②如果父组件给子组件传递的数据(非函数):本质就是父组件给子组件传递数据
书写方式:['todos'],{type:Array},{type:Array,default:[]}
tip:路由的props
书写的形式:布尔值、对象、函数形式


2、 组件的自定义事件
    1、一种组件间通信的方式,适用于:子组件===>父组件
    2、使用场景:A是父组件,B是子组件,B想给A传传数据,那么就要在A中给B绑定自定义时间(事件的回调在A中)
    3、绑定自定义事件:
        1、第一种方式,在父组件中:
       

 <Demo @fanglin=‘test’/>或<Demo v-on:fanglin='test'>


        2、第二种方式,在父组件中:
         

  <Demo ref='demo'/>
            ......
            mounted(){
                this.$refs.xxx.$on('fanglin',this.test)
            }


    3、若想让自定义时间只能触发一次,可以使用once修饰,或$once方法
    4、触发自定义事件:this.$emit(‘fanglin’,数据)
    5、解绑自定义事件:this.$off('fanglin')
    6、组件上也可以绑定原生DOM事件,需要使用native修饰符
    7、注意:通过this.$refs.xxx.$on('fanglin',回调)绑定自定义事件时,回调要么配置在methods中,要么用箭头函数,否则this指向会出现问题


3、全局事件总线(GlobalEventBus)
    1、一种组件间通信的方式,适用于任意组件间通信
    2、安装全局事件总线
     

   new Vue({
            ...
            beforeCreate(){
                Vue.prototype.$bus = this //安装全局事件总线,$bus就是当前应用的vue
            },
            ...
        })


    3、使用时间总线:
        1、接收数据:A组件想接收数据,则在A组件中给$bus绑定自定义事件,事件的回调留在A组件自身
     

  methods(){
            demo(data){...}
        }
        ......
        mounted(){
            this.$bus.$on('xxx',this.demo)
        }


        2、提供数据:this.$bus.$emit('xxx',数据)
    4、最好在beforeDestory钩子中,用$off去解绑当前组件所用的事件

4、 消息订阅与发布(pubsub)
    pubsub-js,在react框架中使用比较多(发布于订阅)
    适用于场景:万能
    1、一种组件间通信的方式。适用于任意组件间通信
    2、使用步骤:
        1、安装pubsub:npm i pubsub-js
        2、引入:import pubsub from 'pubsub-js'
        3、接收数据:A组件想要接收数据,则在A组建中订阅消息,订阅的回调留在A组件自身
       

methods(){
            demo(){...}
        }
        ...
        mounted(){
            this.pid = pubsub.subscribe('xxx',this,demo)//订阅消息
        }


        4、提供数据:pubsub.publish('xxx',数据)
        5、最好在beforeDestory钩子中,用pubsub.unsubscribe(pid)去<span style='color;red'>取消订阅</span>

5、Vuex(由于篇幅过长--下一篇文章有着重提及到)
适用于场景:万能


6、 插槽
 1、作用:让父组件可以向子组件指定位置插入html结构,也是一种组件间通信的方式,适用于父组件==>子组件
    2、分类:默认插槽、具名插槽、作用域插槽
    3、使用方式:
        1、默认插槽:
            父组件中:
               

 <Categroy>
      <div>html结构</div>
 </Categroy>


            子组件中:
               

 <template>
    <div>
      <slot>插槽默认内容<slot>
    </div>
</template>


    
        2、具名插槽:
            父组件中:
             

  <Categroy>
        <template slot="center">
             <div>html结构</div>
        </template>
    
        <template v-slot="footer">
             <div>html结构</div>
        </template>
  </Categroy>


            子组件中:
               

 <template>
     <div>
        <!-- 定义插槽 -->
        <slot name="center">插槽默认内容</slot>
        <slot name="footer">插槽默认内容</solt>
     </div>
 </template>
    


        3、作用域插槽
            1、理解:数据在组件的自身,但根据数据生成的结构需要组建的使用者来决定,(game数据在Category组件中,但是用数据所遍历出来的结构由App组件决定)
            2、具体编码:
                父组件中:
                   

 <Category>
    <template>
        <ul>
            <li v-for="g in scopeData.games" :key="g">{{g}}</li>
        </ul>
    </template>
        </Category>
        <Category>
    <template>
        <ol>
            <li v-for="g in scopeData.games" :key="g">{{g}}</li>
        </ol>
     </template>
</Category>


                子组件中:
                   

<template>
    <div>
       <slot :games="games"><slot>
     </div>
</template>
    
 <script>
     export default{
         name:'Category',
         props:['title'],
         //数据在子组件自身
         data(){
            return {
                games:['红色警戒','穿越火线','劲舞团','淮院']
                    }
                 }
              }
  </script>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

少你三行代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值