vue--六种组件传值

文章目录


一、props+$emit

相信熟悉vue的同学对此种传值方式并不陌生,也是我们最常用的传值方式,父传子props,子传父$emit
vue--六种组件传值
vue--六种组件传值
vue--六种组件传值

二、attrs和listeners

Vue_2.4 中新增的 a t t r s / attrs/ attrs/listeners 可以进行跨级的组件通信。这两种最常见的应用场景就是用来封装第三方的组件库,比如我想封装一层element,难道我要把element的那个组件都要在props中定义一遍吗? $attrs 包含了父级作用域中不作为 prop 的属性绑定(class 和 style 除外),好像听起来有些不好理解?没事,看下代码就知道是什么意思了:

 <!-- 父组件 -->
    <son msg="这是parent传来的信息"
         list="list"
         item="item"
         @sonChange="fn" />

-------------------------------------------------------------
<!--子组件 -->
  props: {
    msg: String
  },
 created() {
     console.log(this.$attrs);//{item: "item",list: "list"}
 }

三、provide和inject

provide/inject允许一个祖先组件像向它所有的后代组件注入一个依赖,让所有改祖先组建的后代组件都能够访问到此依赖,依赖可以是属性和方法,上面的(attrs和listeners)还有(provide和inject)是两种属性透传的方式。

//父组件
export default {
  name: 'parent',
  components: {
    son,
  },
  provide() {
    return {
      detail: {
        msg: this.obj,
        change: () => {
          console.log('变了')
        },
      },
    }
  },
  data() {
    return {
      obj: {
        msg: '这是祖先组件要注入的依赖',
      },
    }
  },
  methods: {},
}
//子组件
export default {
  name: 'son',
  inject: ['detail'],
  created() {
    console.log(this.detail.msg.msg="我改变了") 
  },
}

四、EventBus

上面的三种方法都是子传父,父传子,如果兄弟组件传值或者任意两种组件传值应该怎么办呢?就是EventBus,利用 Vue 实例实现一个 EventBus 进行信息的发布和订阅,可以实现在任意2个组件之间通信。

// main.js
Vue.prototype.$eventBus = new Vue()
------------------------------------------
// 需要订阅的地方
this.$eventBus.$on('update', val => {})

// 需要发布信息的地方
this.$eventBus.$emit('update', '更新信息')
//移除事件监听
this.$eventBus.$off('update', {})

这种组件通信方式只要订阅和发布的顺序得当,且事件名称保持唯一性,理论上可以在任何 2 个组件之间进行通信,相当的强大。但是方法虽好,可不要滥用,建议只用于简单、少量业务的项目中,如果在一个大型繁杂的项目中无休止的使用该方法,将会导致项目难以维护。

五、Vuex

vuex想必大家都知道吧,这里就不多介绍了附上Vux官网的链接

六、Vue.observable

官网上说,如果你的项目不大建议不要使用vuex,可以使用Vue.observable来实现一个小型的状态管理器。原理很简单

// store.js
import Vue from 'vue'

export const state = Vue.observable({
    count: 0,
})

export const mutations = {
    increment() {
        state.count++
    }
    decrement() {
        state.count--
    }
}
<!-- parent.vue -->
<template>
    <p>{{ count }}</p>
</template>
<script>
import { state } from '../store'
export default {
    computed: {
        count() {
            return state.count
        }
    }
}
</script>
// child.vue
import  { mutations } from '../store'
export default {
    methods: {
        handleClick() {
            mutations.increment()
        }
    }
}

参考文章

上一篇:vue父孙组件传值($attr及$listeners)的使用


下一篇:Render函数:留言列表组件