• vue中$attrs和$listeners 的使用


    1、attrs属性就包含了所有父组件传来的数据(除开已经props声明了的)

    当父组件传递了很多数据给子组件时,子组件没有声明props来进行接收,那么子组件中的attrs属性就包含了所有父组件传来的数据(除开已经props声明了的),子组件还可以使用v−bind="attrs属性就包含了所有父组件传来的数据(除开已经props声明了的),子组件还可以使用v-bind="attrs属性就包含了所有父组件传来的数据(除开已经props声明了的),子组件还可以使用v−bind="attrs"的形式向它的子组件(孙子组件)传递数据,孙子组件使用$attrs的方式和它的父组件原理类似。

    1. // 父组件
    2. <template>
    3. <div>
    4. <p>父级组件</p>
    5. <div>
    6. <button @click="changeMsg">更改数据</button>
    7. </div>
    8. <div>子组件数据:{{ fromchildData }}</div>
    9. <child1 ref="child1" :msg="msg" v-model="fromchildData" :msg1="msg1" :msg2="msg2" :msg3="msg3" :msg4="msg4" @childData="childData"></child1>
    10. </div>
    11. </template>
    12. <script>
    13. import child1 from './child1.vue';
    14. export default {
    15. data() {
    16. return {
    17. msg: '父组件默认值',
    18. msg1: 'parent数据1',
    19. msg2: 'parent数据2',
    20. msg3: 'parent数据3',
    21. msg4: 'parent数据4',
    22. fromchildData: ''
    23. };
    24. },
    25. components: {
    26. child1
    27. },
    28. methods: {
    29. // 点击按钮更改数据
    30. changeMsg() {
    31. this.msg = '父组件主动改变值';
    32. },
    33. // 子组件的回调方法
    34. childData(data) {
    35. this.fromchildData = data;
    36. },
    37. }
    38. };
    39. </script>
    1. // 子组件 child1.vue
    2. <template>
    3. <div class="child-1">
    4. <p>--child1组件--</p>
    5. <div>
    6. <button @click="sendData">传递数据给父组件</button>
    7. <button @click="getParentData">使用$parent</button>
    8. <button @click="setListeners">使用listeners调用父级方法</button>
    9. </div>
    10. <div>
    11. <el-input v-model="childStr" @input="confirm"></el-input>
    12. <button @click="confirm">修改v-model数据</button>
    13. </div>
    14. <div>
    15. <p>parent组件数据:{{ msg }}</p>
    16. <!-- 子组件child1-child -->
    17. <!-- <child1-child v-bind="$attrs" v-on="$listeners"></child1-child> -->
    18. </div>
    19. </div>
    20. </template>
    21. <script>
    22. export default {
    23. props: {
    24. msg: {
    25. type: String,
    26. default: ''
    27. },
    28. // 通过v-model方式传值
    29. value: {
    30. type: String,
    31. default: ''
    32. }
    33. },
    34. data() {
    35. return {
    36. childStr: 'child String'
    37. };
    38. },
    39. inheritAttrs: false,
    40. mounted() {
    41. console.log('child1组件获取$attrs', this.$attrs);
    42. console.log('child1组件获取$listeners', this.$listeners);
    43. },
    44. methods: {
    45. // 我们在父组件中使用v-model向child2子组件传递数据,子组件的props中使用默认的value属性接收,
    46. // 在子组件中利用$emit触发父组件中默认input事件,此时传递的数据便会在子组件和父组件中发生变化,这就是数据双向绑定
    47. // 通过$emit触发父组件的input事件,并将第二个参数作为值传递给父组件
    48. confirm() {
    49. this.$emit('input', this.childStr);
    50. },
    51. // 点击按钮,使用$emit向父组件传递数据
    52. sendData() {
    53. this.$emit('childData', '我是子组件向父组件提交的数据');
    54. },
    55. // 通过$parent方式获取父组件值
    56. getParentData() {
    57. console.log('父组件', this.$parent);
    58. },
    59. //如果存在多层级组件,无需使用emit的方式逐级向上触发事件,只需要使用$listerners就可以得到父组件中的自定义事件
    60. setListeners() {
    61. this.$listeners.childData('通过listeners调用方法');
    62. }
    63. }
    64. };
    65. </script>
    66. <style scoped>
    67. .child-1 {
    68. border: 1px solid red;
    69. }
    70. </style>

     $attrs和$listeners的输出结果:

     

    2、listeners属性和attrs属性类似,只是它们传递的东西不一样

     $listeners可以通过v-on的形式再次传递给下层组件,当父组件在子组件上定义了一些自定义的非原生事件时,在子组件内部可以通过listeners属性获取>父组件的自定义事件,它和attrs的区别很明显,attrs用来传递属性。

    使用listeners的好处在于:如果存在多层级组件,无需使用emit的方式逐级向上触发事件,只需要使用$listerners就可以得到父组件中的自定义事件,相当于偷懒了。 

    3、inheritAttrs

    父组件传递了很多数据给子组件,子组件的props没有完全接收,那么父组件传递的这些数据就会渲染到HTML上,我们可以给子组件设置inheritAttrs 为false,避免这样渲染。

    不设置inheritAttrs的属性如下

     设置inheritAttrs为false后

     

    总结

    attrs:用来会传递属性,除了class、style之类的,它是一个对象。 listeners:用来传递事件,除了原生事件,它也是一个对象。
    attrs和listeners这两个属性可以解决多层组件之间数据和事件传递的问题。
    inheritAttrs解决未使用props接收的数据的属性渲染

  • 相关阅读:
    【c++】constexpr关键字
    UDP网络编程
    高忆管理:军工板块走高,奥普光电涨停,恒宇信通等大涨
    【交通建模】基于模型的自主交通仿真框架附matlab代码
    2022年最新【Java八股文背诵版面试题】面试必备,查漏补缺;多线程+spring+JVM调优+分布式+redis+算法
    小程序项目结构
    10:00面试,10:06就出来了,问的问题有点变态。。。
    全面分析一下前端框架Angular的来龙去脉,分析angular的技术要点和难点,以及详细的语法和使用规则,底层原理-小白进阶之路
    SpringCloud Alibaba Nacos注册中心官方文档——快速开始
    【es6】教程 Symbol数据以及迭代器和生成器
  • 原文地址:https://blog.csdn.net/lqh4188/article/details/125472754