如何在 Vue.js 的嵌套 v-for 循环中使用 v-html 有条件地渲染原始 HTML?

Posted

技术标签:

【中文标题】如何在 Vue.js 的嵌套 v-for 循环中使用 v-html 有条件地渲染原始 HTML?【英文标题】:How can I conditionally render raw HTML with v-html inside a nested v-for loop in Vue.js? 【发布时间】:2018-09-08 00:47:23 【问题描述】:

我正在尝试在嵌套的 v-for 循环内有条件地渲染一大块 html

在嵌套的 v-for 中,我已经为每个元素绑定了一个满足特定条件的类。

所以如果stringNumber === 0(父v-for循环中的第一个渲染元素)并且在fretMark1数组中找到fret-number,则将类'fret-mark-1'添加到div:fretMark1.indexOf(fret) >= 0

<div class="fretboard">
    <div v-for="(string, stringNumber) in numberOfStrings" class="string" v-bind:class="'string' + stringNumber">
      <div v-for="fret in numberOfFrets" class="note" v-bind:class=" 'fret-mark-1': stringNumber === 0 && fretMark1.indexOf(fret) >= 0 ? true : false" v-bind:data-note="generateNoteString(instrumentTuningPresets[selectedInstrument][stringNumber] + (fret - 1), showFlats)"></div>
    </div>
  </div>
</div>

这很好,但是当我想根据另一个条件在嵌套元素中添加一个 div 时,它就成了一个问题。

我在 Vue 实例上存储了另一个名为 fretMark2 的数组,我想将 &lt;div class="fret-mark-2"&gt;&lt;/div&gt; 添加到 stringNumber === 0fretMark2.indexOf(fret) &gt;= 0 所在的元素中

如果可能的话,像这样:

<div v-if="stringNumber === 0 && fretMark2.indexOf(fret) >= 0 ? true : false"> <div class="fret-mark-2"></div> </div>

当然,在 Vue2 中我们不能使用插值渲染原始 HTML - 我们必须使用 v-html。我只是不知道如何根据 v-for 循环内的条件使用 v-html。

Here is a link to the fiddle

希望有人能帮忙。

【问题讨论】:

为什么不使用自定义指令? vuejs.org/v2/guide/custom-directive.html#Intro 或者,您可以使用v-html="some_method(html)",然后编写一个方法(在我的示例中为some_method),其中包含呈现html 的条件。 &lt;div v-if="stringNumber === 0 &amp;&amp; fretMark2.indexOf(fret) &gt;= 0 ? true : false" v-html=`&lt;div class="fret-mark-2"&gt;&lt;/div&gt;`&gt;&lt;/div&gt; 啊啊,当然.. 谢谢@JacobGoh 这很有意义.. 【参考方案1】:

如果可能的话,像这样:

<div v-if="stringNumber === 0 && fretMark2.indexOf(fret) >= 0 ? true : false"> <div class="fret-mark-2"></div> </div>

当然,在 Vue2 中,我们不能使用插值渲染原始 HTML - 我们必须使用 v-html。

您实际上不需要为此使用字符串插值或v-html。您可以简单地将v-if 添加到条件&lt;div&gt;

<div v-for="fret in numberOfFrets" ...>
  <div v-if="stringNumber === 0 && fretMark2.indexOf(fret) >= 0"
       class="fret-mark-2">
  </div>
</div>

在这种情况下,div.fret-mark-2 只有在 v-if 条件的计算结果为 true 时才会添加到 DOM。

updated fiddle

【讨论】:

谢谢@tony19。这样可行!比我预期的要简单。 @MortenVestergaard 没问题 :)

以上是关于如何在 Vue.js 的嵌套 v-for 循环中使用 v-html 有条件地渲染原始 HTML?的主要内容,如果未能解决你的问题,请参考以下文章

使用 p 标签的嵌套 v-for 循环在 Vue.js 中不起作用

来自对象键和嵌套数组的 Vue.js v-for 循环

Vue.js v-for中能不能嵌套使用v-if

Vue.js v-for中能不能嵌套使用v-if

Vue.js v-for中能不能嵌套使用v-if

如何使用vue js循环嵌套的json响应