[2.0] `createContext(undefined)` throws ContextNotFoundError, even when a provider passes `undefined`
I maintainer di solito rispondono entro 1 giorno
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Idoneità per principianti
- 56/100
- Tipo di issue
- Bug
- Chiarezza
- Specificata chiaramente
- Stato di attività
- Attiva
- Stack tecnologico
- javascript, typescript
Direzione di ricerca
Start in packages/signals/src/core/context.ts and read getContext alongside the reported examples. Reproduce the cases for an explicit undefined default and provider value, then check how context errors affect computations. Done means the chosen behavior matches the expected cases and the error or docs explain the undefined behavior; the issue does not name a test file.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Describe the bug
getContext (packages/signals/src/core/context.ts) treats undefined as "not found":
let value = owner._context[context.id];
if (value === undefined) value = context.defaultValue;
if (value === undefined) throw new ContextNotFoundError();
So createContext<T | undefined>(undefined), the most common optional-context idiom in React and Solid 1 (where useContext returned undefined), throws when read outside a provider. It also throws when a provider explicitly passes undefined. Inside a computation, the throw halts reactivity for the whole app (#4178).
The message, "Context must either be created with a default value or a value must be provided before accessing it", sounds wrong when the caller did pass a default.
Your Example Website or App
Minimal repro inline below (signals-only).
Steps to Reproduce the Bug or Issue
import { createContext, getContext, setContext, createRoot, createSignal, createRenderEffect, flush } from "@solidjs/signals";
const Opt = createContext<string | undefined>(undefined);
const OptNull = createContext<string | null>(null);
createRoot(() => getContext(Opt)); // throws ContextNotFoundError
createRoot(() => { setContext(Opt, "x"); getContext(Opt); }); // "x"
createRoot(() => { setContext(Opt, undefined); getContext(Opt); }); // throws ContextNotFoundError
createRoot(() => getContext(OptNull)); // null
// Inside a computation:
const [show, setShow] = createSignal(false);
const [b, setB] = createSignal(0);
createRoot(() => createRenderEffect(b, v => console.log("b", v)));
createRoot(() => createRenderEffect(() => (show() ? getContext(Opt) : null), () => {}));
flush();
setShow(true); flush(); // StatusError (ContextNotFoundError) + [REACTIVITY_HALTED]
setB(1); flush(); // "b 1" never logs
Expected behavior
- Distinguish "no default argument" from an explicit
undefineddefault (arguments.lengthor a sentinel), and throw only for the former. - Treat a provider's explicit
value={undefined}as a provided value. - If that's not wanted, at minimum say in the error message and the docs/cheatsheet that
undefinedcounts as missing, and thatnullis the way to make a context optional.
Screenshots or Videos
No response
Platform
- OS: macOS (Darwin 25.5)
- Browser: n/a (reproduced in Node v24.18.0 with vitest, importing source)
- Version: solid
next@ b0ad1df50 (2026-10-20, after 2.0.0-rc.16)
Additional context
This came up while verifying examples for the From React docs additions (solidjs/solid-docs#1664). It's also a silent migration break from 1.x, where useContext returned undefined.
- Lingua principale
- TypeScript
- Stelle
- 36.2k
- Fork
- 1.1k
- Merge medio
- 11h 17m
- PR unite (30g)
- 371
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Ha un modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di solidjs/solid
-
`lazy()`: remounting an already-loaded component renders empty (or the Suspense fallback) since 1.9.14Forse già presa @itisrmk l’ha presa 5 giorni fa. Aperta1.x
Difficoltà 2/5 1-3 ore Idoneità per principianti 62/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 5/5 Più di una settimana Idoneità per principianti 35/100
solidjs/solid#4182 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
enhancement
Difficoltà 5/5 Più di una settimana Idoneità per principianti 35/100
I maintainer di solito rispondono entro 1 giorno
-
`createRoot`'s dispose function keeps `fn` alive, so `<For>`/`<Index>` rows retain removed list itemsForse già presa @boombang l’ha presa 7 giorni fa. Aperta1.x
Difficoltà 4/5 1-2 giorni Idoneità per principianti 45/100
I maintainer di solito rispondono entro 1 giorno
-
signals: a landing reveals a held write its stale reader re-derives onto a new flight (U-5, D-9)Aperta
Difficoltà 5/5 Più di una settimana Idoneità per principianti 12/100
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di solidjs/solid
Issue simili
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
I maintainer di solito rispondono entro 1 giorno
-
bug
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 76/100
logto-io/logto#9837 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
community first-timers-only good first issue hacktoberfest help wanted low hanging fruit up-for-grabs
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 76/100
lingdojo/kana-dojo#32964 · 1 commento · 5 reazioni ·
I maintainer di solito rispondono entro 1 giorno
-
Documentation status: needs triage
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
mastra-ai/mastra#28194 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
priority-low refactor-3
Difficoltà 2/5 1-3 ore Idoneità per principianti 84/100
I maintainer di solito rispondono entro 3 giorni