Bird
Raised Fist0
Svelteframework~5 mins

Action with event dispatching in Svelte

Choose your learning style10 modes available
Introduction

Actions let you add custom behavior to HTML elements easily. Dispatching events from actions helps communicate changes back to the component.

You want to add reusable behavior to an element, like focusing or dragging.
You need to notify the component when something happens inside the action.
You want to keep logic outside the component but still react to it.
You want to create custom events from native DOM events.
You want to clean up event listeners automatically when the element is removed.
Syntax
Svelte
function myAction(node) {
  const handle = () => {
    node.dispatchEvent(new CustomEvent('myEvent', { detail: { info: 'hello' } }));
  };

  node.addEventListener('click', handle);

  return {
    destroy() {
      node.removeEventListener('click', handle);
    }
  };
}

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

Use node.dispatchEvent to send custom events from the action.

Examples
This action focuses the element when it is created.
Svelte
function focusAction(node) {
  node.focus();
  return {
    destroy() {
      // cleanup if needed
    }
  };
}
This action dispatches a 'notify' event when the element is clicked.
Svelte
function clickNotify(node) {
  const onClick = () => {
    node.dispatchEvent(new CustomEvent('notify', { detail: { clicked: true } }));
  };
  node.addEventListener('click', onClick);
  return {
    destroy() {
      node.removeEventListener('click', onClick);
    }
  };
}
Sample Program

This Svelte component uses an action called highlight that toggles a yellow background on the button when clicked. It also dispatches a custom event toggled with the current state. The component listens to this event and updates a message below the button.

