将特定的 $attrs 参数传递给 Vue 组件

Posted

技术标签:

【中文标题】将特定的 $attrs 参数传递给 Vue 组件【英文标题】:Pass specific $attrs parameter to Vue component 【发布时间】:2021-01-28 14:42:36 【问题描述】:

我的父组件中有以下代码:

<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="activated" data-feature="new" 属性传递给 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>

【讨论】:

谢谢你,它正在工作。但是,是否有更简单的迭代解决方案或其他选项?另外,我发现我可以将属性传递给数据参数:data() return myAttr: this.$attrs 然后我可以将其用作 myAttr["data-status"]。这是推荐的还是我应该避免分配它? 这是一个通用的解决方案,您可以轻松更改allowed 变量来控制这些getter。如果您不想使用反应性,则无需将 $attrs 分配给 data 参数。只需将其用作 $attrs['data-status']

以上是关于将特定的 $attrs 参数传递给 Vue 组件的主要内容,如果未能解决你的问题,请参考以下文章

如何将参数传递给 Vue 组件以启动组件实例

通过路由器将查询参数传递给vue组件

将 Laravel 集合中的 id 参数传递给 Vue 组件

如何将参数传递给Vue组件并在组件模板中重新使用其值

vue传参的三种方式

Vue $将参数传递给已经有参数的函数