• 카테고리

    질문 & 답변
  • 세부 분야

    프론트엔드

  • 해결 여부

    미해결

질문드립니다 !

20.09.17 14:40 작성 조회수 154

1

count에 값이 변경될때마다 호출되기때문에 onDestroy로 해지해야 한다고 하셨는데, 그 이유에 대해 자세히 알 수있을까요??

작동하는데 큰 문제는 없는것같은데, 어떤이유때문인가요? 

답변 1

답변을 작성해보세요.

0

안녕하세요. :) 강의 내용중 모호했던 부분이 있었던 것 같습니다.

subscribe에 전달 된 함수가 count 값이 변경될 때 마다 호출이 되는데, subscribe를 사용한 컴포넌트가 화면에서 제거되어도, count 값이 변경되면  subscribe에 전달 된 함수가 실행되기 때문에 컴포넌트가 제거되는 onDestroy에서 해지해야 합니다.

간단한 예제를 첨부하겠습니다.

<!-- App.svelte -->
<script>
  import { onDestroy } from 'svelte';
  import { count } from './stores';

  import Incrementer from './Incrementer.svelte';
  import Decrementer from './Decrementer.svelte';
  import Resetter from './Resetter.svelte';

  let countValue;
  let isShow = true;

  const unsubscribe = count.subscribe(value => countValue = value);

  onDestroy(() => {
    unsubscribe();
  });
</script>

<p>count: {countValue}</p>

<Incrementer />
<Decrementer />
{#if isShow}
  <Resetter />
{/if}
<button on:click={() => isShow = !isShow}>Reset 버튼 제거</button>

<!-- Resetter.svelte -->
<script>
  import { onDestroy } from 'svelte';
  import { count } from './stores';

  const unsubscribe = count.subscribe(value => console.log(value))

  // onDestroy 함수를 주석을 한 후와 주석을 제거한 후의 차이를 비교해 보세요.
  onDestroy(() => {
    unsubscribe();
  });

  function reset (){
    count.set(0);
  }
</script>

<button on:click={reset}>reset</button>

App.svelte와 Resetter.svelte를 위의 코드처럼 수정하고, "Reset 버튼 제거" 버튼을 클릭하면서, Resetter 컴포넌트의 onDestory 라이프 사이클 함수가 정의된 코드와 정의 되지 않은 코드의 로그 출력 결과를 확인하시면 이해하는데 도움이 될 것 같습니다.