📖 Scenario: You are building a simple Svelte app that changes the background color of a box when you hover over it. You want to use a Svelte action that updates the color dynamically and cleans up when the box is removed.
🎯 Goal: Create a Svelte action called hoverColor that changes the background color of an element on mouse enter and resets it on mouse leave. The action should support updating the color dynamically and clean up event listeners when the element is removed.
📋 What You'll Learn
Create a Svelte action function named hoverColor that accepts a node and a color parameter.
Add event listeners for mouseenter and mouseleave inside the action.
Implement the update method to change the color dynamically when the parameter changes.
Implement the destroy method to remove event listeners when the element is removed.
Use the hoverColor action on a <div> with an initial color.
💡 Why This Matters
🌍 Real World
Custom Svelte actions help you add reusable interactive behaviors to elements, like hover effects, tooltips, or drag-and-drop, improving user experience.
💼 Career
Understanding Svelte actions with update and destroy methods is important for building maintainable and efficient Svelte applications in professional frontend development.
Progress0 / 4 steps
1
Create the hoverColor action function
Create a Svelte action function called hoverColor that takes node and color as parameters. Inside, add event listeners for mouseenter and mouseleave that change the node's background color to color on mouse enter and reset it to '' on mouse leave.
Svelte
Hint
Remember to define onMouseEnter and onMouseLeave functions inside the action and add event listeners to the node.
2
Add an update method to change the color dynamically
Inside the hoverColor action, add an update method that takes a new color parameter and updates the internal color variable so the hover color changes dynamically.
Svelte
Hint
The update method receives the new parameter and should assign it to the color variable.
3
Add a destroy method to clean up event listeners
Add a destroy method inside the hoverColor action that removes the mouseenter and mouseleave event listeners from the node.
Svelte
Hint
The destroy method should remove the event listeners added earlier to avoid memory leaks.
4
Use the hoverColor action in a Svelte component
In a Svelte component, create a <div> with the text Hover me! and apply the hoverColor action with the initial color 'lightblue'.
Svelte
Hint
Use the Svelte use: directive to apply the hoverColor action to the <div>.
Practice
(1/5)
1. What is the main purpose of the destroy function in a Svelte action?
easy
A. To update the element's attributes when parameters change
B. To initialize the action when the element is created
C. To clean up resources when the element is removed from the DOM
D. To render the element on the page
Solution
Step 1: Understand the role of destroy in Svelte actions
The destroy function is called when the element using the action is removed from the DOM to clean up any side effects or event listeners.
Step 2: Differentiate from other lifecycle functions
update handles parameter changes, and initialization happens in the main action function, not in destroy.
Final Answer:
To clean up resources when the element is removed from the DOM -> Option C
Quick Check:
destroy cleans up on removal = A [OK]
Hint: Destroy cleans up when element leaves the page [OK]
Common Mistakes:
Confusing destroy with update
Thinking destroy initializes the action
Assuming destroy runs on parameter change
2. Which of the following is the correct syntax for returning an update and destroy function from a Svelte action?
A Svelte action returns an object with optional update and destroy methods as properties.
Step 2: Match the correct syntax
return { update: (params) => {}, destroy: () => {} }; correctly returns an object with update and destroy as arrow functions. Other options use invalid syntax or wrong property names.
What happens when the action's parameter changes from 'yellow' to 'lightblue'?
medium
A. The background color changes to 'lightblue'
B. The background color resets to empty string
C. Nothing changes because update is not called
D. The action throws an error
Solution
Step 1: Understand the update function role
The update method runs when the action's parameter changes, here it sets the background color to the new value.
Step 2: Trace the parameter change effect
Changing from 'yellow' to 'lightblue' triggers update, which sets node.style.backgroundColor to 'lightblue'.
Final Answer:
The background color changes to 'lightblue' -> Option A
Quick Check:
Parameter change triggers update = D [OK]
Hint: Update runs on parameter change to update styles [OK]
Common Mistakes:
Thinking destroy runs on parameter change
Assuming update does nothing
Confusing initial setup with update
4. Identify the error in this Svelte action code:
function logClicks(node) {
function handleClick() {
console.log('Clicked');
}
node.addEventListener('click', handleClick);
return {
update() {
node.removeEventListener('click', handleClick);
}
};
}
medium
A. The update function incorrectly removes the event listener on every parameter change
B. The handleClick function is not defined properly
C. The event listener is added multiple times causing duplicates
D. The destroy function is missing to remove the event listener on element removal
Solution
Step 1: Analyze the event listener management
The action adds a click listener but does not clean it up when the element is removed.
Step 2: Check lifecycle methods usage
There is no destroy method to remove the listener on element removal, which can cause memory leaks.
Final Answer:
The destroy function is missing to remove the event listener on element removal -> Option D
Quick Check:
Missing destroy cleanup = C [OK]
Hint: Always clean event listeners in destroy [OK]
Common Mistakes:
Removing listeners in update instead of destroy
Not removing listeners at all
Confusing update with destroy lifecycle
5. You want to create a Svelte action that changes an element's text color based on a parameter and logs a message when the element is removed. Which code correctly implements update and destroy?