vue组件通信方案,简单介绍

vue组件通信方案

组件通信的类型:基本上都是根据组件关系区分类型

  • 父子通信
  • 跨级通信
  • 兄弟通信
  • 路由视图级别通信

通信解决方案

  • props/$ emit(父子通信)
<k-div :pages=age></k-div>

在组件中使用props接收直接使用

        Vue.component("k-div",{
            props:['pages'],
            template:`  <div>
                            <div>哈哈{{name}}</div>
                            <div>呵呵{{pages}}</div>
                        </div>
                        `,
            //注意  这里
            data(){
                return{
                    name:"这里的data是自身的数据"
                }
            },
        })
  • $refs/ref(父子通信)
    Hello 组件定义别名,ref可绑定多个
<Hello ref="helloRef" mage='开课吧'></Hello>

可找到Hello组件中的数据

    methods: {
    fnHome(){
      console.log(this.$refs.helloRef.val) //如果上面不取别名这回(就是没绑定)这里输出是个空对象
       //可ref可绑定 标签、组件等 同时可绑定多个
      console.log(this.$refs.helloRef.fnHello())  //输出我是Hello组件的
    }
  },
  • $children/ $parent(父子通信)
    父–>子
    methods: { 
    fnHome(){
      console.log(this.$children[0].val) //children方法以数组形式 父组件拿到子组件的数据
    }
  },

子–>父

  methods: {
    fnHello(){
       console.log(this.$parent.$el) //找到父级数据
       console.log(this.$parent.mag) //直接调取父级数据
    }
  },
  • $attrs/ $listeners(父子通信、跨级通信)
    mage=‘开课吧’ 给Hello传递一个字符串 非props特性
<Hello ref="helloRef" mage='开课吧'></Hello>

然而子组件并没有接收,这是可以使用$attrs接收

  methods: {
    fnHello(){
      console.log(this.$attrs) 
    }
  },

要想world组件使用$attrs拿到父级的父级Home组件的数组这里结构一下
给world组件使用v-bind再传,World 组件再接

<World v-bind="$attrs"></World>
  • provide/inject(父子通信、跨级通信) 主要开发高阶插件/组件库时使用,并不推普通程序代码(尽量不用)
  // provide是个单独的方法 ,无视组件关系
  provide:{ //在一个组件中定义数据,这里和data数据同级
    prov:300
  },

inject接收

inject:['prov'] //使用inject可以在任意组件接收provide传的值
  • eventBus(父子通信、跨级通信、兄弟通信)这种传递方式不考虑组件的关系

    定义eventBus.js文件,内容如下

/*  
   eventBus Vue 事件机制
   eventBus像一个中间商 world he Sister 没有父子的关系 这种传递方式不考虑组件的关系
   原理: $emit(事件名,实参)自定义事件
         $on(事件名,回调函数(形参))   监听事件
*/ 
import Vue from 'vue'
export default new Vue()

在一个组建中定义 注意使用时一定要引入
import eventBus from “@/eventBus.js”

    methods: {
        fnWorld(){  
            // 传递方 定义 事件 这里点击之后在有abc事件
            eventBus.$emit("abc",200)
        }
    },

另外一个组件中接收

    created(){ //监听一定要写在定义之前 
        eventBus.$on('abc',v=>{  //接收方 on接收
            this.val = v    //这里的逻辑 组件创建的时候就用created监听,监听到就存下    //fnSister 点击的时候输出
        })                
    },
以上的通讯方式只能传递一些小的轻量级的数据
  • vuex(父子通信、跨级通信、兄弟通信、路由视图级别通信)这里今天不介绍
  • localStorage/sessionStorage等基于浏览器客户端的存储(父子通信、跨级通信、兄弟通信、路由视图级别通信)根据场景使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Jason–json

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

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

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

打赏作者

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

抵扣说明:

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

余额充值