[Suggestion]: lazy initialization example can encourage unsafe patterns - show example
Maintainer antworten meist innerhalb von 3 Tagen
Bewertung
- Schwierigkeit
- 2/5
- Geschätzter Aufwand
- 1-3 Stunden
- Anfängerfreundlichkeit
- 82/100
- Issue-Typ
- Dokumentation
- Klarheit
- Klar beschrieben
- Aktivitätsstatus
- Aktiv
- Tech-Stack
- javascript, react
- Bereich
- documentation
Rechercherichtung
Beginne mit dem Abschnitt „lazy initialization“ auf der verlinkten React-Dokumentationsseite. Stelle klar, dass das Erstellen von lebenszyklusverwalteten Ressourcen während des Renderns unsicher sein kann, wenn ein Rendern nicht committed wird, und zeige den Unterschied zur sicheren lazy initialization; fertig, wenn Leser erkennen können, welche Muster einen Effect benötigen.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
Summary
Show example when lazy initialization example can be unsafe.
Page
https://react.dev/reference/rules/components-and-hooks-must-be-pure#lazy-initialization
Details
The lazy initialization section currently presents this pattern as valid:
function ExpenseForm() {
SuperCalculator.initializeIfNotReady(); // ✅ Good: if it doesn't affect other components
// Continue rendering...
}
However, I think this example is easy to generalize into a dangerous pattern:
if (ref.current === null) {
ref.current = createResource();
}
For resources with a lifecycle - subscriptions, event listeners, timers, connections, etc. - creating the resource during render is unsafe because a render is not guaranteed to result in a committed effect.
For example:
function useLegacyStore() {
const subscriptionRef = useRef(null);
if (subscriptionRef.current === null) {
subscriptionRef.current = store.subscribe(() => {
// ...
});
}
useEffect(() => {
return () => {
subscriptionRef.current?.unsubscribe();
};
}, []);
}
This can appear to work when components only render as part of normal mount/unmount flows. However, with concurrent rendering or APIs such as Activity, React may render a component without subsequently mounting the
Effect associated with that render.
The subscription has already been created, while its cleanup is tied to an Effect that may never run.
The documentation should make this distinction explicit, perhaps by adding a warning/example.
Inspired by:
https://hackernoon.com/react-activity-when-a-render-no-longer-guarantees-an-effect
- Vorherrschende Sprache
- JavaScript
- Sterne
- 11.8k
- Forks
- 8k
- Ø Merge
- 3 T. 5 Std.
- Gemergte PRs (30 T.)
- 9
Entwicklungsumgebung
- Kein Dockerfile und keine Docker-Compose-Datei
- Hat eine Pull-Request-Vorlage
- Beitragsleitfaden lesen
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus reactjs/react.dev
-
[Suggestion]: Document that useFormStatus works with a preventDefault-ed onSubmit + startTransitionEvtl. vergeben @Felix-ming hat das vor 2 Tagen übernommen. Offentype: documentation
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 78/100
reactjs/react.dev#8682 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 3 Tagen
-
type: documentation
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 72/100
reactjs/react.dev#8661 · 1 Kommentar · 7 Reaktionen ·
Maintainer antworten meist innerhalb von 3 Tagen
-
docs: improve useState explanation in quick startEvtl. vergeben @tirthraj01 hat das vor 26 Tagen übernommen. Offen
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 82/100
Maintainer antworten meist innerhalb von 3 Tagen
-
[Bug]: Next button throws a runtime error instead of cycling to the first sculptureEvtl. vergeben @Saurav10codes hat das vor 34 Tagen übernommen. Offenbug: unconfirmed
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 74/100
reactjs/react.dev#8634 · 3 Kommentare ·
Maintainer antworten meist innerhalb von 3 Tagen
-
[Typo]: Repeaded words in Pitfall sectionEvtl. vergeben @mdimamhosen hat das vor 36 Tagen übernommen. Offentype: typos
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 90/100
reactjs/react.dev#8622 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 3 Tagen
Alle Issues in reactjs/react.dev
Ähnliche Issues
-
ci-install-db-tools stall-case tests flake: stalled apt-get can be killed before it logs its callOffeneffort:low model:light plan planner:opus-5-5 tests
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 86/100
Maintainer antworten meist innerhalb von 1 Tag
-
Bug 🐞
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 72/100
mozilla-mobile/firefox-ios#35986 ·
Maintainer antworten meist innerhalb von 1 Tag
-
component:sight
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 78/100
agentic-os-org/ANOLISA#6738 · 2 Kommentare ·
Maintainer antworten meist innerhalb von 1 Tag
-
bug Durable Agents Observability (AI Telemetry) status: needs triage
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 82/100
mastra-ai/mastra#26470 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 1 Tag
-
feature/cohorts feature/feature-flags team/feature-flags
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 74/100
Maintainer antworten meist innerhalb von 1 Tag