Bird
Raised Fist0
Svelteframework~20 mins

Common action patterns (click-outside, tooltip) in Svelte - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Svelte Action Mastery
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ component_behavior
intermediate
2:00remaining
What happens when you click outside a Svelte component using a click-outside action?

Consider a Svelte component that uses a clickOutside action to close a dropdown menu when clicking outside it.

What is the expected behavior when the user clicks outside the dropdown?

Svelte
<script>
  import { clickOutside } from './actions.js';
  let open = true;
  function close() {
    open = false;
  }
</script>

<div use:clickOutside={close}>
  {#if open}
    <p>Dropdown content</p>
  {/if}
</div>
AThe dropdown toggles open and closed every time you click anywhere on the page.
BThe dropdown closes immediately when clicking anywhere outside the div using the action.
CThe dropdown closes only when clicking inside the div, not outside.
DThe dropdown stays open even when clicking outside because the action only listens inside the div.
Attempts:
2 left
💡 Hint

Think about what a click-outside action is designed to detect.

📝 Syntax
intermediate
1:30remaining
Which Svelte action syntax correctly applies a tooltip with a message?

You want to add a tooltip action that shows a message when hovering over a button.

Which syntax correctly passes the message 'Hello!' to the tooltip action?

A<button use:tooltip={'Hello!'}>Hover me</button>
B<button use:tooltip="Hello!">Hover me</button>
C<button use:tooltip(Hello!)>Hover me</button>
D<button use:tooltip={Hello!}>Hover me</button>
Attempts:
2 left
💡 Hint

Remember how to pass string parameters to Svelte actions.

🔧 Debug
advanced
2:30remaining
Why does this click-outside action not close the menu when clicking outside?

Examine the following Svelte action code for click-outside. Why does the menu not close when clicking outside?

Svelte
export function clickOutside(node, callback) {
  const handleClick = event => {
    if (!node.contains(event.target)) {
      callback();
    }
  };
  document.addEventListener('click', handleClick);
  return {
    destroy() {
      document.removeEventListener('click', handleClick);
    }
  };
}

<script>
  import { clickOutside } from './actions.js';
  let open = true;
  function close() {
    open = false;
  }
</script>

<div use:clickOutside={close}>
  {#if open}
    <p>Menu content</p>
  {/if}
</div>
AThe callback is called but the component does not update because the callback is not reactive.
BThe event listener is never added because the action is missing the 'node' parameter.
CThe callback is never called because the event listener is attached to the wrong element.
DThe callback is called but the menu stays open because the 'open' variable is not updated inside the callback.
Attempts:
2 left
💡 Hint

Consider how Svelte reactivity works with functions called outside component scope.

❓ state_output
advanced
2:00remaining
What is the tooltip text shown after hovering over the button twice?

Given this Svelte component with a tooltip action that changes text on hover, what tooltip text is shown after the second hover?

Svelte
<script>
  import { tooltip } from './actions.js';
  let message = 'First';
  function update() {
    message = 'Second';
  }
</script>

<button use:tooltip={message} on:mouseenter={update}>Hover me</button>
AThe tooltip shows 'First' on the first hover and 'Second' on the second hover.
BThe tooltip shows 'Second' on both hovers.
CThe tooltip shows 'First' on both hovers.
DThe tooltip shows 'Second' on the first hover and 'First' on the second hover.
Attempts:
2 left
💡 Hint

Think about when the action receives updated parameters.

🧠 Conceptual
expert
3:00remaining
Why is it important to remove event listeners in Svelte actions like click-outside?

In a Svelte action that adds a global click event listener to detect clicks outside an element, why must you remove the listener when the element is destroyed?

ABecause event listeners cannot be removed once added, so this is a trick question.
BBecause Svelte automatically removes all event listeners, so manual removal is redundant.
CTo make the action run faster by disabling the listener temporarily.
DTo prevent memory leaks and avoid multiple listeners stacking up causing unexpected behavior.
Attempts:
2 left
💡 Hint

Think about what happens if event listeners accumulate over time.

Practice

(1/5)
1. What is the main purpose of the click-outside action pattern in Svelte?
easy
A. To toggle a checkbox state on click
B. To open a tooltip when hovering over an element
C. To close a menu or popup when the user clicks outside of it
D. To fetch data from an API when clicking a button

Solution

  1. Step 1: Understand the click-outside pattern

    This pattern detects clicks outside a specific element to trigger an action, usually closing menus or popups.
  2. Step 2: Match purpose with options

    To close a menu or popup when the user clicks outside of it correctly describes closing menus/popups on outside clicks, while others describe unrelated behaviors.
  3. Final Answer:

    To close a menu or popup when the user clicks outside of it -> Option C
  4. Quick Check:

    click-outside closes menus on outside click = A [OK]
Hint: Click-outside closes popups when clicking outside them [OK]
Common Mistakes:
  • Confusing click-outside with tooltip behavior
  • Thinking it toggles element visibility on inside clicks
  • Assuming it triggers API calls
2. Which of the following is the correct way to use a clickOutside action in a Svelte component?
easy
A.
B.
C.
D.

Solution

  1. Step 1: Recall Svelte action syntax

    Svelte actions are used with the use: directive followed by the action name and optional parameters.
  2. Step 2: Identify correct syntax

    uses use:clickOutside, which is the correct way to apply an action. Other options misuse event or binding syntax.
  3. Final Answer:

    <div use:clickOutside={handleClickOutside}></div> -> Option D
  4. Quick Check:

    Actions use 'use:' directive = C [OK]
Hint: Use actions with 'use:' prefix in Svelte [OK]
Common Mistakes:
  • Using event syntax 'on:' instead of 'use:' for actions
  • Trying to bind actions with 'bind:'
  • Passing actions as plain attributes
3. Given this Svelte code snippet using a tooltip action:
  <button use:tooltip={{ text: 'Save changes' }}>Save</button>

What will happen when the user hovers over the button?
medium
A. A tooltip with the text 'Save changes' appears near the button
B. The button text changes to 'Save changes'
C. Nothing happens because the syntax is incorrect
D. The button is disabled

Solution

  1. Step 1: Understand tooltip action usage

    The tooltip action shows a small info box with the provided text when hovering or focusing the element.
  2. Step 2: Analyze the code behavior

    The button uses use:tooltip with text 'Save changes', so hovering triggers the tooltip display near the button.
  3. Final Answer:

    A tooltip with the text 'Save changes' appears near the button -> Option A
  4. Quick Check:

    Tooltip shows text on hover = A [OK]
Hint: Tooltip shows text on hover or focus [OK]
Common Mistakes:
  • Thinking tooltip changes button text
  • Assuming tooltip disables the button
  • Believing the syntax is invalid
4. Consider this Svelte snippet using a clickOutside action:
  <script>
    let open = true;
    function close() { open = false; }
  </script>
  <div use:clickOutside={close} >
    {#if open}
      <p>Menu content</p>
    {/if}
  </div>

Why might the menu not close when clicking outside?
medium
A. The clickOutside action is not imported or defined
B. The open variable is not reactive
C. The close function does not set open to true
D. The menu content is inside the div with the action

Solution

  1. Step 1: Check action usage requirements

    For use:clickOutside to work, the action must be imported or defined in the component.
  2. Step 2: Identify missing import or definition

    The snippet does not show any import or definition of clickOutside, so the action won't run, preventing menu close.
  3. Final Answer:

    The clickOutside action is not imported or defined -> Option A
  4. Quick Check:

    Missing action import = B [OK]
Hint: Always import or define actions before use [OK]
Common Mistakes:
  • Assuming variable reactivity is the issue
  • Confusing function logic with action setup
  • Ignoring the need to import or define actions
5. You want to create a tooltip that only appears when a button is focused or hovered, and disappears when clicking outside or losing focus. Which combination of Svelte patterns should you use?
hard
A. Use only CSS :hover and :focus styles without any actions
B. Use a tooltip action on the button and a clickOutside action on the tooltip container to hide it
C. Use a tooltip action on the button and toggle visibility with a manual click event
D. Use only a clickOutside action on the button to show and hide the tooltip

Solution

  1. Step 1: Understand tooltip and clickOutside roles

    The tooltip action shows info on hover/focus. The clickOutside action detects clicks outside to hide elements like tooltips.
  2. Step 2: Combine actions for desired behavior

    Using tooltip on the button shows the tooltip on hover/focus. Using clickOutside on the tooltip container hides it when clicking outside, ensuring it disappears properly.
  3. Final Answer:

    Use a tooltip action on the button and a clickOutside action on the tooltip container to hide it -> Option B
  4. Quick Check:

    Tooltip + clickOutside combo controls show/hide = D [OK]
Hint: Combine tooltip and clickOutside for show/hide control [OK]
Common Mistakes:
  • Using only clickOutside to show tooltip
  • Relying solely on CSS without accessibility
  • Manually toggling tooltip without outside click detection
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