Einführung
Die Zustandsverwaltung in React kann schwierig sein, insbesondere wenn es um komplexe oder verschachtelte Zustandsstrukturen geht. Um dies zu vereinfachen, kombiniert der useCustomReducer-Hook die Leistungsfähigkeit von useReducer mit einer flexiblen API zum Aktualisieren des Status auf saubere, deklarative Weise. Dieser Hook unterstützt primitive, verschachtelte und Array-Zustände und eignet sich daher für eine Vielzahl von Anwendungsfällen.
In diesem Artikel untersuchen wir den useCustomReducer-Hook und seine Kernmethoden zum Verwalten des Status in React-Anwendungen. Wir behandeln die Definition des Hooks, seine Methodensignaturen und detaillierte Anwendungsbeispiele für verschiedene Arten von Zustandsstrukturen. Am Ende verfügen Sie über ein solides Verständnis dafür, wie Sie den useCustomReducer-Hook verwenden, um komplexe Zustände in Ihren React-Komponenten zu verarbeiten.
Inhaltsverzeichnis
- Einführung
- Inhaltsverzeichnis
- Hooks-Übersicht
- Beispiel für eine Reaktionskomponente
- Funktionen
-
Definition
- Methodendefinitionen
-
Detaillierte Anwendungsbeispiele
- Primitive verwalten
- Formulardaten verwalten
- Arrays verwalten
- Verschachtelungsstatus verwalten
- Warum useCustomReducer verwenden?
- Fazit
- Zusätzliche Ressourcen
Hooks-Übersicht
Der useCustomReducer-Hook ist ein benutzerdefinierter React-Hook, der eine einfache und flexible Möglichkeit bietet, komplexe Zustandsstrukturen zu verwalten. Es kombiniert die Vorteile von useReducer mit einer sauberen API zum Aktualisieren von Statuswerten. Dieser Hook ist für die Verarbeitung verschiedener Zustandstypen konzipiert, darunter Grundwerte, Objekte, Arrays und verschachtelte Datenstrukturen.
Hier ist eine Übersicht über den useCustomReducer-Hook:
-
Kernmethoden:
- set: Zustandswerte direkt oder über eine Callback-Funktion aktualisieren.
- Zurücksetzen: Zustand auf seinen Anfangswert zurücksetzen.
- merge: Teilaktualisierungen in den bestehenden Zustand einbinden.
Zustandsstrukturen: - Unterstützt primitive Werte (z. B. Zahlen, Zeichenfolgen, Boolesche Werte). - Verarbeitet objektbasierte Zustandsstrukturen (z. B. Formulardaten, Benutzerprofile). - Verwaltet Array-basierte Zustandsstrukturen (z. B. Listen, Sammlungen).
Typsicher: - Vollständig typisiert mit TypeScript für zuverlässige Entwicklung und Fehlervermeidung.
Einfache API: – Bietet intuitive Methoden zum Aktualisieren, Zurücksetzen und Zusammenführen von Statuswerten. - Unterstützt direkte Aktualisierungen und Rückruffunktionen für dynamische Statusänderungen.
import { useReducer, useCallback, useMemo } from "react"; type Primitive = boolean | string | number | Date | null | undefined; type NestedObject = { [key: string]: Primitive | NestedObject | NestedArray }; type NestedArray = Array<primitive nestedobject>; type State = Primitive | NestedObject | NestedArray; type Action<t> = | { type: "SET"; payload: Partial<t> | ((prevState: T) => Partial<t>) } | { type: "RESET"; payload?: T } | { type: "MERGE"; payload: Partial<t> }; function useCustomReducer<t extends state>(initialState: T) { const reducer = useCallback( (state: T, action: Action<t>): T => { switch (action.type) { case "SET": const newPayload = typeof action.payload === "function" ? action.payload(state) : action.payload; if (newPayload instanceof Date) { return newPayload as T; } if ( typeof state === "object" && !Array.isArray(state) && state !== null ) { return { ...state, ...newPayload }; } return newPayload as T; case "RESET": return action.payload ?? initialState; case "MERGE": if ( typeof state === "object" && !Array.isArray(state) && state !== null ) { return { ...state, ...action.payload }; } return action.payload as T; default: throw new Error("Invalid action type"); } }, [initialState] ); const [state, dispatch] = useReducer(reducer, initialState); const set = useCallback( (payload: Partial<t> | ((prevState: T) => Partial<t>)) => dispatch({ type: "SET", payload }), [] ); const reset = useCallback( (payload?: T) => dispatch({ type: "RESET", payload }), [] ); const merge = useCallback( (payload: Partial<t>) => dispatch({ type: "MERGE", payload }), [] ); const memoizedState = useMemo(() => state, [state]); return [memoizedState, { set, reset, merge }] as const; } export default useCustomReducer; </t></t></t></t></t></t></t></t></t></primitive>
Der useCustomReducer-Hook wird mithilfe des useReducer-Hooks von React implementiert. Es definiert eine benutzerdefinierte Reduzierfunktion, die verschiedene Arten von Aktionen zum Aktualisieren, Zurücksetzen oder Zusammenführen von Statuswerten verarbeitet. Der Hook bietet drei Kernmethoden zum Festlegen, Zurücksetzen und Zusammenführen, um mit dem Status zu interagieren. Die Set-Methode kann entweder ein Objekt mit neuen Statuswerten oder eine Rückruffunktion akzeptieren, um den nächsten Status zu berechnen. Die Reset-Methode setzt den Zustand auf seinen Anfangswert zurück, während die Merge-Methode Teilaktualisierungen in den bestehenden Zustand einfügt.
Beispiel für eine Reaktionskomponente
Hier ist ein Beispiel für die Verwendung des useCustomReducer-Hooks in einer React-Komponente, um einen einfachen Zählerstatus zu verwalten:
import useCustomReducer from "./use-custom-reducer"; import { faker } from "@faker-js/faker"; import { Button } from "@/components/ui/button"; export default function Use() { const [formValues, { set, reset, merge }] = useCustomReducer({ name: faker.person.firstName(), age: faker.number.int({ min: 18, max: 99 }), address: { street: faker.location.streetAddress(), city: faker.location.city(), state: faker.location.state(), zip: faker.location.zipCode(), }, hobbies: [faker.person.bio(), faker.person.bio(), faker.person.bio()], }); const [bool, { set: setBool }] = useCustomReducer<boolean>( faker.datatype.boolean() ); const [num, { set: setNum }] = useCustomReducer(faker.number.int()); const [str, { set: setStr }] = useCustomReducer<string>(faker.lorem.word()); const [date, { set: setDate }] = useCustomReducer(faker.date.recent()); const [nil, { set: setNil }] = useCustomReducer(null); const [undef, { set: setUndef }] = useCustomReducer(undefined); const [arr, { set: setArr }] = useCustomReducer([ faker.number.int(), faker.number.int(), faker.number.int(), ]); const [nestedArr, { set: setNestedArr }] = useCustomReducer([ faker.number.int(), faker.lorem.word(), { three: faker.number.float() }, ]); const [obj, { set: setObj }] = useCustomReducer({ a: faker.number.int(), b: faker.number.int(), c: faker.number.int(), }); const [nestedObj, { set: setNestedObj }] = useCustomReducer({ a: faker.number.int(), b: faker.lorem.word(), c: { three: faker.number.float() }, }); return ( <div classname="p-4 space-y-6"> <h1 id="Use">Use</h1> <div classname="space-x-2 space-y-2"> <h2 id="Form-Values">Form Values</h2> <p classname="text-gray-500">{JSON.stringify(formValues)}</p> <button onclick="{()"> set({ name: faker.person.firstName() })}> Set Name </button> <button onclick="{()"> set((prevState) => ({ age: prevState.age - 1 }))} > Decrement Age </button> <button onclick="{()"> set((prevState) => ({ age: prevState.age + 1 }))} > Increment Age </button> <button onclick="{()"> set((prevState) => ({ address: { ...prevState.address, street: faker.location.streetAddress(), }, })) } > Set Street </button> <button onclick="{()"> reset()}>Reset</button> <button onclick="{()"> merge({ age: faker.number.int({ min: 18, max: 99 }) })} > Merge </button> </div> <hr classname="border-t border-gray-300"> <div classname="space-x-2 space-y-2"> <h2 id="Boolean-Value">Boolean Value</h2> <p classname="text-gray-500">{bool.toString()}</p> <button onclick="{()"> setBool(faker.datatype.boolean())}> Set Bool </button> </div> <hr classname="border-t border-gray-300"> <div classname="space-x-2 space-y-2"> <h2 id="Number-Value">Number Value</h2> <p classname="text-gray-500">{num.toString()}</p> <button onclick="{()"> setNum(faker.number.int())}>Set Num</button> </div> <hr classname="border-t border-gray-300"> <div classname="space-x-2 space-y-2"> <h2 id="String-Value">String Value</h2> <p classname="text-gray-500">{str}</p> <button onclick="{()"> setStr(faker.lorem.word())}>Set Str</button> </div> <hr classname="border-t border-gray-300"> <div classname="space-x-2 space-y-2"> <h2 id="Date-Value">Date Value</h2> <p classname="text-gray-500">{JSON.stringify(date)}</p> <button onclick="{()"> setDate(faker.date.recent())}>Set Date</button> <button onclick="{()"> setDate(new Date("2022-01-01"))}> Set Date to 2022 </button> </div> <hr classname="border-t border-gray-300"> <div classname="space-x-2 space-y-2"> <h2 id="Nil-and-Undefined">Nil and Undefined</h2> <p classname="text-gray-500">{String(nil)}</p> <button onclick="{()"> setNil(null)}>Set Nil</button> <p classname="text-gray-500">{String(undef)}</p> <button onclick="{()"> setUndef(undefined)}>Set Undef</button> </div> <hr classname="border-t border-gray-300"> <div classname="space-x-2 space-y-2"> <h2 id="Array-Value">Array Value</h2> <p classname="text-gray-500">{arr.toString()}</p> <button onclick="{()"> setArr([faker.number.int(), faker.number.int(), faker.number.int()]) } > Set Arr </button> </div> <hr classname="border-t border-gray-300"> <div classname="space-x-2 space-y-2"> <h2 id="Nested-Array">Nested Array</h2> <p classname="text-gray-500">{JSON.stringify(nestedArr)}</p> <button onclick="{()"> setNestedArr([ faker.number.int(), faker.lorem.word(), { three: faker.number.float() }, ]) } > Set Nested Arr </button> </div> <hr classname="border-t border-gray-300"> <div classname="space-x-2 space-y-2"> <h2 id="Object-Value">Object Value</h2> <p classname="text-gray-500">{JSON.stringify(obj)}</p> <button onclick="{()"> setObj({ a: faker.number.int(), b: faker.number.int(), c: faker.number.int(), }) } > Set Obj </button> </div> <hr classname="border-t border-gray-300"> <div classname="space-x-2 space-y-2"> <h2 id="Nested-Object">Nested Object</h2> <p classname="text-gray-500">{JSON.stringify(nestedObj)}</p> <button onclick="{()"> setNestedObj({ a: faker.number.int(), b: faker.lorem.word(), c: { three: faker.number.float() }, }) } > Set Nested Obj </button> </div> </div> ); } </string></boolean>
Merkmale
Unterstützt verschiedene Zustandsstrukturen: Behandelt Grundelemente, Objekte, Arrays und verschachtelte Datenstrukturen.
-
Einfache API:
- set: Zustandswerte direkt oder über einen Rückruf aktualisieren.
- Zurücksetzen: Zustand auf seinen Anfangswert zurücksetzen.
- merge: Teilaktualisierungen in den bestehenden Zustand einbinden.
Typsicher: Vollständig typisiert mit TypeScript für zuverlässige Entwicklung.
Definition
Der useCustomReducer-Hook ist ein benutzerdefinierter React-Hook zur Verwaltung komplexer Zustände. Es bietet drei Kernmethoden zum Festlegen, Zurücksetzen und Zusammenführen, um primitive, verschachtelte und arraybasierte Zustandsstrukturen zu verarbeiten. Hier ist eine Aufschlüsselung des Hooks und seiner Methoden:
function useCustomReducer<t extends state>( initialState: T ): [ T, { set: (payload: Partial<t> | ((prevState: T) => Partial<t>)) => void; reset: (payload?: T) => void; merge: (payload: Partial<t>) => void; } ]; </t></t></t></t>
Methodendefinitionen
-
Satz
- Aktualisiert den Status durch Ersetzen oder teilweises Aktualisieren seiner Eigenschaften.
- Akzeptiert entweder:
- Ein Objekt mit neuen Zustandswerten.
- Eine Rückruffunktion (prevState) => Teilweise zur Berechnung des nächsten Zustands.
Beispiel
const [state, { set }] = useCustomReducer({ count: 0 }); set((prevState) => ({ count: prevState.count + 1 }));
-
zurücksetzen
- Setzt den Zustand auf den Anfangszustand oder einen angegebenen Wert zurück.
- Akzeptiert eine optionale Nutzlast, um den Anfangszustand zu ersetzen.
Beispiel
reset(); // Resets to initial state. reset({ name: "John", age: 25 }); // Resets to a new state.
-
verschmelzen
- Führt Teilaktualisierungen in den bestehenden Zustand ein.
- Akzeptiert ein Objekt mit teilweisen Statusaktualisierungen.
- Funktioniert nur für Objekte und verschachtelte Zustandsstrukturen.
Beispiel
merge({ city: "New York" }); // Adds or updates the 'city' field.
Detaillierte Anwendungsbeispiele
Der useCustomReducer-Hook ist vielseitig und kann zur Verwaltung verschiedener Arten von Zustandsstrukturen verwendet werden. Hier sind einige Beispiele, um die Verwendung mit verschiedenen Zustandstypen zu veranschaulichen:
Primitive verwalten
- Nummer:
const initialState = 0; const [count, { set, reset }] = useCustomReducer(initialState);
-
Verwendung:
- Erhöhen Sie die Anzahl:
set((prevState) => prevState + 1);
- Zurücksetzen auf den Ausgangszustand:
reset();
- Neuen Wert festlegen:
set(10);
Zeichenfolge:
const initialState = "Hello, World!"; const [message, { set, reset }] = useCustomReducer(initialState);
-
Verwendung:
- Aktualisieren Sie die Zeichenfolge:
import { useReducer, useCallback, useMemo } from "react"; type Primitive = boolean | string | number | Date | null | undefined; type NestedObject = { [key: string]: Primitive | NestedObject | NestedArray }; type NestedArray = Array<primitive nestedobject>; type State = Primitive | NestedObject | NestedArray; type Action<t> = | { type: "SET"; payload: Partial<t> | ((prevState: T) => Partial<t>) } | { type: "RESET"; payload?: T } | { type: "MERGE"; payload: Partial<t> }; function useCustomReducer<t extends state>(initialState: T) { const reducer = useCallback( (state: T, action: Action<t>): T => { switch (action.type) { case "SET": const newPayload = typeof action.payload === "function" ? action.payload(state) : action.payload; if (newPayload instanceof Date) { return newPayload as T; } if ( typeof state === "object" && !Array.isArray(state) && state !== null ) { return { ...state, ...newPayload }; } return newPayload as T; case "RESET": return action.payload ?? initialState; case "MERGE": if ( typeof state === "object" && !Array.isArray(state) && state !== null ) { return { ...state, ...action.payload }; } return action.payload as T; default: throw new Error("Invalid action type"); } }, [initialState] ); const [state, dispatch] = useReducer(reducer, initialState); const set = useCallback( (payload: Partial<t> | ((prevState: T) => Partial<t>)) => dispatch({ type: "SET", payload }), [] ); const reset = useCallback( (payload?: T) => dispatch({ type: "RESET", payload }), [] ); const merge = useCallback( (payload: Partial<t>) => dispatch({ type: "MERGE", payload }), [] ); const memoizedState = useMemo(() => state, [state]); return [memoizedState, { set, reset, merge }] as const; } export default useCustomReducer; </t></t></t></t></t></t></t></t></t></primitive>
- Zurücksetzen auf den Ausgangszustand:
import useCustomReducer from "./use-custom-reducer"; import { faker } from "@faker-js/faker"; import { Button } from "@/components/ui/button"; export default function Use() { const [formValues, { set, reset, merge }] = useCustomReducer({ name: faker.person.firstName(), age: faker.number.int({ min: 18, max: 99 }), address: { street: faker.location.streetAddress(), city: faker.location.city(), state: faker.location.state(), zip: faker.location.zipCode(), }, hobbies: [faker.person.bio(), faker.person.bio(), faker.person.bio()], }); const [bool, { set: setBool }] = useCustomReducer<boolean>( faker.datatype.boolean() ); const [num, { set: setNum }] = useCustomReducer(faker.number.int()); const [str, { set: setStr }] = useCustomReducer<string>(faker.lorem.word()); const [date, { set: setDate }] = useCustomReducer(faker.date.recent()); const [nil, { set: setNil }] = useCustomReducer(null); const [undef, { set: setUndef }] = useCustomReducer(undefined); const [arr, { set: setArr }] = useCustomReducer([ faker.number.int(), faker.number.int(), faker.number.int(), ]); const [nestedArr, { set: setNestedArr }] = useCustomReducer([ faker.number.int(), faker.lorem.word(), { three: faker.number.float() }, ]); const [obj, { set: setObj }] = useCustomReducer({ a: faker.number.int(), b: faker.number.int(), c: faker.number.int(), }); const [nestedObj, { set: setNestedObj }] = useCustomReducer({ a: faker.number.int(), b: faker.lorem.word(), c: { three: faker.number.float() }, }); return ( <div classname="p-4 space-y-6"> <h1 id="Use">Use</h1> <div classname="space-x-2 space-y-2"> <h2 id="Form-Values">Form Values</h2> <p classname="text-gray-500">{JSON.stringify(formValues)}</p> <button onclick="{()"> set({ name: faker.person.firstName() })}> Set Name </button> <button onclick="{()"> set((prevState) => ({ age: prevState.age - 1 }))} > Decrement Age </button> <button onclick="{()"> set((prevState) => ({ age: prevState.age + 1 }))} > Increment Age </button> <button onclick="{()"> set((prevState) => ({ address: { ...prevState.address, street: faker.location.streetAddress(), }, })) } > Set Street </button> <button onclick="{()"> reset()}>Reset</button> <button onclick="{()"> merge({ age: faker.number.int({ min: 18, max: 99 }) })} > Merge </button> </div> <hr classname="border-t border-gray-300"> <div classname="space-x-2 space-y-2"> <h2 id="Boolean-Value">Boolean Value</h2> <p classname="text-gray-500">{bool.toString()}</p> <button onclick="{()"> setBool(faker.datatype.boolean())}> Set Bool </button> </div> <hr classname="border-t border-gray-300"> <div classname="space-x-2 space-y-2"> <h2 id="Number-Value">Number Value</h2> <p classname="text-gray-500">{num.toString()}</p> <button onclick="{()"> setNum(faker.number.int())}>Set Num</button> </div> <hr classname="border-t border-gray-300"> <div classname="space-x-2 space-y-2"> <h2 id="String-Value">String Value</h2> <p classname="text-gray-500">{str}</p> <button onclick="{()"> setStr(faker.lorem.word())}>Set Str</button> </div> <hr classname="border-t border-gray-300"> <div classname="space-x-2 space-y-2"> <h2 id="Date-Value">Date Value</h2> <p classname="text-gray-500">{JSON.stringify(date)}</p> <button onclick="{()"> setDate(faker.date.recent())}>Set Date</button> <button onclick="{()"> setDate(new Date("2022-01-01"))}> Set Date to 2022 </button> </div> <hr classname="border-t border-gray-300"> <div classname="space-x-2 space-y-2"> <h2 id="Nil-and-Undefined">Nil and Undefined</h2> <p classname="text-gray-500">{String(nil)}</p> <button onclick="{()"> setNil(null)}>Set Nil</button> <p classname="text-gray-500">{String(undef)}</p> <button onclick="{()"> setUndef(undefined)}>Set Undef</button> </div> <hr classname="border-t border-gray-300"> <div classname="space-x-2 space-y-2"> <h2 id="Array-Value">Array Value</h2> <p classname="text-gray-500">{arr.toString()}</p> <button onclick="{()"> setArr([faker.number.int(), faker.number.int(), faker.number.int()]) } > Set Arr </button> </div> <hr classname="border-t border-gray-300"> <div classname="space-x-2 space-y-2"> <h2 id="Nested-Array">Nested Array</h2> <p classname="text-gray-500">{JSON.stringify(nestedArr)}</p> <button onclick="{()"> setNestedArr([ faker.number.int(), faker.lorem.word(), { three: faker.number.float() }, ]) } > Set Nested Arr </button> </div> <hr classname="border-t border-gray-300"> <div classname="space-x-2 space-y-2"> <h2 id="Object-Value">Object Value</h2> <p classname="text-gray-500">{JSON.stringify(obj)}</p> <button onclick="{()"> setObj({ a: faker.number.int(), b: faker.number.int(), c: faker.number.int(), }) } > Set Obj </button> </div> <hr classname="border-t border-gray-300"> <div classname="space-x-2 space-y-2"> <h2 id="Nested-Object">Nested Object</h2> <p classname="text-gray-500">{JSON.stringify(nestedObj)}</p> <button onclick="{()"> setNestedObj({ a: faker.number.int(), b: faker.lorem.word(), c: { three: faker.number.float() }, }) } > Set Nested Obj </button> </div> </div> ); } </string></boolean>
Boolescher Wert:
function useCustomReducer<t extends state>( initialState: T ): [ T, { set: (payload: Partial<t> | ((prevState: T) => Partial<t>)) => void; reset: (payload?: T) => void; merge: (payload: Partial<t>) => void; } ]; </t></t></t></t>
-
Verwendung:
- Booleschen Wert umschalten:
const [state, { set }] = useCustomReducer({ count: 0 }); set((prevState) => ({ count: prevState.count + 1 }));
- Zurücksetzen auf den Ausgangszustand:
reset(); // Resets to initial state. reset({ name: "John", age: 25 }); // Resets to a new state.
- Neuen Wert festlegen:
merge({ city: "New York" }); // Adds or updates the 'city' field.
Datum:
const initialState = 0; const [count, { set, reset }] = useCustomReducer(initialState);
-
Verwendung:
- Datum aktualisieren:
set((prevState) => prevState + 1);
- Zurücksetzen auf den Ausgangszustand:
reset();
- Neuen Wert festlegen:
set(10);
Null- und undefinierte Zustände:
const initialState = "Hello, World!"; const [message, { set, reset }] = useCustomReducer(initialState);
-
Verwendung:
- Neuen Wert festlegen:
set("Hello, React!");
- Zurücksetzen auf den Ausgangszustand:
reset();
- Neuen Wert festlegen:
const initialState = false; const [isToggled, { set, reset }] = useCustomReducer(initialState);
Formulardaten verwalten
- Ausgangszustand:
set((prevState) => !prevState);
-
Verwendung:
- Neuen Namen festlegen:
reset();
- Adresse teilweise aktualisieren:
set(true);
- Neuen Namen festlegen:
const initialState = new Date(); const [date, { set, reset }] = useCustomReducer(initialState);
- Aktualisieren Sie die Stadt:
set(new Date("2022-01-01"));
- Zusätzliche Felder zusammenführen:
reset();
- Zurücksetzen auf den Ausgangszustand:
set(new Date("2023-01-01"));
Arrays verwalten
- Ausgangszustand:
const initialState: string | null = null; const initialState: string | undefined = undefined; const [value, { set, reset }] = useCustomReducer(initialState); // Implicitly infer the type. const [value, { set, reset }] = useCustomReducer<string undefined>( initialState ); // Explicitly define the type. </string>
-
Verwendung:
- Neues Element hinzufügen:
set("New Value");
- Ein Element entfernen:
reset();
- Zurücksetzen auf den Ausgangszustand:
set("New Value");
- Neuen Wert festlegen:
const initialState = { name: "John Doe", age: 30, address: { street: "123 Main St", city: "Sample City", state: "CA", }, }; const [formData, { set, reset, merge }] = useCustomReducer(initialState);
- Zusätzliche Elemente zusammenführen:
set({ name: "Jane Doe" });
Anfangszustand für verschachtelte Arrays:
set((prevState) => ({ address: { ...prevState.address, city: "New City", }, }));
-
Verwendung:
- Neuen Benutzer hinzufügen:
set({ name: "Jane Doe" });
- Einen Benutzer entfernen:
merge({ address: { city: "New York" } });
- Zurücksetzen auf den Ausgangszustand:
merge({ phone: "123-456-7890" });
- Neuen Wert festlegen:
reset();
- Zusätzliche Benutzer zusammenführen:
const initialState = [1, 2, 3, 4, 5]; const [numbers, { set, reset, merge }] = useCustomReducer(initialState);
Verwalten des verschachtelten Zustands
- Ausgangszustand:
set((prevState) => [...prevState, 6]);
-
Verwendung:
- Alter des Benutzers aktualisieren:
set((prevState) => prevState.filter((item) => item !== 3));
- Aktualisieren Sie die Stadt:
reset();
- Zurücksetzen auf den Ausgangszustand:
set([10, 20, 30]);
- Neuen Wert festlegen:
merge([6, 7, 8]);
Warum useCustomReducer verwenden?
-
Flexibles Zustandsmanagement:
- Unterstützt verschiedene Zustandsstrukturen und eignet sich daher für verschiedene Anwendungsfälle.
- Verarbeitet problemlos primitive, verschachtelte und Array-basierte Zustände.
- Stellt Methoden zum Aktualisieren, Zurücksetzen und Zusammenführen von Statuswerten bereit.
-
Einfache API:
- Bietet intuitive Methoden zum Aktualisieren, Zurücksetzen und Zusammenführen von Werten.
- Unterstützt direkte Aktualisierungen und Rückruffunktionen für dynamische Statusänderungen.
- Bietet eine saubere und deklarative Möglichkeit, den Status in React-Komponenten zu verwalten.
-
Cleaner-Code:
- Reduziert den Boilerplate-Code durch effiziente Handhabung komplexer Zustandsstrukturen.
- Vermeiden Sie sich wiederholende useState-Deklarationen und verarbeiten Sie komplexe Zustände direkt.
- Verwalten Sie alle Zustandstypen (primitiv, Objekt, Array usw.) mit einem Hook.
-
Typsicher:
- Vollständig typisiert mit TypeScript für zuverlässige Entwicklung und Fehlervermeidung.
-
Dynamische Updates:
- Verwenden Sie die Set-Methode mit Funktionen, um den nächsten Zustand dynamisch zu berechnen.
Abschluss
Der useCustomReducer-Hook ist ein leistungsstarkes Tool zum Verwalten komplexer Zustandsstrukturen in React-Anwendungen. Durch die Kombination der Flexibilität von useReducer mit einer einfachen API zum Aktualisieren des Status vereinfacht dieser Hook die Statusverwaltung und reduziert den Boilerplate-Code. Unabhängig davon, ob Sie mit primitiven Werten, verschachtelten Objekten oder Arrays arbeiten, bietet der useCustomReducer-Hook eine saubere und deklarative Möglichkeit, Zustandsänderungen zu verarbeiten. Probieren Sie es bei Ihrem nächsten Projekt aus und erleben Sie ganz einfach die Vorteile einer vielseitigen Zustandsverwaltung.
Zusätzliche Ressourcen
- React Documentation
- TypeScript-Dokumentation
- Faker.js-Dokumentation
Das obige ist der detaillierte Inhalt vonuseCustomReducer Hook: Ein vielseitiges Statusverwaltungstool. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Detaillierte Erläuterung der Methode für JavaScript -Zeichenfolge und FAQ In diesem Artikel werden zwei Möglichkeiten untersucht, wie String -Zeichen in JavaScript ersetzt werden: Interner JavaScript -Code und interne HTML für Webseiten. Ersetzen Sie die Zeichenfolge im JavaScript -Code Die direkteste Möglichkeit ist die Verwendung der Ersatz () -Methode: str = str.replace ("find", "ersetzen"); Diese Methode ersetzt nur die erste Übereinstimmung. Um alle Übereinstimmungen zu ersetzen, verwenden Sie einen regulären Ausdruck und fügen Sie das globale Flag G hinzu:: STR = Str.Replace (/fi

Hier sind Sie also bereit, alles über dieses Ding namens Ajax zu lernen. Aber was genau ist das? Der Begriff AJAX bezieht sich auf eine lose Gruppierung von Technologien, mit denen dynamische, interaktive Webinhalte erstellt werden. Der Begriff Ajax, ursprünglich von Jesse J geprägt

In Artikel werden JavaScript -Bibliotheken erstellt, veröffentlicht und aufrechterhalten und konzentriert sich auf Planung, Entwicklung, Testen, Dokumentation und Werbestrategien.

In dem Artikel werden Strategien zur Optimierung der JavaScript -Leistung in Browsern erörtert, wobei der Schwerpunkt auf die Reduzierung der Ausführungszeit und die Minimierung der Auswirkungen auf die Lastgeschwindigkeit der Seite wird.

In dem Artikel werden effektives JavaScript -Debuggen mithilfe von Browser -Entwickler -Tools, der Schwerpunkt auf dem Festlegen von Haltepunkten, der Konsole und der Analyse der Leistung erörtert.

Bringen Sie Matrix -Filmeffekte auf Ihre Seite! Dies ist ein cooles JQuery -Plugin, das auf dem berühmten Film "The Matrix" basiert. Das Plugin simuliert die klassischen grünen Charakter-Effekte im Film und wählen Sie einfach ein Bild aus, und das Plugin verwandelt es in ein mit numerischer Zeichen gefüllte Bild im Matrix-Stil. Komm und probiere es aus, es ist sehr interessant! Wie es funktioniert Das Plugin lädt das Bild auf die Leinwand und liest die Pixel- und Farbwerte: Data = ctx.getImagedata (x, y, setting.grainize, setting.grainesize) .data Das Plugin liest geschickt den rechteckigen Bereich des Bildes und berechnet JQuery, um die durchschnittliche Farbe jedes Bereichs zu berechnen. Dann verwenden Sie

In diesem Artikel werden Sie mit der JQuery -Bibliothek ein einfaches Bildkarousel erstellen. Wir werden die BXSLIDER -Bibliothek verwenden, die auf JQuery basiert und viele Konfigurationsoptionen zum Einrichten des Karussells bietet. Heutzutage ist Picture Carousel zu einem Muss auf der Website geworden - ein Bild ist besser als tausend Wörter! Nachdem Sie sich entschieden haben, das Bild -Karussell zu verwenden, ist die nächste Frage, wie Sie es erstellen. Zunächst müssen Sie hochwertige, hochauflösende Bilder sammeln. Als nächstes müssen Sie ein Bildkarousel mit HTML und einem JavaScript -Code erstellen. Es gibt viele Bibliotheken im Web, die Ihnen helfen können, Karussell auf unterschiedliche Weise zu erstellen. Wir werden die Open -Source -BXSLIDER -Bibliothek verwenden. Die BXSLIDER -Bibliothek unterstützt reaktionsschnelles Design, sodass das mit dieser Bibliothek gebaute Karussell an alle angepasst werden kann

Datensätze sind äußerst wichtig für den Aufbau von API -Modellen und verschiedenen Geschäftsprozessen. Aus diesem Grund ist das Import und Exportieren von CSV eine häufig benötigte Funktionalität. In diesem Tutorial lernen Sie, wie Sie eine CSV-Datei in einem Angular herunterladen und importieren.


Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

ZendStudio 13.5.1 Mac
Leistungsstarke integrierte PHP-Entwicklungsumgebung

SAP NetWeaver Server-Adapter für Eclipse
Integrieren Sie Eclipse mit dem SAP NetWeaver-Anwendungsserver.

mPDF
mPDF ist eine PHP-Bibliothek, die PDF-Dateien aus UTF-8-codiertem HTML generieren kann. Der ursprüngliche Autor, Ian Back, hat mPDF geschrieben, um PDF-Dateien „on the fly“ von seiner Website auszugeben und verschiedene Sprachen zu verarbeiten. Es ist langsamer und erzeugt bei der Verwendung von Unicode-Schriftarten größere Dateien als Originalskripte wie HTML2FPDF, unterstützt aber CSS-Stile usw. und verfügt über viele Verbesserungen. Unterstützt fast alle Sprachen, einschließlich RTL (Arabisch und Hebräisch) und CJK (Chinesisch, Japanisch und Koreanisch). Unterstützt verschachtelte Elemente auf Blockebene (wie P, DIV),

SecLists
SecLists ist der ultimative Begleiter für Sicherheitstester. Dabei handelt es sich um eine Sammlung verschiedener Arten von Listen, die häufig bei Sicherheitsbewertungen verwendet werden, an einem Ort. SecLists trägt dazu bei, Sicherheitstests effizienter und produktiver zu gestalten, indem es bequem alle Listen bereitstellt, die ein Sicherheitstester benötigen könnte. Zu den Listentypen gehören Benutzernamen, Passwörter, URLs, Fuzzing-Payloads, Muster für vertrauliche Daten, Web-Shells und mehr. Der Tester kann dieses Repository einfach auf einen neuen Testcomputer übertragen und hat dann Zugriff auf alle Arten von Listen, die er benötigt.