Vue.js 使用 class 绑定的奇怪渲染

Vue.js weird rendering with class binding

所以基本上我有一个 html table 和一个 v-for 循环对象数组,这里没有什么复杂的。当用户单击一行时,它会将对象 "linked" 的 selected 属性 切换到给定行。

现在,我还设置了一个简单的 class 与 v-bind:class="{'active': n.selected}" 的绑定,其中 n 是我的对象,但它不会更新。现在更奇怪的是我使用了 vue-cli 中的 webpack 模板,当我 :

所选行突然得到 active class,正如 CSS 所说,直到 webpack 热重载重新生成页面。
这是我的代码:

<tr
    v-for="n in node.children"
    track-by="id"
    v-on:click="toggleElement(n)"
    v-bind:class="{'active': n.selected}">
<td>
    <i class="icons">
        <i class="folder yellow icon"></i>
    </i>
</td>
<td><a v-on:click.stop="getLevel(n.id)">{{ n.name }}</a></td>
<td><span v-if="n.modification_date">{{ n.modification_date | moment "calendar"}}</span><span v-else>-</span></td>
<td><span v-if="n.size">{{ n.size }}</span><span v-else>-</span></td>

对于javascript方法

toggleElement: function(element) {
            element.selected =  !!(element.selected === undefined || !element.selected);
        },

现在有更多详细信息,正在通过 ajax 调用检索对象,并且 selected 属性 从一开始就不存在。

任何建议或解决方案? 非常感谢!

首先,不要忘记在您的代码中添加结尾 </tr>

其次,您不能在使用 VueJS 创建对象后为其添加新属性。

如果在创建元素时,其属性 selected 未定义,则 VueJS 不会在其上添加 getter/setter 并且更改它不会更新界面。

在将它传递给 VueJS 之前,您需要添加 selected 属性。

  • 默认,vue.js无法跟踪你在vue实例创建后添加的属性
  • 但是,你可以调用一些方法来告诉 vue 添加了新属性:

    vm.$set('selected', true) //this will make "selected" propertie trackable