美文网首页
Vue3 `inheritAttrs`属性继承与`$attrs`

Vue3 `inheritAttrs`属性继承与`$attrs`

作者: 醉生夢死 | 来源:发表于2022-05-16 15:30 被阅读0次
    • $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

    inheritAttrs: false

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

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

    相关文章

      网友评论

          本文标题:Vue3 `inheritAttrs`属性继承与`$attrs`

          本文链接:https://www.haomeiwen.com/subject/gxkwurtx.html