Bird
Raised Fist0
Svelteframework~8 mins

Action update and destroy in Svelte - Performance & Optimization

Choose your learning style10 modes available
Performance: Action update and destroy
MEDIUM IMPACT
This concept affects how efficiently DOM elements are updated and cleaned up, impacting interaction responsiveness and memory usage.
Managing DOM element behavior with Svelte actions that update and clean up
Svelte
function myAction(node, params) {
  function handleClick() {
    console.log('clicked with', params);
  }
  node.addEventListener('click', handleClick);
  return {
    update(newParams) {
      params = newParams;
    },
    destroy() {
      node.removeEventListener('click', handleClick);
    }
  };
}
Reuses the same event listener and cleans it up on destroy, preventing buildup and memory leaks.
📈 Performance GainSingle event listener per element, no memory leaks, better input responsiveness.
Managing DOM element behavior with Svelte actions that update and clean up
Svelte
function myAction(node) {
  node.addEventListener('click', () => console.log('clicked'));
  return {
    update(newParams) {
      // no cleanup of old listeners
      node.addEventListener('click', () => console.log('clicked with', newParams));
    },
    // no destroy method
  };
}
Adding event listeners on every update without removing old ones causes multiple handlers and memory leaks.
📉 Performance CostTriggers multiple event listeners per update, increasing memory use and slowing interaction responsiveness.
Performance Comparison
PatternDOM OperationsReflowsPaint CostVerdict
Adding new listeners on every updateMultiple event listeners addedNo direct reflows but slows event handlingMinimal paint cost[X] Bad
Single listener with update and destroy cleanupOne event listener reusedNo reflows triggeredMinimal paint cost[OK] Good
Rendering Pipeline
Svelte actions run during DOM element creation and updates. The update method modifies behavior without re-creating listeners, and destroy cleans up to avoid leaks.
→DOM Operations
→Layout
→Composite
⚠️ BottleneckExcessive event listeners cause slower event handling and increased memory pressure.
Core Web Vital Affected
INP
This concept affects how efficiently DOM elements are updated and cleaned up, impacting interaction responsiveness and memory usage.
Optimization Tips
1Always remove event listeners in the destroy method to prevent memory leaks.
2Avoid adding new event listeners inside update without cleanup.
3Reuse event listeners and update parameters instead of recreating handlers.
Performance Quiz - 3 Questions
Test your performance knowledge
What is the main performance risk of adding event listeners inside the update method without removing old ones?
AFaster rendering because more listeners improve responsiveness
BNo impact because event listeners do not affect performance
CMemory leaks and slower input responsiveness due to multiple listeners
DImproved layout stability
DevTools: Performance
How to check: Record a performance profile while interacting with the element. Look for multiple event listeners or memory growth over time.
What to look for: Check the Event Listeners tab in Elements panel for duplicates and the Memory panel for leaks.

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

  1. 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.
  2. Step 2: Differentiate from other lifecycle functions

    update handles parameter changes, and initialization happens in the main action function, not in destroy.
  3. Final Answer:

    To clean up resources when the element is removed from the DOM -> Option C
  4. 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?
easy
A. return [ update(params) {}, destroy() {} ];
B. return { update: (params) => {}, destroy: () => {} };
C. return function update(params) {}, function destroy() {};
D. return { onUpdate: () => {}, onDestroy: () => {} };

Solution

  1. Step 1: Recall the Svelte action return structure

    A Svelte action returns an object with optional update and destroy methods as properties.
  2. 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.
  3. Final Answer:

    return { update: (params) => {}, destroy: () => {} }; -> Option B
  4. Quick Check:

    Return object with update and destroy keys = B [OK]
Hint: Return an object with update and destroy keys [OK]
Common Mistakes:
  • Using arrays instead of objects
  • Wrong function syntax inside return
  • Using incorrect property names like onUpdate
3. Given this Svelte action code:
function highlight(node, color) {
  node.style.backgroundColor = color;
  return {
    update(newColor) {
      node.style.backgroundColor = newColor;
    },
    destroy() {
      node.style.backgroundColor = '';
    }
  };
}

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

  1. 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.
  2. Step 2: Trace the parameter change effect

    Changing from 'yellow' to 'lightblue' triggers update, which sets node.style.backgroundColor to 'lightblue'.
  3. Final Answer:

    The background color changes to 'lightblue' -> Option A
  4. 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

  1. Step 1: Analyze the event listener management

    The action adds a click listener but does not clean it up when the element is removed.
  2. Step 2: Check lifecycle methods usage

    There is no destroy method to remove the listener on element removal, which can cause memory leaks.
  3. Final Answer:

    The destroy function is missing to remove the event listener on element removal -> Option D
  4. 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?
hard
A. function colorText(node, color) { node.style.color = color; return { update(newColor) { node.style.color = newColor; }, destroy() { console.log('Element removed'); } }; }
B. function colorText(node, color) { node.style.color = color; return { update() { console.log('Color updated'); }, destroy() { node.style.color = ''; } }; }
C. function colorText(node, color) { node.style.color = color; return { update(newColor) { node.style.backgroundColor = newColor; }, destroy() { console.log('Element removed'); } }; }
D. function colorText(node, color) { node.style.color = color; return { update(newColor) { node.style.color = newColor; } }; }

Solution

  1. Step 1: Check update function correctness

    The update method should take a newColor parameter and set node.style.color = newColor.
  2. Step 2: Verify destroy function behavior

    The destroy method should console.log('Element removed').
  3. Final Answer:

    function colorText(node, color) { node.style.color = color; return { update(newColor) { node.style.color = newColor; }, destroy() { console.log('Element removed'); } }; } -> Option A
  4. Quick Check:

    Update changes color, destroy logs message = A [OK]
Hint: Update changes style, destroy cleans or logs [OK]
Common Mistakes:
  • Updating wrong style property
  • Missing destroy method
  • Destroy resets style instead of logging
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard