【发布时间】:2019-07-18 05:03:38
【问题描述】:
我有一个数据数组,数组中的每个项目都有一个 state 属性,其中包含以下值之一:allowed、pending、rejected。我想根据他们的state 在单独的部分中显示数据。每张数据卡上有两个按钮,可用于更改项目state。
我使用三个计算属性来分隔数据,如下所示:
computed: {
pendingData() {
return this.data.filter(x => x.state === 'pending')
},
allowedData() {
return this.data.filter(x => x.state === 'allowed')
},
rejectedData() {
return this.data.filter(x => x.state === 'rejected')
}
}
然后我使用v-for 将它们显示在自己的部分中。
更改state是通过API调用发生的,所以我需要将项目的id和新状态发送到setState函数:
<div class="state-change-buttons">
<button @click="setState(item.id, 'allowed')">
<span uk-icon="icon: check; ratio: 1.4"></span>
</button>
<button @click="setState(item.id, 'pending')">
<span uk-icon="icon: future; ratio: 1.4"></span>
</button>
</div>
这是setState函数:
setState(id, state) {
const index = this.data.findIndex(x => x.id === id)
this.$axios.post(`/api/${id}`, {state})
.then(res => {
this.data.splice(index, 1, res.data)
})
.catch(err => {
this.$notify(err, 'danger')
})
}
如您所见,要实时更新我的数据数组,我必须使用findIndex 找到所选项目的索引。
Vue style guide 建议不要在与v-for 相同的元素上使用v-if。但是我是否仍然应该避免它,即使它降低了我的应用程序的时间复杂度?
当前情况:
3 计算属性 (O(3n)) + findIndex (O(n)) + 3 v-for (O(p + r + q))
有条件的v-for:
3个条件v-for(O(3n))(没有findIndex,这样我可以直接把index传给setState)
条件v-for代码:
<div v-for="(item, index) in data" v-if="item.state === 'pending'" :key="item.id">
<!-- data card body (including buttons) -->
</div>
<div v-for="(item, index) in data" v-if="item.state === 'allowed'" :key="item.id">
<!-- data card body (including buttons) -->
</div>
<div v-for="(item, index) in data" v-if="item.state === 'rejected'" :key="item.id">
<!-- data card body (including buttons) -->
</div>
【问题讨论】:
-
我不太确定
v-if和v-for是否适合您的模板,您能补充一下吗?因为据我所见和理解,它们不应该在同一个根元素上。 -
@StevenB。我在帖子末尾添加了代码。
-
不推荐使用 v-if 和 v-for vuejs.org/v2/style-guide/#Avoid-v-if-with-v-for-essential
标签: javascript performance vue.js vuejs2 time-complexity