-
$attrs和inheritAttrs用法
-
$attrs
属性解释:包含了父作用域中不作为组件 props 或自定义事件的attribute
绑定和事件。当一个组件没有声明任何props
时,这里会包含所有父作用域的绑定,并且可以通过v-bind="$attrs"
传入内部组件,这在创建高阶的组件时会非常有用。 -
inheritAttrs
属性解释:如果你不希望组件的根元素继承特性,你可以在组件的选项中设置inheritAttrs: false
举个例子
打开在线 Vue SFC https://sfc.vuejs.org/
App.vue代码如下
<script setup>
import { reactive } from 'vue'
import MyInput from './MyInput.vue'
const state = reactive({
text: "",
pass: "",
});
</script>
<template>
<div>
<MyInput type="text" placeholder="输入用户名" v-model="state.text" />
<MyInput type="text" placeholder="输入密码" v-model="state.pass" />
</div>
</template>
子组件 MyInput.vue 设置 inheritAttrs: true(默认)
<template>
<div class="input">
<input v-bind="$attrs" v-model="modelValue" />
</div>
</template>
<script>
export default {
// inheritAttrs: false,
props: {
modelValue: [String, Number],
},
};
</script>
此时我们右键检查输入框查看渲染的Dom
inheritAttrs:true
取消注释 inheritAttrs: false,
再次检查Dom
小结:
由上述例子可以看出,子组件的props中未注册父组件传递过来的属性
- 当设置inheritAttrs:true时,子组件的顶层标签元素中会渲染出父组件传递过来的属性(例如:type="text"等)
- 当设置inheritAttrs: false时,子组件的顶层标签元素中不会渲染出父组件传递过来的属性
- 不管inheritAttrs为true或者false,子组件中都能通过$attrs属性获取到父组件中传递过来的属性。
网友评论