해결된 질문
작성
·
145
0
답변 1
1
1) 첫번째 답변
자바스크립트의 map의 경우 배열을 받아서
그 배열안의 요소들을 하나하나 조작하여 새로운 배열로 리턴하는 메소드입니다.
만약 다음과 같이 객체로 되어 있는 배열인 todos를
let todos = [
{id: 1, name: todo1},
{id: 2, name: todo2},
{id: 3, name: todo3},
]
아래와 같이 map을 이용해 조작한다고 하면
todos = todos.map(todo => {
if(todo.id === editTodo.id) {
todo = editTodo
}
return todo
})
‘todos.map(todo ‘ 여기의 todo는 순서대로 들어오는 배열안의 객체 하나를 의미합니다. 우선은 id가 1인 객체가 들어오고 다음으로 id가 2인 객체 순으로 배열안의 객체 하나하나를 받을 수 있고
그 들어온 객체를 순차적으로 todo.id 와 editTodo.id의 값을 비교하고 같다면
해당 todo를 그냥 editTodo로 교체하여 리턴해준다고 생각하시면 되겠습니다.
만약 위의 코드를 map이 아닌 이전의 방법으로 조작한다면 아래와 같이 for 문을 이요해 조작하는 것과 같은 결과라고 보시며 되겠습니다.
let newTodos = []
for (var i=0; i < todos.length; i++ ) {
if(todos[i].id === editTodo.id) {
todo[i] = editTodo;
}
newTodos.push(todos[i])
}
for를 이용해 객체를 순서대로 받아서 조작 가능 하듯
map도 똑같이 배열의 객체를 순차적으로 받아서 조작한 것입니다.
이부분은 ‘섹션10 기타’에서 ‘배열조작 메소드’ 부분을 들어보시면 좀 더 이해가 되실 것입니다.
2) 두번째 답변
우선 TodoList 컴포넌트에서 문의한 것처럼 {#each fetchTodos as todo} 로 해서 fetchTodos안에 들어있는 객체의 개수만큼 반복이 이루어 집니다.
그리고 fetchTodos안에 들어있는 객체 하나하나가 바로 todo로 명명된 것입니다.
여기에 todo가 TodoItem에 props를 통해서 전달되게 됩니다.
추가로 답변이 필요하시면 알려주세요
span태그를 더블클릭하면 handleChangeEditMode가 실행되면서 editMode에 저장된 id와 현재 todo.id가 같아지게 되어 input 창이 나타납니다.
그리고 input 창을 수정하고 handleEditTodoItem에 전달인자로 현재 todo를 넣어 실행시면
handleEditTodoItem(todo)의 실제 위치 즉 App.svelte에서 실행되고
이를 통해 App.svelte의 todos가 변경되고
다시 변경된 데이터는 itmeList.svelte 에서 item.svelte까지 전달되어서 변경이 되는 것입니다.
답변 정말 감사드립니다!
추가적인 질문인데요!
<input type="text" bind:value={todo.content} on:focusout={() => handleEditTodoItem(todo)}>
여기서 포커스 아웃이 되면은 handleEditTodoItem 함수가 실행이 되는 거잖아요!
실행 순서가 그럼 더블클릭을 하였을 때 text가 보이게 되고 거기 안에 값을 적으면
value가 바뀌게 되서 vlaue값이 bind 된 todo.content에 입력이 되고 그 입력 된
todo를 handleEditTodoItem 함수 매개변수에 넣어서 실행시키는 거 맞나요?ㅠㅜ
잘몰라서 죄송합니다 ㅠㅜ