Custom store logic lets you create your own way to share and update data in Svelte apps. It helps keep your app organized and reactive.
Custom store logic in Svelte
import { writable } from 'svelte/store'; function createCustomStore(initialValue) { const { subscribe, set, update } = writable(initialValue); return { subscribe, customMethod: () => update(value => /* change value */ value), reset: () => set(initialValue) }; }
The writable function creates a basic store you can build on.
Return an object with subscribe and your custom methods.
import { writable } from 'svelte/store'; function createCounter() { const { subscribe, set, update } = writable(0); return { subscribe, increment: () => update(n => n + 1), decrement: () => update(n => n - 1), reset: () => set(0) }; } export const counter = createCounter();
import { writable } from 'svelte/store'; function createNameStore() { const { subscribe, set } = writable(''); return { subscribe, setName: (name) => set(name), clear: () => set('') }; } export const nameStore = createNameStore();
This Svelte component uses a custom counter store. Buttons call the store's methods to change the count. The count updates on screen automatically.
ARIA labels improve accessibility for screen readers. The count is announced live when it changes.
<script> import { writable } from 'svelte/store'; function createCounter() { const { subscribe, set, update } = writable(0); return { subscribe, increment: () => update(n => n + 1), decrement: () => update(n => n - 1), reset: () => set(0) }; } const counter = createCounter(); </script> <button on:click={() => counter.decrement()} aria-label="Decrease count">-</button> <span aria-live="polite" style="margin: 0 1rem;">{$counter}</span> <button on:click={() => counter.increment()} aria-label="Increase count">+</button> <button on:click={() => counter.reset()} aria-label="Reset count" style="margin-left: 1rem;">Reset</button>
Always return subscribe from your custom store so components can react to changes.
Use update to change the store value based on the current value.
Custom methods make your store easier to use and keep logic in one place.
Custom stores let you control how data is shared and changed in Svelte.
They use writable stores and add your own methods.
This keeps your app organized and reactive with simple code.
Practice
Solution
Step 1: Understand what a custom store does
A custom store extends the basic writable store by adding your own methods to control data updates and sharing.Step 2: Compare options with this understanding
Only "To add custom methods and control how data updates and shares" correctly describes this purpose. The other options misunderstand the role of custom stores: disabling reactivity, replacing the built-in writable store completely, or server-side only.Final Answer:
To add custom methods and control how data updates and shares -> Option BQuick Check:
Custom store purpose = Add custom methods [OK]
- Thinking custom stores replace writable stores entirely
- Believing custom stores disable reactivity
- Assuming custom stores only run on the server
Solution
Step 1: Check import and store creation
import { writable } from 'svelte/store'; function createStore() { const { subscribe, update } = writable(0); return { subscribe, increment: () => update(n => n + 1) }; } correctly importswritableand usesupdateto change the value.Step 2: Verify method usage
import { writable } from 'svelte/store'; function createStore() { const { subscribe, set } = writable(0); return { subscribe, increment: () => set(n => n + 1) }; } incorrectly usessetwith a function argument, which is invalid. import { readable } from 'svelte/store'; function createStore() { const { subscribe } = readable(0); return { subscribe, increment: () => {} }; } usesreadablewhich is read-only. import { store } from 'svelte/store'; function createStore() { return { subscribe: () => {}, increment: () => {} }; } imports a non-existentstore.Final Answer:
import { writable } from 'svelte/store'; function createStore() { const { subscribe, update } = writable(0); return { subscribe, increment: () => update(n => n + 1) }; } -> Option AQuick Check:
Correct syntax uses writable and update() [OK]
- Using set() with a function argument
- Using readable store when write access is needed
- Importing non-existent store types
counter.increment() twice?import { writable } from 'svelte/store';
function createCounter() {
const { subscribe, update } = writable(0);
return {
subscribe,
increment: () => update(n => n + 1)
};
}
const counter = createCounter();
counter.subscribe(value => console.log(value));
counter.increment();
counter.increment();Solution
Step 1: Understand subscription behavior
Subscribing logs the current value immediately, so 0 is logged first.Step 2: Trace increments and logs
Each increment increases the value by 1 and triggers the subscriber, logging 1 then 2.Final Answer:
0, 1, 2 -> Option AQuick Check:
Subscription logs initial and updates [OK]
- Ignoring initial subscription log
- Assuming increments log only final value
- Confusing update with set behavior
import { writable } from 'svelte/store';
function createTimer() {
const { subscribe, set } = writable(0);
let interval = null;
return {
subscribe,
start: () => {
interval = setInterval(() => set(n + 1), 1000);
},
stop: () => clearInterval(interval)
};
}Solution
Step 1: Check the setInterval callback
The callback usesset(n + 1)butnis not defined anywhere in scope.Step 2: Understand correct usage
To increment the value,updateshould be used or the current value tracked. Usingsetwith undefinedncauses an error.Final Answer:
Usingset(n + 1)without definingn-> Option CQuick Check:
Undefined variable in set() causes error [OK]
- Using set() with undefined variable
- Forgetting to clear intervals
- Confusing set and update methods
Solution
Step 1: Check method to add unique items
import { writable } from 'svelte/store'; function createList() { const { subscribe, update } = writable([]); return { subscribe, add: (item) => update(list => list.includes(item) ? list : [...list, item]) }; } usesupdateand checks if the item exists before adding, preventing duplicates.Step 2: Verify other options
import { writable } from 'svelte/store'; function createList() { const { subscribe, set } = writable([]); return { subscribe, add: (item) => set(list => list.includes(item) ? list : [...list, item]) }; } incorrectly usessetwith a function argument, which is invalid. import { readable } from 'svelte/store'; function createList() { const { subscribe } = readable([]); return { subscribe, add: (item) => {} }; } usesreadablewhich is read-only. import { writable } from 'svelte/store'; function createList() { const { subscribe, update } = writable([]); return { subscribe, add: (item) => update(list => [...list, item]) }; } adds items without checking duplicates.Final Answer:
Custom store with update() and duplicate check -> Option DQuick Check:
Use update() and check includes() for uniqueness [OK]
- Using set() with function argument
- Using readable store when write access needed
- Not checking for duplicates before adding
Ready to prove it?
Pass the test and this pattern moves unknown
