欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

vue3 $attrs和inheritAttrs的使用

程序员文章站 2022-03-27 18:05:19
...

$attrs 属性解释:包含了父作用域中不作为组件 props 或自定义事件的 attribute 绑定和事件。当一个组件没有声明任何prop 时,这里会包含所有父作用域的绑定,并且可以通过 v-bind="$attrs" 传入内部组件——这在创建高阶的组件时会非常有用。

inheritAttrs属性解释:如果你不希望组件的根元素继承特性,你可以在组件的选项中设置 inheritAttrs: false

可能不是很好理解,我们可以举个例子来验证一下。

  • 在父组件app.vue中
<template>
  <div>
    <MyInput type="text" placeholder="输入用户名" v-model="state.text" />
    <MyInput type="password" placeholder="输入密码"  v-model="state.pass"  />
  </div>
</template>
<script setup>
import MyInput from "@/components/myInput.vue";
import { reactive } from "vue";
const state = reactive({
  text: "",
  pass: "",
});
</script>
  • 子组件 myInput.vue 设置 inheritAttrs: true(默认)
<template>
  <div class="input">
    <input v-bind="$attrs" v-model="modelValue" />
  </div>
</template>
<script>
export default {
  props: {
    modelValue: [String, Number],
  },
};
</script>

vue3 $attrs和inheritAttrs的使用

  • 子组件 myInput.vue 设置 inheritAttrs: false
<template>
  <div class="input">
    <input v-bind="$attrs" v-model="modelValue"/>
  </div>
</template>

<script>
export default {
  inheritAttrs: false,
  props: {
    modelValue: [String, Number],
  },
};
</script>

vue3 $attrs和inheritAttrs的使用
总结:

由上述例子可以看出,子组件的props中未注册父组件传递过来的属性。

  1. 当设置inheritAttrs:true时,子组件的顶层标签元素中会渲染出父组件传递过来的属性(例如:type="text"等)
  2. 当设置inheritAttrs: false时,子组件的顶层标签元素中不会渲染出父组件传递过来的属性
  3. 不管inheritAttrs为true或者false,子组件中都能通过$attrs属性获取到父组件中传递过来的属性。
相关标签: Vue