【发布时间】:2019-12-19 06:57:21
【问题描述】:
我想分享的只是简化版本的相关代码,但我不能。我有一个用 Vue 制作的稍微过度的 todo 应用程序。这是回购的链接:https://github.com/jaiko86/subtasks
待办事项在商店中管理:
export default {
state: {
workspaceIds: [], // IDs of workspaces
tasksById: {}, // <--- this is the tasks I have
detachedTask: null,
focusedTaskId: null,
currentWorkspaceId: null,
},
...
}
在 App.vue 文件中,我有以下 v-for 将运行的计算属性:
computed: {
taskIds() {
const { currentWorkspaceId, tasksById } = this.$store.state;
if (this.showOnlyLeafSubTasks) {
return Object.values(tasksById)
.filter(task => !task.subTaskIds.length)
.map(task => task.id);
} else if (currentWorkspaceId) {
return tasksById[currentWorkspaceId].subTaskIds;
}
},
},
基本上,计算属性只会返回与某些条件相关的任务列表,例如我所在的工作区。每个任务都有一个唯一的 ID,但为了调试,我做了这样每个任务都有task-#格式的ID,并且任务的输入将有它的任务ID作为占位符。
这是App.vue中的模板:
<template>
<div id="app">
<!-- This is the top part -->
<WorkspaceNav />
<!-- this is the for-loop in question -->
<TaskWrapper v-for="id in taskIds" :key="id" :id="id" :depth="0" />
<!-- this is the filter that's on the right side -->
<TaskFilters />
</div>
</template>
问题是它不会渲染计算属性返回的项目。
我很难理解为什么 vue devtool 和控制台中显示的内容与视图之间存在差异。
这是我在开发工具中选择<App> 组件时控制台中打印的内容,从而可以通过$vm0.taskIds 访问它:
["task-1", "task-2"]
这是我分层打印任务的自定义函数:
> printTree()
task-0
task-1
task-2
这里是当前代码相关部分的 DOM:
<div id="app">
<div class="workspace-nav">
...
</div>
<div data-v-76850a4a="" data-v-7ba5bd90="" class="leaf">
<div data-v-76850a4a="" class="main-task depth-0">
<!---->
<div class="progress-indicator">
<div class="checkmark gray-checkmark"></div>
</div>
<input placeholder="task-1" />
</div>
<div class="sub-tasks"></div>
</div>
<div class="filters">
...
</div>
</div>
所以很明显,无论我在哪里看,taskIds 都会返回一个包含两个项目的列表,但它只呈现第一个。
【问题讨论】:
-
计算属性总是应该返回一些值,你在做有条件的,在某些情况下不能返回任何东西
标签: javascript vue.js vuejs2