Lesson 4
Using the Context API in Svelte
Introduction to Context API

In this lesson, we’ll explore Svelte’s Context API, a powerful tool for sharing data across components without the need to pass props through every level of your component tree. This is especially useful in larger applications where components are deeply nested, and passing data via props becomes cumbersome.

So far in this course, you’ve learned how to handle user interactions, pass data with props, use callback functions for parent-child communication, and implement two-way binding. These techniques are essential for managing data flow in Svelte applications. However, when dealing with deeply nested components, prop drilling (passing props through multiple layers) can make your code harder to maintain.

The Context API solves this problem by allowing you to share data globally within a specific part of your component tree. Think of it as a shared workspace where components can access the same data without explicitly passing it down. For example, you might use the Context API to share a theme (like "dark" or "light") across multiple components without manually passing the theme prop to each one.

In this lesson, you’ll learn how to use the Context API to share and access data efficiently. Let’s dive in!

Setting Up Context

To share data using the Context API, you’ll use the setContext function. This function allows you to define a key-value pair that can be accessed by any child component within the same tree.

Here’s an example of how to set up context in a parent component:

svelte
1<!-- Parent.svelte --> 2<script> 3 import { setContext } from 'svelte'; 4 setContext("theme", "dark"); 5</script> 6 7{@render children()}

In this example, we’re setting a context with the key "theme" and the value "dark". Any child component within this tree can now access the "theme" context.

Accessing Context

To access the shared context in a child component, you’ll use the getContext function. This function retrieves the value associated with a specific key from the context.

Here’s how you can access the "theme" context in a child component:

svelte
1<!-- Child.svelte --> 2<script> 3 import { getContext } from 'svelte'; 4 let theme = getContext("theme"); 5</script> 6 7<p>Current Theme: {theme}</p>

In this example, the getContext("theme") function retrieves the value "dark" that was set in the parent component. The theme variable is then used to display the current theme in a paragraph element.

Checking for Context Availability

Sometimes, a component may not always be within a tree where a certain context exists. To avoid errors when accessing context, you can use the hasContext function.

svelte
1<script> 2 import { getContext, hasContext } from 'svelte'; 3 4 let theme; 5 if (hasContext("theme")) { 6 theme = getContext("theme"); 7 } else { 8 theme = "default"; 9 } 10</script> 11 12<p>Current Theme: {theme}</p>

This ensures that if the context is unavailable, a default fallback value is used.

Using Reactive Context for Global State

By default, context values in Svelte are not reactive, meaning that if a value inside the context object changes, child components that access this context will not automatically update. To make context reactive, you need to use $state objects. This ensures that changes in the parent component reflect dynamically in child components.

When working with reactive data that updates dynamically, you can use setContext and getContext with Svelte’s $state for efficient state management.

Parent Component (`AuthProvider.svelte`)
svelte
1<script> 2 import { setContext } from 'svelte'; 3 4 let user = $state({ name: "Guest", role: "visitor" }); 5 6 function login() { 7 user.name = "Jane Doe"; 8 user.role = "editor"; 9 } 10 11 function logout() { 12 user.name = "Guest"; 13 user.role = "visitor"; 14 } 15 16 setContext("auth", { user, login, logout }); 17</script> 18 19<button onclick={login}>Login</button> 20<button onclick={logout}>Logout</button> 21 22{@render children()}
Child Component (`UserStatus.svelte`)
svelte
1<script> 2 import { getContext } from 'svelte'; 3 4 const { user } = getContext("auth"); 5</script> 6 7<p>Welcome, {user.name}! Your role is {user.role}.</p>
App Component (`App.svelte`)
svelte
1<script> 2 import AuthProvider from './AuthProvider.svelte'; 3 import UserStatus from './UserStatus.svelte'; 4</script> 5 6<AuthProvider> 7 <UserStatus /> 8</AuthProvider>
Expected Behavior
  • Clicking the Login button updates the context, displaying "Welcome, Jane Doe! Your role is editor."
  • Clicking the Logout button resets the user, showing "You are not logged in."
Summary and Next Steps

In this lesson, you learned how to use Svelte’s Context API to share data across components without prop drilling. You explored how to:

  • Set up context using setContext.
  • Access context with getContext.
  • Check for context availability using hasContext.
  • Use reactive context with $state for managing global state dynamically.

This technique is particularly useful for managing global or shared state in larger applications.

To reinforce what you’ve learned, you’ll now move on to practice exercises where you’ll apply the Context API in different scenarios. These exercises will help you gain confidence in using this powerful feature effectively.

Great job so far! You’re making excellent progress in mastering component communication in Svelte. Keep up the good work!

Enjoy this lesson? Now it's time to practice with Cosmo!
Practice is how you turn knowledge into actual skills.