vue中的$attrs和$listeners


A组件与C组件怎么通信,我们有多少种解决方案?

  1. 我们使用VueX来进行数据管理,但是如果项目中多个组件共享状态比较少,项目比较小,并且全局状态比较少,那使用VueX来实现该功能,并没有发挥出VueX的威力。
  2. 使用B来做中转站,当A组件需要把信息传给C组件时,B接受A组件的信息,然后利用属性传给C组件,这是一种解决方案,但是如果嵌套的组件过多,会导致代码繁琐,代码维护比较困难;如果C中状态的改变需要传递给A, 使用事件系统一级级往上传递 。本来
  3. 自定义一个Vue 中央数据总线,这个情况适合碰到组件跨级传递消息,但是使用VueX感觉又有点浪费的项目中,但是缺点是,碰到多人合作时,代码的维护性较低,代码可读性低

在很多开发情况下,我们只是想把A组件的信息传递给C组件,如果使用props 绑定来进行信息的传递,虽然能够实现,但是代码并不美观。

在vue2.4中,为了解决该需求,引入了$attrs 和$listeners , 新增了inheritAttrs 选项。 在版本2.4以前,默认情况下父作用域的不被认作props的属性属性百年孤独,将会“回退”且作为普通的HTML特性应用在子组件的根元素上。如下列的例子

father.vue 组件:

<template>
  <child :name="name"
         :age="age"
         :infoObj="infoObj"
         @updateInfo="updateInfo"
         @delInfo="delInfo" />
</template>
<script>
import Child from './child.vue'

export default {
  name: 'father',
  components: { Child },
  data () {
    return {
      name: 'myName',
      age: 22,
      infoObj: {
        from: '北京',
        hobby: ['1', '2', '3']
      }
    }
  },
  methods: {
    updateInfo () {
      console.log('update info')
    },
    delInfo () {
      console.log('delete info')
    }
  }
}
</script>

child.vue 组件:

<template>
    <grand-son :height='height' :weight='weight' @addInfo="addInfo" v-bind="$attrs" v-on="$listeners"  />
</template>
<script>
import GrandSon from './grandSon'
export default {
  name: 'child',
  components: { GrandSon },
  props: ['name'],
  data () {
    return {
      height: '180cm',
      weight: '70kg'
    }
  },
  created () {
    console.log(this.$attrs, 'child $attrs')
    // 结果:age, infoObj, 因为父组件共传来name, age, infoObj三个值,由于name被 props接收了,所以只有age, infoObj属性
    console.log(this.$listeners, 'child $listeners') // updateInfo: f, delInfo: f
  },
  methods: {
    addInfo () {
      console.log('add info')
    }
  }
}
</script>

grandSon.vue组件:

<template>
    <div>
        {{ $attrs }}
    </div>
</template>
<script>
export default {
  props: ['weight'],
  created () {
    console.log(this.$attrs, 'grandSon attrs')
    console.log(this.$listeners, 'grandSon listeners') // updateInfo: f, delInfo: f, addInfo: f
    // this.$listeners.updateInfo() //和下面$emit同等效果
    // this.$emit('updateInfo') // 可以触发 father 组件中的updateInfo函数
  }
}
</script>

 

转载修改于:https://blog.csdn.net/songxiugongwang/article/details/84001967


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM