代码之家  ›  专栏  ›  技术社区  ›  timpone

如何根据Vue列表中的状态有条件地仅显示项

  •  1
  • timpone  · 技术社区  · 6 年前

    我有下面的Vue代码(这是一把小提琴) https://jsfiddle.net/he26tn53/ :

    <div id="app"></div>
    
    new Vue({
      el: "#app",
      template:`<h2>People:</h2><span @click="showOnlyEnabled = !showOnlyEnable"> toggle enabled</span>
      <ol>
        <li v-for="person in people">
          <label>
            <span>
              {{ person.name }}
            </span>
          </label>
        </li>
      </ol>`,
    
      data: {
        showOnlyEnabled: false, 
        people: [
          { name: "Joe", isEnabled: false },
          { name: "Jonie", isEnabled: false },
          { name: "Jill", isEnabled: true },    
          { name: "Jack", isEnabled: true },    
          ]
      },
      methods: {
        toggle: function(todo){
            todo.done = !todo.done
        }
      }
    })
    

    并希望启用切换以强制只显示已启用的用户。我不想做两个检查,比如:

    <span v-if="showOnlyEnabled">
       <template v-if="person.isEnabled">
          {{person.name}}
       </template>
    </span>
    <span v-else>
          {{person.name}}
    </span>
    

    有没有更简洁的方法可以做到这一点?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Phil    6 年前

    https://vuejs.org/v2/guide/list.html#v-for-with-v-if ,两者都可以使用 v-for v-if 在同一个元素上。

    你只需要纠正布尔表达式

    <li v-for="person in people" v-if="person.isEnabled || !showOnlyEnabled">
    

    或者,使用计算属性和过滤器(具有与上面相同的逻辑)

    computed: {
      filteredPeople() {
        return this.people.filter(({isEnabled}) => isEnabled || !showOnlyEnabled)
      }
    }
    

    <li v-for="person in filteredPeople">