뷰 소품 |禁用속성繼承

6532 단어 vue

前言



一般來說,當在父組件傳遞속성給子組件時,

// parent
<basic-input disabled>

// child
<input>


經渲染後會變成

<input disabled>


但是我們的子組件結構有時不會只有一個節點,通常因為css需要,外層會再包一個標籤,例如:

<div class="container">
    <input>
</div>


經渲染後會變成

<div class="container" disabled>
    <input>
</div>

disabled 屬性會直接繼承在子物件的根結點上.

這時如果不希望组件的根元素繼承 속성,那該怎麼辦呢?

禁用속성繼承



這種情況就需要到組件的option中設置inheritAttrs: false,禁用attribute繼承.

Vue.component('my-component', {
  inheritAttrs: false,
  // ...
})


如果子組件是單一檔案的話,在子組件內設置:

export default {
  name: 'my-component',
  inheritAttrs: false,
  props: {
    disabled: Boolean
  }
}


設置完後,這時你就可以手動決定哪些속성賦予哪個元素,把子物件改為:

<div class="container">
    <input disabled>
</div>


這樣disabled屬性就不會跑到根結點上
inheritAttrs: false 在寫基礎組件的時候很常用到,例如 inputselect 之類的功能型標籤,

有關他們屬性 typedisabledplacehodler 等都希望綁在子物件的特定標籤上.

也可以看看官方文件的範例:

Vue.component('base-input', {
  inheritAttrs: false,
  props: ['label', 'value'],
  template: `
    <label>
      {{ label }}
      <input
        v-bind="$attrs"
        v-bind:value="value"
        v-on:input="$emit('input', $event.target.value)"
      >
    </label>
  `
})

// parent component 使用 <base-input>
<base-input
  label="Username:"
  v-model="username"
  required
  placeholder="Enter your username"
></base-input>


如果對於官方範例子物件 v-bind:valuev-on:input 有疑問
https://yubo0826.github.io/vue-blog/#/posts/6

$attrs 有疑惑的

https://v2.cn.vuejs.org/v2/api/#vm-attrs

總結


  • 當設置 inheritAttrs: true (預設),子組件根節點會渲染出父節點傳遞過來的atrribute
  • 當設置 inheritAttrs: false ,子組件根節點不會渲染出父節點傳遞過來的atrribute

  • 參考


  • 官方文件(Vue2、Vue3關於禁用屬性繼承基本一樣)
    https://v2.cn.vuejs.org/v2/guide/components-props.html
  • https://blog.csdn.net/weixin_41977619/article/details/116597022
  • 좋은 웹페이지 즐겨찾기