vue组件传值

父传子

通过props传递

父组件: 

子组件: props['value'],接收数据,接受之后使用和data中定义数据使用方式一样

子传父

在父组件中给子组件绑定一个自定义的事件,子组件通过$emit()触发该事件并传值。

父组件: 

子组件:  this.$emit('receive','传递的数据')

兄弟组件传值

  • 通过vuex
  • 父元素搭个桥即可
  • 通过中央通信 let eventBus = new Vue()

可以在main.js中添加实例
Vue.prototype.eventBus = new Vue()
在组件通过this.eventBus调用

A:methods :{ 函数{eventBus .$emit(‘自定义事件名’,数据)} 发送
B:created(){eventBus .$on(‘A发送过来的自定义事件名’,函数)} 进行数据接收

祖先后代 provide & inject

props一层层传递,爷爷给孙子还好,如果嵌套了五六层还这么写,感觉自己就是一个沙雕,所以这里介绍一个 稍微冷门的API, provice/inject,专门用来跨层级提供数据

// 祖先

但是provider和inject不是响应式的,如果子孙元素想通知祖先,就需要hack一下,Vue1中有dispatch和boardcast两个方法,但是vue2中被干掉了,我们自己可以模拟一下
原理就是可以通过this.$$parent和this.$children来获取父组件和子组件,可以通过递归实现,我们还可以挂载到Vue的原型链上

// 在main.js文件中写入
// $dispatch方法
Vue.prototype.$dispatch =  function(eventName, data) {
  let parent = this.$parent
  // 查找父元素
  while (parent ) {
    if (parent) {
      // 父元素用$emit触发
      parent.$emit(eventName,data)
      // 递归查找父元素
      parent = parent.$parent
    }else{
      break
    }
  }
}
// $boardcast方法
Vue.prototype.$boardcast = function(eventName, data){
  boardcast.call(this,eventName,data)
}
function boardcast(eventName, data){
  this.$children.forEach(child => {
    // 子元素触发$emit
    child.$emit(eventName, data)
    if(child.$children.length){
      // 递归调用,通过call修改this指向 child
      boardcast.call(child, eventName, data)
    }
  });
}

你可能感兴趣的:(vue组件传值)