美文网首页
[vue3进阶] 10.非 Prop 的 Attribute

[vue3进阶] 10.非 Prop 的 Attribute

作者: 林哥学前端 | 来源:发表于2021-09-30 16:23 被阅读0次

    非 Prop 的 Attribute

    这个念着费劲,我们还是通过一个小例子来学习它,
    先写了一个简单的组件,叫girlFriend,它接受一个prop——name表示名字

    <template>
      <div>
        <h1>{{ name }}</h1>
      </div>
    </template>
    
    <script>
    export default {
      props: {
        name: {
          type: String,
          default: '',
        },
      },
    }
    </script>
    
    <style></style>
    

    使用时候就是这样

    <girl-friend name="石原里美"></girl-friend>
    

    我们给它写了一个name属性‘石原里美’
    如果我在使用时,多写一个属性,这个属性在组件的prop里没有定义,比如

    <girl-friend name="石原里美" age="20"></girl-friend>
    

    那这个age属性就是非 Prop 的 Attribute,就是我们在使用组件时,写了组件里并没有定义的props或者emits
    age我们在组件里就没有定义过
    那这样vue也是不会报错的,
    会产生什么样的结果呢,我们看一下页面上最后渲染出来的html结构

    <div age="20">
      <h1>石原里美</h1>
    </div>
    

    组件渲染的结果就是这样,age属性被原封不动放到了组件最外层的div上
    同样,我们在给组件增加一个非 Prop 的 Attribute

    <girl-friend name="石原里美" age="20" class="my-girl"></girl-friend>
    

    那么最后组件渲染的结果

    <div age="20" class="my-girl">
      <h1>石原里美</h1>
    </div>
    

    class属性也渲染到了div标签上

    inheritAttrs

    那如果子组件不想要这些父组件传来的没有定义过的属性,就可以通过inheritAttrs来设置

    <template>
      <div>
        <h1>{{ name }}</h1>
      </div>
    </template>
    
    <script>
    export default {
      props: {
        name: {
          type: String,
          default: '',
        },
      },
      inheritAttrs: false, // 新增
    }
    </script>
    
    <style></style>
    

    inheritAttrs设置为false以后,渲染的结果就是

    <div>
      <h1>石原里美</h1>
    </div>
    

    这样div上就很干净了,什么都没有了

    $attrs

    如果你想在子组件的代码中使用这些非 Prop 的 Attribute,可以用this.$attrs获取到

    <template>
      <div>
        <h1>{{ name }}</h1>
      </div>
    </template>
    
    <script>
    export default {
      props: {
        name: {
          type: String,
          default: '',
        },
      },
      inheritAttrs: false,
      mounted() {
        console.log(this.$attrs) // 新增
      },
    }
    </script>
    
    <style></style>
    

    打印结果我们获取到了一个proxy对象,里面有age和class属性,

    你甚至可以把它们绑定给子组件里面的标签
    再次修改我们的girlFriend组件

    <template>
      <div>
        <h1 v-bind="$attrs">{{ name }}</h1>
      </div>
    </template>
    

    这样就把这些非 Prop 的 属性绑定到了h1标签上
    结果就是这样的

    <div>
      <h1 age="20" class="my-girl">石原里美</h1>
    </div>
    

    这些属性都跑到了h1上

    这篇的内容就到这里了,实际开发中用得也不多,了解一下就行了。

    相关文章

      网友评论

          本文标题:[vue3进阶] 10.非 Prop 的 Attribute

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