Context allows components to access values owned by parent components without passing them down as props (potentially through many layers of intermediate components, known as 'prop-drilling'). By creating a `[get, set]` pair of functions with `createContext`, you can set the context in a parent component and get it in a child component: ```svelte ``` ```svelte {@render children()} ``` ```svelte

hello {user.name}, inside Child.svelte

``` ```ts /// file: context.ts import { createContext } from 'svelte'; interface User { name: string; } export const [getUserContext, setUserContext] = createContext(); ``` > [!NOTE] `createContext` was added in version 5.40. If you are using an earlier version of Svelte, you must use `setContext` and `getContext` instead. This is particularly useful when `Parent.svelte` is not directly aware of `Child.svelte`, but instead renders it as part of a `children` [snippet](snippet) as shown above. ## `setContext` and `getContext` As an alternative to `createContext`, you can use `setContext` and `getContext` directly. The parent component sets context with `setContext(key, value)`... ```svelte ``` ...and the child retrieves it with `getContext`: ```svelte

{message}, inside Child.svelte

``` The key (`'my-context'`, in the example above) and the context itself can be any JavaScript value. > [!NOTE] `createContext` is preferred since it provides better type safety and makes it unnecessary to use keys. In addition to [`setContext`](svelte#setContext) and [`getContext`](svelte#getContext), Svelte exposes [`hasContext`](svelte#hasContext) and [`getAllContexts`](svelte#getAllContexts) functions. ## Using context with state You can store reactive state in context... ```svelte ``` ```svelte

{counter.count}

``` ```ts /// file: context.ts import { createContext } from 'svelte'; interface Counter { count: number; } export const [getCounter, setCounter] = createContext(); ``` ...though note that if you _reassign_ `counter` instead of updating it, you will 'break the link' — in other words instead of this... ```svelte ``` ...you must do this: ```svelte ``` Svelte will warn you if you get it wrong. ## Component testing When writing [component tests](testing#Unit-and-component-tests-with-Vitest-Component-testing), it can be useful to create a wrapper component that sets the context in order to check the behaviour of a component that uses it. As of version 5.49, you can do this sort of thing: ```js import { mount, unmount } from 'svelte'; import { expect, test } from 'vitest'; import { setUserContext } from './context'; import MyComponent from './MyComponent.svelte'; test('MyComponent', () => { function Wrapper(...args) { setUserContext({ name: 'Bob' }); return MyComponent(...args); } const component = mount(Wrapper, { target: document.body }); expect(document.body.innerHTML).toBe('

Hello Bob!

'); unmount(component); }); ``` This approach also works with [`hydrate`](imperative-component-api#hydrate) and [`render`](imperative-component-api#render). ## Replacing global state When you have state shared by many different components, you might be tempted to put it in its own module and just import it wherever it's needed: ```js /// file: state.svelte.js export const myGlobalState = $state({ user: { // ... } // ... }); ``` In many cases this is perfectly fine, but there is a risk: if you mutate the state during server-side rendering (which is discouraged, but entirely possible!)... ```svelte ``` ...then the data may be accessible by the _next_ user. Context solves this problem because it is not shared between requests.