IT/기타

[Alpine.js] Alpine.store 객체를 통한 전역 데이터 관리

땅일단 2024. 1. 27. 18:27

리액트의 Redux처럼 모든 모듈에서 접근할 수 있도록 하는 데이터가 필요하다면 Alpine.store 객체를 사용할 수 있습니다.

store.js라는 파일을 하나 만들어서 거기에 Alpine.store를 정의하고, html에서 불러와서 사용할 수 있도록 합니다.

 

// store.js
Alpine.store("global", {
        open: false,

        toggleOpen() {
            this.open = !this.open;
        }
    });

 

store에는 변수와 메소드를 정의할 수 있습니다. global이라는 이름으로 store를 정의합니다.

 

// index.js
document.addEventListener("alpine:init", () => {
    Alpine.data("test", () => ({
        store: Alpine.store("global"),
        toggle() {
            this.store.toggleOpen();
        },
    }));
});

 

그리고 index.js에 Alpine.data를 정의하고 그 안에서 store라는 이름으로 정의한 store를 불러옵니다.

그렇게 되면 test라는 data 안에서 global store에 접근할 수 있게 됩니다.

 

예를 들어 저렇게 global store 안의 메소드인 toggleOpen()이라는 메소드를 실행하는 것도 가능하고

 

<!-- index.html -->
<!doctype html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="./output.css" rel="stylesheet">
</head>
<body>
<div x-data="test">
    <button @click="toggle()" class="bg-[#0000FF]">
        Expand
    </button>
    <span x-show="$store.global.open">
      Content...
    </span>
</div>
<script defer type="module" src="/src/index.js"></script>
<script defer src="/src/store.js"></script>
<script defer src="https://cdn.jsdelivr.net/npm/alpinejs@3.13.3/dist/cdn.min.js"></script>
</body>
</html>

 

html 안에서 $store.global.open 으로 변수에 직접 접근하는 것도 가능합니다.