在 v-for 中使用 v-if

using a v-if inside a v-for

我有 2 个包含各种信息的数据集(数据集 A 和数据集 B),我正在使用 v-for 根据数据集 A 的长度动态生成 table 行。

但是,我现在尝试在 v-for 中使用 v-if 来检查数据集 A 中的 id 列是否与数据集 B 中的 id 列匹配。如果匹配,那么我将显示“可用”按钮,否则我将显示不可用按钮。

但是,我知道 v-if 在 v-for 中不起作用。因此,是否有其他方法可以解决这种情况?

这是我的代码示例:

<tr v-for="(dataset, i) in datasetA" :key="i">
     <td v-if="checkIfSame(dataset['id']) == true">
          <button class="btn btn-primary" :id="dataset['id']">
             Available
          </button>
    </td>
   <td v-else>Unavailable</td>
</tr>

在我的 methods: {} 里面:

checkIfSame: function (id) {
    this.datasetB.filter(function (item) {
        return item.id === id;
    });
},

你的代码应该没问题。

相同节点上使用v-for和v-if是not recommended。例如,如果你有这个,那是不推荐的:

<tr v-for="(dataset, i) in dataSetA" :key="i" v-if="checkIfSame(dataset['id']) == true">
    <td>etc.</td>
</tr>

原因是 v-for 的优先级高于 v-if。在这种情况下,最好使用计算 属性 到 return 过滤列表。

你的例子是:

<topLevelEl v-for="i in z">
    <childEl v-if="i === 2">
        It's two!
    </childEl>
    <childEl v-else>
        It's not two.
    </childEl>
</topLevelEl>

这里的v-ifv-for不在同一个节点上。 v-ifchildEl 上,v-fortopLevelEl 上。这可以。除了打开 v-for 的节点之外的任何内容都可以。如果嵌套在同一个 HTML 标签中,您仍然可以再次使用它,例如,如果您再次将 topLevelEl 嵌套在其中,您仍然可以在其中自由使用它。

像下面的片段一样尝试: 将您的检查功能更改为:

checkIfSame(id) {
  return this.datasetB.find(item => item.id === id) || false 
},

new Vue({
  el: '#demo',
  data() {
    return {
      datasetA: [{id: 1, name: 'aaa'},{id: 2, name: 'bbb'},{id: 3, name: 'ccc'},],
      datasetB: [{id: 2, name: 'bbb'}]
    }
  },
  methods: {
    checkIfSame(id) {
      return this.datasetB.find(item => item.id === id) || false
    },
  }
})

Vue.config.productionTip = false
Vue.config.devtools = false
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="demo">
  <table>
    <tr v-for="(dataset, i) in datasetA" :key="i">
       <td v-if="checkIfSame(dataset.id)">
         <button class="btn btn-primary" :id="dataset.id">
           Available
         </button>
       </td>
       <td v-else>Unavailable</td>
    </tr>
  </table>
</div>