Svelte
<script>
  function highlight(node) {
    const handleClick = () => {
      node.classList.toggle('highlighted');
      node.dispatchEvent(new CustomEvent('toggled', { detail: { highlighted: node.classList.contains('highlighted') } }));
    };

    node.addEventListener('click', handleClick);

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

  let message = 'Not highlighted';
  function onToggled(event) {
    message = event.detail.highlighted ? 'Highlighted!' : 'Not highlighted';
  }
</script>

<style>
  .highlighted {
    background-color: yellow;
  }
  button {
    padding: 0.5rem 1rem;
    font-size: 1rem;
  }
</style>

<button use:highlight on:toggled={onToggled} aria-pressed={message === 'Highlighted!'}>
  Click me
</button>
<p>{message}</p>
OutputSuccess
Important Notes

Always remove event listeners in the destroy method to avoid memory leaks.

Custom events can carry data in the detail property.

Use semantic HTML and ARIA attributes for accessibility, like aria-pressed on toggle buttons.

Summary

Actions add reusable behavior to elements.

Dispatch custom events from actions to communicate with components.

Clean up event listeners in the destroy method.

Practice

(1/5)
1. What is the main purpose of an action in Svelte?
easy
A. To create new components
B. To add reusable behavior to HTML elements
C. To style elements with CSS
D. To manage global state

Solution

  1. Step 1: Understand what actions do

    Actions in Svelte are functions that add behavior to elements, like event listeners or animations.
  2. Step 2: Compare options

    Only To add reusable behavior to HTML elements correctly describes adding reusable behavior to elements, while others describe unrelated tasks.
  3. Final Answer:

    To add reusable behavior to HTML elements -> Option B
  4. Quick Check:

    Actions = reusable element behavior [OK]
Hint: Actions add behavior to elements, not create components [OK]
Common Mistakes:
  • Confusing actions with components
  • Thinking actions manage styles
  • Assuming actions handle global state
2. Which of the following is the correct way to dispatch a custom event named notify from a Svelte action?
easy
A. new Event('notify').dispatch(node)
B. dispatch('notify')
C. dispatchEvent('notify')
D. node.dispatchEvent(new CustomEvent('notify'))

Solution

  1. Step 1: Recall how to dispatch events in Svelte actions

    Custom events are dispatched using node.dispatchEvent(new CustomEvent('eventName')).
  2. Step 2: Check each option

    node.dispatchEvent(new CustomEvent('notify')) matches the correct syntax. Others are either missing new CustomEvent or use invalid syntax.
  3. Final Answer:

    node.dispatchEvent(new CustomEvent('notify')) -> Option D
  4. Quick Check:

    Dispatch custom event = node.dispatchEvent(new CustomEvent()) [OK]
Hint: Use node.dispatchEvent with new CustomEvent('name') [OK]
Common Mistakes:
  • Omitting 'new CustomEvent'
  • Calling dispatchEvent without node
  • Using incorrect method names
3. Given this Svelte action code, what will be logged when the button is clicked?
function clickAction(node) {
  const handleClick = () => {
    node.dispatchEvent(new CustomEvent('customClick', { detail: 'clicked' }));
  };
  node.addEventListener('click', handleClick);
  return {
    destroy() {
      node.removeEventListener('click', handleClick);
    }
  };
}
<button use:clickAction on:customClick={e => console.log(e.detail)}>Click me</button>
medium
A. 'clicked' will be logged to the console
B. Nothing will be logged
C. An error will occur because 'customClick' is invalid
D. 'click' will be logged instead of 'clicked'

Solution

  1. Step 1: Understand the action's event dispatch

    The action dispatches a 'customClick' event with detail 'clicked' when the button is clicked.
  2. Step 2: Check the event listener on the button

    The button listens for 'customClick' and logs the event's detail, which is 'clicked'.
  3. Final Answer:

    'clicked' will be logged to the console -> Option A
  4. Quick Check:

    Custom event detail logged = 'clicked' [OK]
Hint: Custom event detail is logged on event listener [OK]
Common Mistakes:
  • Expecting default 'click' event detail
  • Thinking event name must be 'click'
  • Ignoring event detail property
4. Identify the error in this Svelte action code that dispatches a custom event:
function myAction(node) {
  const onClick = () => {
    node.dispatchEvent(CustomEvent('myEvent'));
  };
  node.addEventListener('click', onClick);
  return {
    destroy() {
      node.removeEventListener('click', onClick);
    }
  };
}
medium
A. destroy method is missing
B. Event listener is added to the wrong node
C. Missing 'new' keyword before CustomEvent
D. Custom event name must be lowercase

Solution

  1. Step 1: Check how CustomEvent is created

    The code calls CustomEvent('myEvent') without the new keyword, which is required to create an event instance.
  2. Step 2: Verify other parts

    Event listener is correctly added and removed; destroy method exists; event names can be uppercase.
  3. Final Answer:

    Missing 'new' keyword before CustomEvent -> Option C
  4. Quick Check:

    CustomEvent requires 'new' keyword [OK]
Hint: Always use 'new CustomEvent' to create events [OK]
Common Mistakes:
  • Forgetting 'new' before CustomEvent
  • Removing event listener incorrectly
  • Assuming event names must be lowercase
5. You want to create a Svelte action that dispatches a custom event resize whenever the window is resized. Which of the following is the best way to implement this action?
hard
A. Add a window 'resize' listener inside the action, dispatch 'resize' event from the node, and clean up in destroy
B. Add a 'resize' listener to the node element directly and dispatch event from node
C. Dispatch 'resize' event once when the action is initialized
D. Use a setInterval to check window size and dispatch event repeatedly

Solution

  1. Step 1: Understand event source and dispatch

    Window resize events come from the window object, so the listener must be added to window, not the node.
  2. Step 2: Implement dispatch and cleanup

    The action should dispatch a custom 'resize' event from the node when window resizes, and remove the listener in destroy to avoid leaks.
  3. Final Answer:

    Add a window 'resize' listener inside the action, dispatch 'resize' event from the node, and clean up in destroy -> Option A
  4. Quick Check:

    Listen on window, dispatch from node, cleanup in destroy [OK]
Hint: Listen on window, dispatch from node, cleanup in destroy [OK]
Common Mistakes:
  • Adding listener to node instead of window
  • Not cleaning up event listener
  • Dispatching event only once
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