인프런 커뮤니티 질문&답변

신규철님의 프로필 이미지
신규철

작성한 질문수

만들면서 배우는 Svelte

강의 도중 궁금한 것이 있습니다!

해결된 질문

작성

·

145

0

2가지 인데요!
 
1번째.
 
function handleEditTodoItem(editTodo){
            todos = todos.map(todo => {
                if(todo.id === editTodo){
                    todo = editTodo
                }
                return todo
            })
            editMode = ''
      }
 
 
이 2번째 줄 todos = todos.map(todo =>
이 부분에 todo => 이게 무엇을 의미하는 것인지 정확히 잘모르겠어요 ㅠㅜ...
그리고 이 함수의 실행 원리가 무엇인지 잘 이해가 안되요 ㅠㅜ
 
2번째.
<input type="text" bind:value={todo.content} on:focusout={() => handleEditTodoItem(todo)}>
 
위 코드에서 handleEditTodoItem을 실행하게 되면 todo라는 매개변수가
함수에 들어가는 것이 잖아요
그러면 todolist.svelte에서
{#each} 구문을 사용해서 반복 구문을 만들고
리스트 중에 한개를 todo라고 이름을 정한 것 이잖아요(맞나요..? 아래코드처럼!)
<div class="main">
    <ul>
        {#each fetchTodos as todo}
            <li>
                <Todoitem {todo} {handleCheckTodo} {editMode} {handleChangeEditMode} {handleEditTodoItem} {handleRemoveTodo}/>
            </li>
        {/each}
    </ul>
</div>
그러면 지금 저기 매개변수로 넣은 값이 {#each fetchTodos as todo} 여기의 마지막 todo를 얘기하는 것이 맞나요 ㅠㅜ?

답변 1

1

Indie Coder님의 프로필 이미지
Indie Coder
지식공유자

 

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.ideditTodo.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를 통해서 전달되게 됩니다.

 

 

추가로 답변이 필요하시면 알려주세요

 

 

 

 

신규철님의 프로필 이미지
신규철
질문자

답변 정말 감사드립니다! 

 

추가적인 질문인데요!

 

<input type="text" bind:value={todo.content} on:focusout={() => handleEditTodoItem(todo)}>

여기서 포커스 아웃이 되면은 handleEditTodoItem 함수가 실행이 되는 거잖아요!

실행 순서가 그럼 더블클릭을 하였을 때 text가 보이게 되고 거기 안에 값을 적으면

value가 바뀌게 되서 vlaue값이 bind 된 todo.content에 입력이 되고 그 입력 된

todo를 handleEditTodoItem 함수 매개변수에 넣어서 실행시키는 거 맞나요?ㅠㅜ

잘몰라서 죄송합니다 ㅠㅜ 

Indie Coder님의 프로필 이미지
Indie Coder
지식공유자

span태그를 더블클릭하면 handleChangeEditMode가 실행되면서 editMode에 저장된 id와 현재 todo.id가 같아지게 되어 input 창이 나타납니다.

그리고 input 창을 수정하고 handleEditTodoItem에 전달인자로 현재 todo를 넣어 실행시면

handleEditTodoItem(todo)의 실제 위치 즉 App.svelte에서 실행되고

이를 통해 App.svelte의 todos가 변경되고

다시 변경된 데이터는 itmeList.svelte 에서 item.svelte까지 전달되어서 변경이 되는 것입니다.

신규철님의 프로필 이미지
신규철
질문자

명쾌한 답변 정말 감사드립니다!

신규철님의 프로필 이미지
신규철

작성한 질문수

질문하기