심심한 개발자의 취미생활

life Cycle

라이프 사이클

  • .svelte 파일로 작성된 컴포넌트는 최종적으로 자바스크립트 파일로 변환되어 브라우저에서 실행된다. 이 실행(런타임) 처리의 흐름을 컴포넌트의 라이프 사이클 이라고 한다.

  • svelte5의 라이프 사이클은 생성과 파괴라는 두 가지 주요 과정으로 구성됩니다.

  • 생성/마운트은(는) 컴포넌트가 초기화되며 DOM에 렌더링되는 시점입니다. 컴포넌트가 필요한 렌더링 효과를 설정하며, 초기 상태와 UI가 준비됩니다.

  • 파괴/언마운트는 컴포넌트가 DOM에서 제거되기 전, 리소스를 정리하고 이벤트 리스너나 구독을 해제해야 할 때 호출됩니다.

  • 라이프 사이클 함수

    • 스벨트는 라이프 사이클 과정에서 특정 타이밍에 실행할 작업을 지정할 수 있는 onMount, onDestory와 상태가 반영될 때 까지 기다리는 tick을 제공하며 이들을 라이프 사이클 함수라고 한다.
    • svelte5 이후 로는 사용되지 않는 beforeUpdate, afterUpdate 함수가 있었다.
  • onMount

    • onMount는 컴포넌트가 작성되고 최초 렌더링이 완료된 직후에 호출되는 처리를 설정하는 함수이다.
  • onDestory

    • onDestory는 onMount와 반대로, 컴포넌트가 삭제되기 직전에 호출되는 처리를 설정하는 함수다
  • tick

    • tick은 스벨트가 제공하는 특수한 함수로, 컴포넌트 내부에 보류 상태의 DOM 업데이트가 있으면 업데이터가 끝날 떄까지 기다리는 Promise를 반환한다.
<script>
    import { onMount, onDestory, tick } from 'svelte'

    onMount(() => {
        console.log('the component has mounted')

        // onMount에서 비동기 함수 로직(async/await)을 넣을 경우 async 함수의 리턴은 promise이므로 return 익명 함수가 무시된다. 그래서 비동기 함수가 있는 경우에는 onDestory 함수를 사용해야 된다.
        // return () => { console.log('the component is being destoryed') }
    })

    onDestory(() => {
        console.log('the component is being destoryed')
    })

    let clicked = $state(false);

    const handleClick = async () => {
        // 상태 변경
        clicked = true;

        // clicked 값의 상태가 변경 될때까지 대기
        await tick();

        // clicked 의 값이 변경 되지 않았을때 실행시 <canvas> 요소를 찾을 수 없어 에러 발생
        const canvas = document.getElementById("canvas");
        const ctx = canvas.getContext("2d");

        ctx.fillStyle = "#ddd";
        ctx.fillRect(0, 0, 100, 100);
        ctx.fillRect(100, 100, 200, 200);
    };
</script>

<h3>{temp}</h3>

<div>
    <button onclick={handleClick}>표시</button>
</div>

{#if clicked}
    <canvas id="canvas" width="200" height="200"></canvas>
{/if}

beforeUpdate / afterUpdate

  • beforeUpdate와 afterUpdate는 각각 컴포넌트의 DOM 구조가 업데이트 되기 직전과 직후에 호출 되는 처리를 등록하는 함수이다.
<script>
    import { beforeUpdate, afterUpdate } from 'svelte'

    beforeUpdate(() => {
        console.log('the component is about to update')
    })

    afterUpdate(() => {
        console.log('the component just updated')
    })
</script>