📖 Scenario: You are building a simple Svelte app that tracks the number of items in a shopping cart and calculates the total price automatically.
🎯 Goal: Create a Svelte app that uses a writable store for the cart items and a derived store to calculate the total price. The total price updates automatically when the cart changes.
📋 What You'll Learn
Create a writable store called cart with initial items and prices
Create a derived store called totalPrice that calculates the sum of item prices in cart
Use the cart and totalPrice stores in a Svelte component to display the items and total
Update the total price automatically when cart changes
💡 Why This Matters
🌍 Real World
Derived stores help keep related data in sync automatically, like calculating totals or filtered lists in shopping carts or dashboards.
💼 Career
Understanding derived stores is key for building reactive, maintainable Svelte apps that update UI automatically when data changes.
Progress0 / 4 steps
1
Create the initial cart store
Create a writable store called cart with these exact items: an array of objects with { id: 1, name: 'Apple', price: 1.5 } and { id: 2, name: 'Banana', price: 0.9 }.
Svelte
Hint
Use writable from svelte/store and assign the array with the two objects to cart.
2
Create a derived store for total price
Import derived from svelte/store and create a derived store called totalPrice that depends on cart and calculates the sum of all price values in cart.
Svelte
Hint
Use derived(cart, $cart => ...) and inside use reduce to sum prices.
3
Display cart items and totalPrice in a Svelte component
In a Svelte component, import cart and totalPrice stores. Use {$cart} to loop over items and show each name and price. Below, show the total price using {$totalPrice}.
Svelte
Hint
Use {#each $cart as item} to loop and {$totalPrice} to show total.
4
Add a button to add a new item and update total automatically
Add a button that, when clicked, adds a new item { id: 3, name: 'Orange', price: 1.2 } to the cart store using its update method. The totalPrice should update automatically.
Svelte
Hint
Use cart.update to add the new item inside the addOrange function and bind it to the button's on:click.
Practice
(1/5)
1. What is the main purpose of a derived store in Svelte?
easy
A. To create a new store that automatically updates based on other stores
B. To store static values that never change
C. To replace writable stores with simpler syntax
D. To handle user input events directly
Solution
Step 1: Understand what derived stores do
Derived stores create new values that depend on one or more other stores.
Step 2: Identify the main purpose
They automatically update when the original stores change, reflecting combined or transformed data.
Final Answer:
To create a new store that automatically updates based on other stores -> Option A
Quick Check:
Derived stores update automatically = B [OK]
Hint: Derived stores react to other stores' changes automatically [OK]
Common Mistakes:
Thinking derived stores hold static values
Confusing derived with writable stores
Believing derived stores handle events
2. Which of the following is the correct syntax to create a derived store from two stores a and b?
easy
A. const c = derived(a, b, (a, b) => a + b);
B. const c = derived([a, b], ([$a, $b]) => $a + $b);
C. const c = derived(a, (a, b) => a + b);
D. const c = derived([a, b], (a, b) => a + b);
Solution
Step 1: Recall derived store syntax
Derived stores take an array of stores and a callback with destructured values.
Step 2: Match correct syntax
The callback receives an array destructured as [$a, $b] to access current values.
Final Answer:
const c = derived([a, b], ([$a, $b]) => $a + $b); -> Option B
Quick Check:
Array + destructured callback = A [OK]
Hint: Use array and destructure values in derived callback [OK]
Common Mistakes:
Passing stores as separate arguments instead of array
Not destructuring the values in callback
Using wrong parameter order in callback
3. Given the following code, what will be logged to the console after a.set(3) is called?
import { writable, derived } from 'svelte/store';
const a = writable(1);
const b = writable(2);
const sum = derived([a, b], ([$a, $b]) => $a + $b);
sum.subscribe(value => console.log(value));
a.set(3);
medium
A. 1, 2, 3
B. 3, 2, 5
C. 3, 5, 5
D. 3, 5
Solution
Step 1: Understand initial subscription output
When subscribing, the current derived value is logged immediately: 1 + 2 = 3.
Step 2: Update store a to 3 and check derived value
After a.set(3), derived recalculates: 3 + 2 = 5, which is logged.
Final Answer:
3, 5 -> Option D
Quick Check:
Initial + updated sum = 3, 5 [OK]
Hint: Derived logs initial and updated values on subscription [OK]
Common Mistakes:
Expecting multiple logs before subscription
Confusing store values with derived values
Missing initial subscription log
4. What is wrong with this derived store code?
import { writable, derived } from 'svelte/store';
const count = writable(0);
const double = derived(count, value => value * 2, 0);
medium
A. There is no error; this code is correct
B. The callback function should destructure the value as an array
C. The derived store must be created from an array of stores, not a single store
D. The third argument (0) is invalid for derived stores
Solution
Step 1: Check derived store syntax for single store
Derived stores can take a single store and a callback with the value directly.
Step 2: Understand the third argument
The third argument is the initial value before the first store value arrives, which is valid.
Final Answer:
There is no error; this code is correct -> Option A
Quick Check:
Single store + initial value allowed = A [OK]
Hint: Single store derived can have initial value as third argument [OK]
Common Mistakes:
Thinking callback must destructure array always
Believing derived needs array even for one store
Assuming third argument is invalid
5. You have two writable stores: firstName and lastName. You want to create a derived store fullName that updates automatically and trims whitespace from both names before combining. Which code correctly implements this?