inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

Svelte.js 입문 가이드

6. Todo 예제 만들기

강의감사합니다

237

Jon

작성한 질문수 53

3

좋은 강의 너무 감사합니다 ^^ 질문이있습니다 

todos 는 스토어 객체로 수정을하였는데, 그냥 todo는 따로 스토어객체를 활용하지않아도 수정이 가능한부분이 살짝 이해가 안됩니다. 이때 어떤 일이 일어나고있는건가요?

svelte

답변 1

5

HEROPY

Jon 님 안녕하세요~
좋은 질문 주셨네요!
혹시 내용 읽어보시고 이해가 되지 않으시면 다시 질문 남겨주세요.

우선 해당 예제에서,
todos라는 배열은 App.svelte 컴포넌트에서 {#each} 블록과 함께 '출력'했습니다.
즉 todos가 출력되는 곳은 App.svelte 컴포넌트입니다.
그리고 그렇게 반복되는 데이터를 todo라는 이름으로 Todo.svelte 컴포넌트에 Props로 전달하고 있죠.
그리고 그 전달된(받은) todo라는 객체는 반복되는 각 Todo.svelte 컴포넌트 안에서 '출력'했습니다.

이때 Todo.svelte 컴포넌트의 updateTodo 함수에서 todo.title = title 코드를 실행하면 화면이 잘 바뀌는(반응성을 가지는) 이유는, 그 코드가 있는 Todo.svelte 컴포넌트에서 그 해당 todo 객체를 출력하고 있기 때문입니다.
즉, 하나의 컴포넌트 안에서 갱신 코드와 출력 코드가 동시에 존재하는 거죠.

그런데 반대로, Todo.svelte 컴포넌트의 deleteTodo 함수에서 todos = todos.filter(t => t.id !== todo.id) 코드를 실행하면 데이터 자체는 갱신되지만, 화면이 바뀌지(반응성을 가지지) 않죠.
그것은 그 코드가 있는 Todo.svelte 컴포넌트에서 todos 배열을 출력하는 것이 아니고 App.svelte 컴포넌트에서 todos 배열을 {#each} 블록으로 출력하고 있기 때문입니다.
즉, App.svelte 컴포넌트의 <Todo {todos} /> 코드와 같이 단방향 데이터 바인딩으로는 Todo.svelte 하위 컴포넌트가 App.svelte 상위 컴포넌트의 데이터를 수정해도 반응성을 제공할 수 없다는 것인데요.

그래서 결국 실제 강의 영상처럼 Store를 사용하거나, 영상 자막에 남긴 것처럼 <Todo bind:todos /> 코드로 수정해서 양방향 데이터 바인딩을 제공하면, Todo.svelte 하위 컴포넌트에서 수정한 todos 배열이 App.svelte 상위 컴포넌트에서 반응성을 가지게 만들 수가 있는 겁니다.

정리하면, 특정 Svelte 컴포넌트 외부에서 출력되는 데이터의 반응성은 단방향 데이터 바인딩으론 관여할 수 없다는 겁니다.

추가로, 단순한 컴포넌트 구조에선 양방향 데이터 바인딩이 구현하기 쉽지만, 복잡한 다중 컴포넌트 구조를 고려하면 Store 사용이 권장됩니다.

프로젝트 실행이 되지 않아 menu API 테스트가 불가합니다 ㅠ

0

134

9

프론트 api.js의 요청 headers 옵션의 cors 관련 설정 질문

0

61

2

모듈 버전이 안맞아서 발생하는 문제 같습니다;;;

0

188

2

meteor 버전 때문에 실행이 안됩니다.

0

160

2

graghQL의 transaction 처리속도가 궁금합니다.

0

111

2

질문있습니다.

0

106

2

화면 구성 설명용 도구 이름

0

158

1

Meteor 실행 오류 문의 드립니다.

0

184

1

영호 좋아요 버튼이 콘솔에는 잘 찍히지만 화면에 렌더링 되지 않습니다.

0

129

2

영화목록 component 만들기 에서 질문이 있습니다.

0

209

3

"hello".toUpperCase() 가 안되는데요.

0

148

1

div에 on:click 이벤트 붙일 때 on:key와 관련된 이벤트를 같이 사용해야하나요?

1

907

1

cdn지원과 프론트엔드 프레임워크는 무슨 상관관계가 있나요?

1

783

1

안녕하세요

1

492

1

todo 예제에서 스토어를 사용하실때 따로 stores.js 를 사용하지 않고 바로 App.svelte에서 스토어 객체를 생성하신 이유가 있나요

1

365

1

다른 라이브러리와 통합 또는 외부 라이브러리를 svelte로 불러오는 법.

1

1133

1

스벨트 + 백엔드는 어떻한 형태로 구성을 많이 하나요?

1

1790

1

스토어객체를 왜 굳이 props로 쓰는건가용

3

326

1

props 기본값이 true인가요?

1

288

1

혹시 에코시스템에 대한 질문을 해도 괜찮을까요?

2

300

1

화살표 함수 관련 질문입니다.

2

348

1

bind 와 on:input, value 의 차이점에 대해 질문드립니다.

2

548

1

설치가 자꾸 실패해요ㅠㅠ

1

694

2

Windows 사용자는 npx 명령어 전 'git'을 설치하셔야 합니다.

3

754

1