对Vue组件通信的理解

组件通信的方式

父子通信

方式一:props

上图可以理解为两个过程:

1.pass props是父=>子传递数据,这个过程中props作为一个载体,将自定义的一些特性传递给子组件.

--html
<blog-post message="hello!"></blog-post>

--js
Vue.component('blog-post', {
 props: ['message'],
 template: '<h3>{{ message }}</h3>'
})

复制代码

父级 prop 的更新会向下流动到子组件中,e官方文档中称为单向数据绑定,这个过程中,子组件只能单向的获取到父级定义的值, 父组件修改数据之后,子组件中的props也会跟这刷新为最新的值.

props 可以接受任何类型的值传递到子组件,包括:

string,

number,

booler,

object,

function

方式二:events

组件自定义事件,父组件可以在使用子组件的地方直接用 v-on 来监听子组件触发的事件

<div id="counter-event-example">
  <p>{{ total }}</p>
  <button-counter v-on:increment="incrementTotal"></button-counter>
  <button-counter v-on:increment="incrementTotal"></button-counter>
</div>
复制代码
Vue.component('button-counter', {
  template: '<button v-on:click="increment">{{ counter }}</button>',
  data: function () {
    return {
      counter: 0
    }
  },
  methods: {
    increment: function () {
      this.counter += 1
      this.$emit('increment')
    }
  },
})
new Vue({
  el: '#counter-event-example',
  data: {
    total: 0
  },
  methods: {
    incrementTotal: function () {
      this.total += 1
    }
  }
})
复制代码

兄弟通信

两个平级的组件之间需要通信传递一些事件,则需要我们创建一个第三方Vue实例,来承载双方通信时所要进行的事件.

var Event=new Vue()  //作为第三方记录事件

vue.component('aaa',{
data(){
    return{
        i_said:'',
    }
}
  tempate:`
    <div>
      <input @keyup="on_change" v-model="i_said">
    </div>   
  `,
  mothed:{
      on_change:function(){
          Event.$emit('aaa-said-somthing',this.i_said) //绑定事件,将aaa的输入数据作为第二个参数传递出去
      }
  }
  
  vue.component('bbb',{
  tempate:`
    <div>
     aaa说:{{aaa_said}}
    </div>   
  `,
  data(){
      return{
          aaa_said:'',
      },
      mounted:funtion(){
      var me = this
          Event.$on('aaa_said',function(data){
              this.aaa_said=data
          })
      }
  }
})
复制代码

兄弟通信的核心就在于拥有一个第三方调度器,通过它进行任意组件之间的通信.

爷孙通信

Vue.component('child', {
  props: ['visible'],
  template: `
  <div>我是儿子
      <sunzi v-show="visible" @close="$emit('close')"></sunzi>
  </div>
`
})
Vue.component('sunzi', {
  template: `
  <div>我是孙子 
    <button @click="$emit('close')">关闭</button>
  </div>
`
})
new Vue({
  el: '#app',
  data: {
    message: '我是爷爷',
    xxx: false
  },
  methods:{
    log(){
      console.log('爷爷知道了')
    }
  }
})
复制代码
<div id="app">
    <p>{{ message }}</p>
    <button @click="xxx=true">打开</button>
    <child :visible="xxx" @close="xxx=false"></child>
  </div>
复制代码

这里爷孙之间的通信,只要依靠的是子组件的props,

严格意义上来讲,没有爷孙通信,只有父子通信,因为爷孙祖辈通信,都可以看成是父子通信。 直接使用props和$emit并不能直接通信,但是爷爷可以和儿子通信,儿子可以和孙子通信,那么可以把儿子当作中转。

转载于:https://juejin.im/post/5b82a82a51882542b366c3b4

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值