VueJ: 렌더링 요소가 아닌 'v-for'
간단한 버전으로 관련 코드를 공유하고 싶은데 공유할 수 없습니다.저는 Vue에서 만든 ToDo 앱을 조금 오버하고 있습니다.여기 레포 링크가 있습니다.https://github.com/jaiko86/subtasks
ToDo 항목은 스토어에서 관리됩니다.
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가 자리 표시자로 지정됩니다.
여기에 있는 .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과 콘솔, 뷰에 차이가 있는 이유를 이해하는 데 비참하게 실패하고 있습니다.
렌더링된 보기는 다음과 같습니다.
vue dev 툴의 내용은 다음과 같습니다.
됩니다.<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는 두 가지 항목의 목록을 반환하지만 첫 번째 항목만 렌더링합니다.
여기 한가지 가능한 설명이 있습니다...
계산된 속성이 배열을 반환하는 시점에서 배열에는 항목이 하나만 포함됩니다.예를 들어 여러 가지 방법으로 확인할 수 있습니다.템플릿에 다음 항목을 넣어 보십시오.
{{ taskIds }}
그 후 어레이는 2개의 항목을 포함하도록 변경될 수 있지만 변경으로 인해 반응성 시스템이 트리거되지 않으면 재렌더링은 발생하지 않습니다.
것 같다.tasksIds
tasksById[currentWorkspaceId].subTaskIds
두 가지 가능성이 있습니다. 중 하나subTasksIds
반응성이 없거나 반응성을 트리거하지 않는 방식으로 수정됩니다(예: 지수에 의한 직접 수정).
당신의 가게 코드를 보면 후자의 명확한 예가 보이지 않습니다.단, 이 행은createTask
이상하게도 전자와 비슷한 것 같습니다.
state.tasksById[task.id] = task;
추가 중입니다.task
(대부분) 새 키 아래의 기존 객체로 이동합니다.이는 반응성 경고 중 하나이며 새 속성을 개체에 직접 추가할 수 없습니다.
https://vuejs.org/v2/guide/reactivity.html#Change-Detection-Caveats
그 대신에,Vue.set
:
Vue.set(state.tasksById, task.id, task);
진행 상황을 더 잘 이해하기 위해 다음 로그를 끝에 추가하십시오.createTask
:
console.log(state.tasksById);
콘솔에서 개체/어레이를 자세히 살펴보면 Vue 반응성 시스템의 증거를 볼 수 있습니다.에 대한 참조가 표시될 수 있습니다.Observer
. 속성에는 getters와 setters가 있으며 속성 값을 보려면 클릭해야 합니다.그러나 이 문제는 개체/배열이 반응하는 경우에만 발생합니다.없이 직접 추가하는 태스크Vue.set
는 콘솔에 일반 객체 또는 콘솔로 표시됩니다.이러한 문제를 쉽게 디버깅할 수 있도록 하기 위해 어떤 차이가 있는지 알아보는 것이 좋습니다.
언급URL : https://stackoverflow.com/questions/57465536/vuejs-v-for-not-rendering-elements
'programing' 카테고리의 다른 글
vue 맵 상태를 사용하여 어레이를 v-modeling합니다. (0) | 2022.07.11 |
---|---|
Spring MVC: GET @RequestParam과 같은 복잡한 객체 (0) | 2022.07.11 |
테스트 시 Vue JS 구성 요소 템플릿 렌더링 문제 (0) | 2022.07.11 |
구성 요소에서 Vuex 모듈 작업에 액세스하는 방법 (0) | 2022.07.11 |
Vue.js 앱은 http://localhost:8080에서 실행되며, 백엔드 API에 악시를 사용하여 GET 요청을 할 때마다 로컬 호스트가 URL 앞에 추가됩니다. (0) | 2022.07.11 |