【问题标题】:Toggling classes of individual li elements by click in a v-for通过单击 v-for 来切换单个 li 元素的类
【发布时间】:2025-12-17 18:10:02
【问题描述】:

在尝试将that answer 实施到我的应用程序中失败了一个多小时后,我决定在这里寻求帮助。我的li 项目类不会切换,我不知道为什么。这是我的代码:

HTML:

<li :class="classObject(event)" v-for="event in events" @click="showEvent(event)">
  ...
</li>

JS:

methods: {
  classObject(event) {
    return {
      active: event.active,
      'event': true
    };
  },
  showEvent: function(event) {
    event.active = !event.active;
  }
},
mounted() {
  axios.get(this.eventsJsonUrl)
    .then(response => {
      this.events = response.data;
      this.events.map((obj) => {
        obj.active = false;
        return obj;
      })
    })
}

请注意,我的 events 对象数组最初没有活动属性,我将其添加到 mounted 挂钩中。

以防万一这是结果 events 数组的 console.log

【问题讨论】:

    标签: vue.js vue-cli-3


    【解决方案1】:

    像这样使类依赖于变量:

    <li class="event" :class="{ active: event.active }" v-for="event in events" @click="showEvent(event)">
      ...
    </li>
    

    函数showEvent 像您已经拥有的那样切换 event.active 变量。

    编辑:查看此 jsfiddle 以了解其是否有效:https://jsfiddle.net/84zhx1et/

    编辑 2:我现在看到您的示例中出了什么问题:您正在尝试将 active 属性动态添加到事件中,但 VueJs 不会触发此更改。您可以像这样设置属性以确保 VueJs 重新呈现事件:

      this.events.map((obj) => {
        this.$set(obj, 'active', false)
      })
    

    查看使用此方法的 JsFiddle:https://jsfiddle.net/84zhx1et/1/

    【讨论】:

    • 不起作用。从理论上讲,我的代码已经使该类依赖于 event.active 值。
    • 为什么它不起作用?您可以打印您尝试过的示例并且它不起作用吗?在这个 jsfiddle 中工作得很好:jsfiddle.net/84zhx1et
    • @drake035 查看我的更新答案,了解我认为在您的场景中出现问题的解决方案
    • 谢谢,你是我的人!我不知道 Vue 无法检测到属性添加,现在我知道了 (vuejs.org/v2/api/#Vue-set)