Store
- 어플리케이션 계층 구조에 속하지는 않지만, 때때로 다양하고 연관없는 component 또는 일반적인 javascript 모듈에서 접근 가능한 값이 필요할 수가 있다.
- svelte에서는 store라는 module이 이러한 기능을 제공해준다. 한마디로 여러개의 component에서 공통적으로 참조하는 값에 대해서, 저장해놓는 것이다.
Writable stores
- 쓰기 가능한 저장소로 subscribe(:값을 가져오는 것), set(:값을 셋팅하는 것), update(:값을 수정하는 것.) 3가지 method를 제공한다.
예시
- store.js에서 count라는 store를 export한다.
- Decrementer.svelte, Incrementer.svelte, Resetter.svelte에서 해당 store를 import하여 value를 조작한다.
- count store를 subscribe하는 App.svelte에서 저장된 값을 그대로 사용 표현한다.
App.svelte
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| <script>
import { count } from './stores.js';
import Incrementer from './Incrementer.svelte';
import Decrementer from './Decrementer.svelte';
import Resetter from './Resetter.svelte';
let countValue;
count.subscribe(value => {
countValue = value;
});
</script>
<h1>The count is {countValue}</h1>
<Incrementer/>
<Decrementer/>
<Resetter/>
|
Decrementer.svelte
1
2
3
4
5
6
7
8
9
10
11
| <script>
import { count } from './stores.js';
function decrement() {
count.update(n => n - 1);
}
</script>
<button on:click={decrement}>
-
</button>
|
Incrementer.svelte
1
2
3
4
5
6
7
8
9
10
11
| <script>
import { count } from './stores.js';
function increment() {
count.update(n => n + 1);
}
</script>
<button on:click={increment}>
+
</button>
|
Resetter.svelte
1
2
3
4
5
6
7
8
9
10
11
| <script>
import { count } from './stores.js';
function reset() {
count.set(0);
}
</script>
<button on:click={reset}>
reset
</button>
|
stores.js
1
2
3
| import { writable } from 'svelte/store';
export const count = writable(0);
|
Auto-subscriptions
- 이전 방식은 subscribe 하고 unsubscribe를 하지 않음으로 메모리 누수가 발생되는 버그가 생긴다.
- 따라서 onDestory를 통해 unsubscribe를 해줌으로써 해당 버그를 해결할수 있는데,
예시
- store.js에서 count라는 store를 export한다.
- Decrementer.svelte, Incrementer.svelte, Resetter.svelte에서 해당 store를 import하여 value를 조작한다.
- count store를 subscribe하는 App.svelte에서 저장된 값을 그대로 사용 표현한다.
- $와 store 이름을 접두사로 사용하여 store 값을 참조할 수 있습니다. 예시 :
$count
- Auto-subscriptions은 component의 최상위 scope에서 선언(또는 가져온)된 store 변수에 대해서만 작동
- $로 시작하는 이름은 store 값으로 가정됩니다. $는 예약어로, $ 접두사로 자신의 변수를 선언하는 것을 Svelte가 방지
Readable stores
- 다른 사람에 의해 쓰기가 가능하지 않은 값(가령 마우스위치나 지리적위치)에 대해서 사용
예시
- readable(첫번째인자, function start(set){ return function stop(){}}; )
- 첫번째 인자 : 초기값
- 두번째 인자 start함수로 set을 callback으로 받고, store가 처음 subscribe될때 호출된다.
- stop 함수를 return 하는데, 구독이 해제될때 호출된다.
1
2
3
4
5
6
7
8
9
| readable(new Date(), function start(set) {
const interval = setInterval(() => {
set(new Date());
}, 1000);
return function stop() {
clearInterval(interval);
};
});
|
Derived stores
- 파생된 저장소라는 느낌으로, 하나 또는 그 이상의 다른 store를 기초로 하여 만들어지는 store를 말한다.
예시
1
2
3
4
| export const elapsed = derived(
time,
$time => Math.round(($time - start) / 1000)
);
|
Custom stores
- subscribe 메서드를 올바르게 구현하면 어떤 객체든 store가 될 수 있다.
- 앞선 예제에서 다수의 .svelte를 통해 로직을 구현했다면, 아래와 같은 방법으로 한번에 구현할수도 있다.
예제
App.svelte
1
2
3
4
5
6
7
8
9
| <script>
import { count } from './stores.js';
</script>
<h1>The count is {$count}</h1>
<button on:click={count.increment}>+</button>
<button on:click={count.decrement}>-</button>
<button on:click={count.reset}>reset</button>
|
store.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| import { writable } from 'svelte/store';
function createCount() {
const { subscribe, set, update } = writable(0);
return {
subscribe,
increment: () => update(n => n + 1),
decrement: () => update(n => n - 1),
reset: () => set(0)
};
}
export const count = createCount();
|
Store bindings
- writable store라면 binding이 가능하고, 값 변경 또한 가능하다.
예제
1
2
3
4
5
| <input bind:value={$name}>
<button on:click="{() => $name += '!'}">
Add exclamation mark!
</button>
|
참고 사이트
# Svelte 공식사이트 튜토리얼 - Bindings
댓글남기기