inheritAttrs和$attrs的作用:

  当需要将父组件的props传递到子组件中,而子组件的需要接收到props的节点有父级容器,那么就需要用到这两个属性。

  将inheritAttrs设置为false,在子组件需要接收props的节点上加上 v-bind='$attrs'

 

封装一个input组件:

1、components/MyInput.vue:

<template>
  <input />
</template>

2、使用:

<template>
  <div id="app">
    <MyInput v-model="message" type='text' placeholder="请输入用户名"></MyInput>
    <MyInput v-model="message" type='password' placeholder="请输入密码"></MyInput>
  </div>
</template>
<script>
import MyInput from '@/components/MyInput'
export default {
  data() {
    return { message: 123 }
  },
  components: { MyInput }
}
</script>

3、效果:

inheritAttrs和$attrs让组件更灵活_用户名

但往往有的时候封装的input外层有层盒子,如下:

<template>
  <div class="input-container">
    <input />
    {{$attrs}}
  </div>
</template>

此时,可以看到父组件传来的属性都绑定到父容器身上了,所以没有效果

inheritAttrs和$attrs让组件更灵活_用户名_02

将inheritAttrs设置为false

<script>
export default {
  inheritAttrs: false
}
</script>

会发现父容器和input都没有了父组件传来的属性

inheritAttrs和$attrs让组件更灵活_干货_03

再在需要接收父组件属性的标签上通过 v-bind='$attrs' 接收父组件的属性

<template>
  <div class="input-container">
    <input v-bind="$attrs" />
    {{$attrs}}
  </div>
</template>
<script>
export default {
  inheritAttrs: false
}
</script>

就可以正常显示了

inheritAttrs和$attrs让组件更灵活_封装_04

要注意,当使用props接收了属性,那么这个属性就不在$attrs中了

<template>
  <div class="input-container">
    <input v-bind="$attrs" />
    {{$attrs}}
  </div>
</template>
<script>
export default {
  props: ['value'],
  inheritAttrs: false
}
</script>

inheritAttrs和$attrs让组件更灵活_干货_05

可以通过 :value='value' 绑定

<template>
  <div class="input-container">
    <input v-bind="$attrs" :value="value" />
    {{$attrs}}
  </div>
</template>
<script>
export default {
  props: ['value'],
  inheritAttrs: false
}
</script>

inheritAttrs和$attrs让组件更灵活_封装_06