當我們在使用Vue的時候,經常會遇到需要向子組件傳遞一些不固定的屬性值,這時候我們就需要使用$attrs了。
export default { props: { value: { type: String } }, render(h) { return h('div', { attrs: this.$attrs }) } }
$attrs是Vue實例上內置的屬性,在使用render函數的時候非常方便。我們可以直接將$attrs傳遞給HTML元素來使組件可以接收父組件傳遞的所有原生HTML屬性。
如果我們在模板中渲染一個組件,同時給組件加上一些原生屬性,可以通過v-bind="$attrs"的方式來將$attrs傳遞給組件。
在組件中,我們可以使用class和id這些原生HTML屬性以及其他自定義的props屬性來進行操作。
export default { props: { value: { type: String } }, render(h) { return h('div', { attrs: this.$attrs, class: ['my-component-class', this.$attrs.class] }, [ h('input', { attrs: { type: 'text', value: this.value }, on: { input: (event) =>{ this.$emit('input', event.target.value) } } }) ]) } }
上面的代碼中,我們使用了this.$attrs.class來獲取class的值,并把它拼接到自定義的class名稱上。同時,我們定義了一個input元素,使用value綁定了當前組件的value值,并通過emit來向外部傳遞數據。
需要注意的是,$attrs只能綁定原生屬性,如果需要綁定自定義屬性,可以使用v-bind指令來進行傳遞。
另外,如果在使用v-bind="$attrs"傳遞屬性的時候,如果父級組件中存在其他的props屬性和$attrs中的屬性重名,那么會優先使用props屬性,$attrs中同名屬性則會被忽略。
在使用時,我們也可以手動的傳遞部分$attrs屬性。比如下面的demo中,我們可以手動傳遞class屬性,并把其他屬性繼承父組件。
總的來說,$attrs是一個非常方便的屬性,可以在組件內獲取父組件傳遞過來的原生HTML屬性,并可以利用這些屬性對組件進行操作和樣式設置。