Bird
Raised Fist0
Svelteframework~5 mins

Action update and destroy in Svelte

Choose your learning style10 modes available
Introduction

Actions in Svelte let you add behavior to HTML elements easily. The update and destroy functions help manage changes and cleanup when the element or data changes.

When you want to run code every time the element's parameters change.
When you need to clean up event listeners or timers when the element is removed.
When you want to keep external libraries or plugins in sync with your element.
When you want to manage resources efficiently and avoid memory leaks.
Syntax
Svelte
function myAction(node, parameters) {
  // setup code here

  return {
    update(newParameters) {
      // code to run when parameters change
    },
    destroy() {
      // cleanup code here
    }
  };
}

The node is the HTML element the action is applied to.

The update function runs when the parameters passed to the action change.

Examples
This action changes the background color of an element and updates it when the color changes. It also resets the color when the element is removed.
Svelte
function highlight(node, color) {
  node.style.backgroundColor = color;

  return {
    update(newColor) {
      node.style.backgroundColor = newColor;
    },
    destroy() {
      node.style.backgroundColor = '';
    }
  };
}
This action logs clicks on the element and cleans up the event listener when the element is removed.
Svelte
function logClicks(node) {
  function handleClick() {
    console.log('Element clicked!');
  }
  node.addEventListener('click', handleClick);

  return {
    destroy() {
      node.removeEventListener('click', handleClick);
    }
  };
}
Sample Program

This Svelte component uses an action called colorAction to change the text color of a paragraph. When you click the button, the color toggles between blue and red. The update function changes the color when currentColor changes. The destroy function resets the color if the paragraph is removed.

Svelte
<script>
  function colorAction(node, color) {
    node.style.color = color;

    return {
      update(newColor) {
        node.style.color = newColor;
      },
      destroy() {
        node.style.color = '';
      }
    };
  }

  let currentColor = 'blue';

  function changeColor() {
    currentColor = currentColor === 'blue' ? 'red' : 'blue';
  }
</script>

<button on:click={changeColor}>Toggle Color</button>
<p use:colorAction={currentColor}>This text changes color when you click the button.</p>
OutputSuccess
Important Notes

Always clean up in destroy to avoid memory leaks.

The update function is optional but useful when parameters change.

Actions can be reused on many elements with different parameters.

Summary

Actions add behavior to elements with setup, update, and cleanup.

update runs when parameters change.

destroy runs when the element is removed to clean up.

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