我有以下代码(vue v3.2.33)
<template v-for="route of routes" :key="route.name">
<li :set="open = false">
<div class="collapse"
@click="open = !open"
:class="[open ? 'collapse-is-open' : '']">
</div>
</li>
</template>
基本上每个li
都有一个坍缩,并以collapse-is-open
类打开。我试图使用:set
属性的变量并修改该变量,但它似乎不起作用。
如果这不起作用,还有什么其他方法呢?基于我在:key
中设置的跟踪所有状态的值的对象?
:set
是v-bind
指令的语法。它在元素上绑定了一个属性/属性,但是<li>
没有这样的set
属性。我想你正在尝试为每个<li>
创建一个名为open
的临时变量,但该功能在Vue中不存在(也许你正在考虑petite-vue
的v-scope
)。
一个解决方案是创建一个单独的数据结构,其中包含每个<li>
的打开状态,并使用它来更新class
绑定:
export default {
data() {
return {
routes: [⋯],
open: {} // stores open-state of each route item
}
}
}
<template v-for="route of routes" :key="route.name">
<li>
<div class="collapse"
@click="open[route.name] = !open[route.name]"
:class="[open[route.name] ? 'collapse-is-open' : '']">
</div>
</li>
</template>
演示1
或者,您可以将该属性添加到routes
中的每个数组项:
export default {
data() {
return {
routes: [
{
name: 'Route 1',
open: false,
},
{
name: 'Route 2',
open: false,
},
{
name: 'Route 3',
open: false,
},
],
}
},
}
<template v-for="route of routes" :key="route.name">
<li>
<div class="collapse"
@click="route.open = !route.open"
:class="[route.open ? 'collapse-is-open' : '']">
</div>
</li>
</template>
演示2