Передать определенный параметр $attrs компоненту Vue

#vue.js #vue-component

#vue.js #vue-компонент

Вопрос:

У меня есть следующий код в моем родительском компоненте:

 <TestVIsComponent :post="somepost" :somevalue="17" data-status="activated" data-feature="new" @change="submitChange"></TestVIsComponent>
  

И следующий дочерний компонент:

   <div>
     <h1 v-bind="$attrs">{{post.id}}</h1>
  </div>
  

Этот код и $attrs передали бы атрибуты data-status=»активированный» data-feature=»новый» в тег H1 вместо div, который является желаемым результатом. Вот результат:

 <h1 data-status="activated" data-feature="new">1</h1>
  

Однако есть ли способ передать только один атрибут тегу H1? Есть ли способ каким-то образом выполнить итерацию $attrs в дочернем элементе? Что-то вроде attrs[0] или attrs[‘attribute_name’]? Мне нужно добиться следующего или подобного:

   <div>
     <h1 v-bind="$attrs[0]">{{post.id}}</h1>
     <h3 v-bind="$attrs[1]">{{post.something}}</h3>
  </div>
  

Ответ №1:

Если вы знаете, какие атрибуты для div элемента, вам следует использовать их как props вместо $attrs .

или вы можете разделить $attrs

 <template>
<div v-bind="divAttrs">
   <h1 v-bind="h1Attrs">{{post.id}}</h1>
</div>
</template>
<script>
export default {
   computed: {
     divAttrs () {
       const allowed = ['data-status', 'data-feature']
       return Object.keys(this.$attrs)
         .filter(key => allowed.includes(key))
         .reduce((obj, key) => {
           obj[key] = this.$attrs[key]
           return obj
         }, {})
     },
     h1Attrs () {
       const notAllowed = ['data-status', 'data-feature']
       return Object.keys(this.$attrs)
         .filter(key => !notAllowed.includes(key))
         .reduce((obj, key) => {
           obj[key] = this.$attrs[key]
           return obj
         }, {})
     }
   }
}
</script>
  

Комментарии:

1. Спасибо за это, он работает. Однако есть ли более простое решение для итерации или другой вариант? Кроме того, я обнаружил, что могу передавать атрибуты параметру данных: data(){ return { myAttr: this.$attrs } } Затем я могу использовать его как {{myAttr[«data-status»]}} . Рекомендуется ли это или мне следует избегать его назначения?

2. Это общее решение, и вы можете легко изменить allowed переменную для управления этими геттерами. вам не нужно назначать $attrs в параметр data, если вы не хотите использовать реактивность. просто используйте его как {{ $attrs['data-status'] }}