仅在未给出插槽时添加 v-html 属性

Posted

技术标签:

【中文标题】仅在未给出插槽时添加 v-html 属性【英文标题】:Add v-html attribute only if slot not given 【发布时间】:2020-02-24 13:40:52 【问题描述】:

在组件片段中考虑以下内容:

<tr v-for="row in rows" :key="row[rowKey]">
   <td v-for="col in cols">
      <slot v-if="col.bSlot" :name="col.bSlot" :row="row"></slot>
      <template v-else v-html="formatField(row, col)"></template>
   </td>
</tr>

如果给定,我想渲染一个槽,如果没有,我想渲染一个格式化函数返回的字符串,未转义。这不起作用,因为我发现 v-html 不适用于模板。以下工作,但您需要额外的我不想要的不必要的 div 标签:

<td v-for="col in cols">
   <slot v-if="col.bSlot" :name="col.bSlot" :row="row"></slot>
   <div v-else v-html="formatField(row, col)"></div>
</td>

如果这仍然有效但已被弃用,那就太好了:

<td v-for="col in cols">
   <slot v-if="col.bSlot" :name="col.bSlot" :row="row"></slot>
   <template v-else>
      formatField(row, col)
   </template>
</td>

我剩下的唯一其他选项是这个,但是因为没有放置 v-else 的位置,所以如果给定了一个插槽,我让 formatField() 不返回任何内容:

<td v-for="col in cols" v-html="formatField(row, col)">
   <slot v-if="col.bSlot" :name="col.bSlot" :row="row"></slot>
</td>

formatField(row, col) 
   if (col.bSlot) return;  // also tried returning null, undefined, and ''
   ...

但是,现在插槽在提供时不会呈现。如果提供了 v-html,Vue 似乎会忽略该插槽。那么在不提供col.bSlot的情况下怎么不提供v-html呢?

【问题讨论】:

这能回答你的问题吗? VueJS conditionally add an attribute for an element 不,除了匹配关键词之外,我看不出它有什么关联。仔细阅读我的帖子,你会发现它是一个不同的问题。 【参考方案1】:

如果没有给出槽位,你可以设置默认值 - Fallback-Content

这个怎么样:

1 <td v-for="col in cols">
2  <slot :name="col.bSlot" :row="row">
3      formatField(row, col) 
4     // <-- this is a comment
5     // <span v-html="formatField(row, col)"></span>
6   </slot>
7 </td>

【讨论】:

这与我上面解释此解决方案的第二个代码示例不同,但需要注意的是,将添加不必要的元素(在我的情况下为 ,在您的情况下为 )。这就是我不喜欢那个解决方案的地方,我一直在寻找一个没有不必要添加元素的解决方案。 @BrobicVripiat 使用第 3 行,然后使用 formatField(row, col) 。在您需要的formatField 方法return 字符串中。

以上是关于仅在未给出插槽时添加 v-html 属性的主要内容,如果未能解决你的问题,请参考以下文章

如何利用Vue.js库中的v-html指令添加html元素

为啥 KeyListener 仅在未按下按钮时才起作用?

Gremlin - 仅在不存在时添加顶点

如何测试通道是不是关闭并仅在未关闭时发送给它

仅在需要时自动连接到 PDO

仅在未运行时使用 cron 运行 python 脚本