React-Referenzhandbuch
Das React-Handbuch enthält verschiedene zentrale APIs, Hooks, Komponenten-Lebenszyklusmethoden und mehr.
Das Folgende ist ein vollständiges React-Referenzhandbuch, das alle Kernkonzepte von Grundlagen bis Fortgeschrittenem abdeckt (basierend auf modernen React-18+-Praktiken, mit Schwerpunkt auf Funktionskomponenten + Hooks). Jede Tabelle enthältKonzept/Syntax、Beschreibung、BeispielcodeundHinweise。
1. JSX-Grundlagen
| Konzept/Syntax | Beschreibung | Beispielcode | Hinweise |
|---|---|---|---|
| JSX-Grundstruktur | HTML-ähnliche Syntax, kompiliert zuReact.createElement |
return <div>Hello</div>; |
Muss ein einzelnes Wurzelelement haben, kann verwendet werden<></>Fragment |
| Ausdruckseinbettung | Verwenden Sie{}JS-Ausdrücke einbetten (nur Ausdrücke, keine Anweisungen) |
<h1>{name.toUpperCase()}</h1> |
Unterstützt Berechnung, Variablen, Ternär, usw. |
| Attribut-Bindung | class → className,for → htmlFor | <div className="box" htmlFor="id"> |
Camel-Case-Benennung (z. B.tabIndex) |
| Selbstschließende Tags | Alle Tags müssen geschlossen sein | <img src="....html" alt="..." /> |
Tags ohne untergeordnete Elemente müssen selbstschließend sein |
| Bedingtes Rendern | Ternärer Operator oder&& |
{isLogin ? <User /> : <Login />}<br>{count > 0 && <span>{count}</span>} |
&&Wird für "Rendern, falls vorhanden" verwendet |
| Listen-Rendering | Verwenden Siemap(), muss hinzugefügt werdenkey |
{items.map(item => <li key={item.id}>{item.name}</li>)} |
Key muss eindeutig und stabil sein, Index vermeiden |
| Kommentare | Verwenden Sie{/* */} |
{/* This is a comment */} |
Innerhalb von JSX platziert |
| Fragment | Leeres Tag, vermeidet zusätzliches DOM | <><p>1</p><p>2</p></>oder<React.Fragment> |
Kurze Syntax<></>Häufiger verwendet |
2. Komponentengrundlagen
| Konzept/Syntax | Beschreibung | Beispielcode | Hinweise |
|---|---|---|---|
| Funktionskomponenten (empfohlen) | Ersten Buchstaben groß schreiben, JSX zurückgeben | function App() { return <div>Hello</div>; } |
Moderne erste Wahl, kein this |
| Klassenkomponenten (Legacy) | Verwenden SieclassVererbungReact.Component |
class App extends React.Component { render() { return <div/>; } } |
Nur zum Verständnis von Legacy-Code |
| Props-Weitergabe | Einseitiger Datenfluss, von Eltern zu Kind | <Child name="QiXin" age={25} /><br>Kindkomponente:function Child({name}) {...} |
Schreibgeschützt, kann nicht geändert werden |
| Standard-Props | defaultProps(Funktionskomponenten verwenden Standardwerte für Parameter) |
function Child({name = 'Guest'}) {...} |
ES6-Standardparameter sind prägnanter |
| Props-Typprüfung | PropTypes (oder TypeScript) | Child.propTypes = { name: PropTypes.string.isRequired } |
Warnung im Entwicklungsmodus, in Produktion entfernt |
| Komponentenkomposition | Verschachtelung, children | <Card><h1>Title</h1></Card><br>Elternkomponente:{props.children} |
children ist eine spezielle Prop |
3. State und Hooks (Kern)
| Hook / Konzept | Beschreibung | Beispielcode | Hinweise |
|---|---|---|---|
| useState | State-Variable deklarieren | const [count, setCount] = useState(0);<br><button onClick={() => setCount(c => c+1)}> |
Funktionales Update in set verhindert veralteten State |
| useEffect | Seiteneffekte (Mount, Update, Cleanup) | useEffect(() => { ... }, [dep]);<br>Eine Cleanup-Funktion zurückgeben |
Leeres Array [] wird nur beim Mounten ausgeführt |
| useRef | Speichert veränderliche Werte oder DOM-Referenzen | const inputRef = useRef(null);<br>inputRef.current.focus(); |
Löst kein Re-Render aus |
| useContext | Context konsumieren, Prop Drilling vermeiden | const theme = useContext(ThemeContext); |
Funktioniert mit Context.Provider |
| useReducer | Komplexe State-Logik (ähnlich wie Redux) | const [state, dispatch] = useReducer(reducer, initial); |
Wird für mehrere zusammenhängende Zustände verwendet |
| useMemo | Berechnete Ergebnisse zwischenspeichern | const memoValue = useMemo(() => compute(), [dep]); |
Erneutes Ausführen aufwendiger Berechnungen vermeiden |
| useCallback | Funktionsreferenzen zwischenspeichern | const handle = useCallback(() => {...}, [dep]); |
Props von Kindkomponenten optimieren |
| Benutzerdefinierte Hooks | Wiederverwendbare Logik kapseln | function useFetch(url) { ... return data; } |
Beginne mit use |
4. Lebenszyklus (Klassenkomponenten vs. Hooks)
| Phase | Klassenkomponenten-Methode | Hooks-Äquivalent | Hinweise |
|---|---|---|---|
| Mounten | constructor → render → componentDidMount | useEffect(() => {…}, []) | State initialisieren / API-Aufrufe |
| Update | shouldComponentUpdate → render → componentDidUpdate | useEffect(() => {…}, [dep]) + memo | Ausgelöst durch Änderungen der Abhängigkeiten |
| Unmounten | componentWillUnmount | useEffect gibt eine Cleanup-Funktion zurück | Timer/Subscriptions löschen |
| Fehlerbehandlung | componentDidCatch | ErrorBoundary-Komponente | Hooks haben kein direktes Äquivalent |
5. Context und globaler Zustand
| Konzept | Beschreibung | Beispielcode | Hinweise |
|---|---|---|---|
| Context API | Globales Teilen von Daten | const ThemeContext = createContext();<br><Provider value="dark"> |
Übermäßige Nutzung vermeiden, Performance-Kosten |
| useContext | In Funktionskomponenten konsumieren | const theme = useContext(ThemeContext); |
Prägnanter Ersatz für Consumer |
6. Erweiterte Funktionen (React 18+)
| Konzept | Beschreibung | Beispielcode | Hinweise |
|---|---|---|---|
| Concurrent Mode | Unterbrechbares Rendering, verbessert die Reaktionsfähigkeit | <React.StrictMode> + Transitions |
Automatisches Batching von Updates |
| Suspense | Lazy Loading / Warten auf Datenabruf | <Suspense fallback={<Loading/>}><LazyComp /></Suspense> |
Funktioniert mit lazy |
| React.lazy | Code-Splitting durch Lazy Loading | const Lazy = React.lazy(() => import('./Comp')); |
Muss von Suspense umschlossen werden |
| startTransition | Nicht dringende Updates markieren | startTransition(() => setQuery(e.target.value)); |
UI reaktionsschnell halten |
| useDeferredValue | Nicht dringende Werte verzögern | const deferred = useDeferredValue(query); |
Ähnlich wie Eingabe-Debounce |
7. Leistungsoptimierung
| Technik | Beschreibung | Beispielcode | Hinweise |
|---|---|---|---|
| React.memo | Props flach vergleichen, unnötiges Rendern vermeiden | export default React.memo(Component); |
Nur für Funktionskomponenten |
| useMemo / useCallback | Werte/Funktionen cachen | Wie oben | Erneutes Rendern von Kindkomponenten verhindern |
| Key-Optimierung | Stabiler und eindeutiger Key | z. B. Listen-Rendering | Index vermeiden |
| Virtuelle Liste | Optimierung langer Listen (react-window) | <FixedSizeList height={500} itemCount={1000} /> |
Drittanbieter-Bibliothek |
8. Gängige Ökosystem-Tools
| Tool | Zweck | Installation/Verwendung | Hinweise |
|---|---|---|---|
| React Router v6 | Routing und Navigation | npm i react-router-dom<br><BrowserRouter><Routes><Route path="/" element={<Home/>}/></Routes></BrowserRouter> |
Verschachtelte Routen, Outlet |
| Redux Toolkit | Globale Zustandsverwaltung | npm i @reduxjs/toolkit react-redux |
RTK Query-Datenabruf |
| React Hook Form | Formularverarbeitung | useForm() |
Hohe Performance, einfache Validierung |
| Axios / Fetch | Datenanfragen | fetch('/api') |
Wird in useEffect verwendet |
| Tailwind / MUI | UI-Styling | npm i tailwindcssodermui |
Schnelle Verschönerung |
9. Debugging und Best Practices
| Item | Beschreibung | Tool/Methode |
|---|---|---|
| Debugging-Tool | Komponentenbaum, Props, Hooks anzeigen | React DevTools (Browser-Erweiterung) |
| Strict Mode | Potenzielle Probleme entdecken | <React.StrictMode> |
| ESLint + Prettier | Code-Standards | VS Code-Erweiterung |
| Testen | Jest + React Testing Library | npm i --save-dev jest |
Im Folgenden sind einige gängige Funktionen und Methoden samt Kurzbeschreibungen aufgeführt:
React-Kern-API
createElement(type, [props], [...children])- Erstellt ein React-Element oder eine Komponente.
Beispiel
const element = React.createElement('div', { className: 'container' }, 'Hello, World!');
// React.createElement gibt ein React-Element zurück
cloneElement(element, [props], [...children])- Klont und gibt ein React-Element zurück, dem neue Props und Children übergeben werden können.
Beispiel
const parentElement = <div>Hello</div>;
const clonedElement = cloneElement(parentElement, { className: 'child' });
// clonedElement ist ein geklontes React-Element mit einem neuen className
createFactory(type)- Erstellt eine Factory-Funktion zum Erstellen von React-Elementen eines angegebenen Typs.
Beispiel
const factory = React.createFactory('button');
const buttonElement = factory({ onClick: () => console.log('Button clicked') }, 'Click me');
// buttonElement ist ein React-Element, das von der Factory erstellt wurde, ein anklickbarer Button
isValidElement(element)- Bestimmt, ob ein Objekt ein gültiges React-Element ist.
Beispiel
const element = <div>Hello</div>;
console.log(isValidElement(element)); // true
Children.map(children, function[(thisArg)])- Über React-Kinder iterieren und sie abbilden.
Beispiel
const parentElement = (
<ul>
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
</ul>
);
const mappedChildren = Children.map(parentElement.props.children, child => (
<li>{child}</li>
));
// mappedChildren ist die gemappte Liste der Kinder
React-Komponenten-Lebenszyklusmethoden
constructor(props)- Konstruktor, wird aufgerufen, wenn die Komponente erstellt wird, und dient zum Initialisieren des Zustands und zum Binden von Methoden.
Beispiel
class MyComponent extends Component {
constructor(props) {
super(props);
this.state = {
count: 0
};
}
render() {
return <div>{this.state.count}</div>;
}
}
componentDidMount()- Wird aufgerufen, nachdem die Komponente gemountet wurde, normalerweise für Seiteneffekt-Operationen wie Datenabruf und Abonnements verwendet.
Beispiel
class MyComponent extends Component {
componentDidMount() {
// Daten abonnieren, nachdem die Komponente gemountet wurde
this.subscription = subscribeToData(data => {
this.setState({ data });
});
}
componentWillUnmount() {
// Abonnement beenden, bevor die Komponente unmountet
this.subscription.unsubscribe();
}
render() {
return <div>{this.state.data}</div>;
}
}
componentDidUpdate(prevProps, prevState)- Wird aufgerufen, nachdem die Komponente aktualisiert wurde, normalerweise verwendet, um auf Änderungen an Props oder State zu reagieren.
Beispiel
class MyComponent extends Component {
componentDidUpdate(prevProps, prevState) {
// Daten aktualisieren, wenn sich Props oder State ändern
if (this.props.userID !== prevProps.userID) {
this.fetchData(this.props.userID);
}
}
render() {
return <div>{this.props.userID}</div>;
}
}
componentWillUnmount()- Wird aufgerufen, bevor die Komponente unmountet wird, und dient zum Freigeben von Ressourcen wie dem Bereinigen von Timern und dem Abmelden von Abonnements.
Beispiel
class MyComponent extends Component {
componentWillUnmount() {
// Ressourcen bereinigen, bevor die Komponente unmountet wird
clearInterval(this.timerID);
}
render() {
return <div>{this.state.time}</div>;
}
}
static getDerivedStateFromProps(props, state)- Wird verwendet, um componentWillReceiveProps zu ersetzen, und aktualisiert den State, wenn sich die Props ändern.
Beispiel
class MyComponent extends Component {
static getDerivedStateFromProps(nextProps, prevState) {
if (nextProps.userID !== prevState.userID) {
return { userID: nextProps.userID };
}
return null;
}
render() {
return <div>{this.state.userID}</div>;
}
}
React Hooks
useState(initialState)- Deklariert eine State-Variable und ihre Aktualisierungsfunktion.
Beispiel
function Counter() {
const [count, setCount] = useState(0);
return (
<div>
<p>Sie haben {count} Mal geklickt</p>
<button onClick={() => setCount(count + 1)}>Klick mich</button>
</div>
);
}
useEffect(callback, [dependencies])- Deklariert eine Seiteneffekt-Operation, ähnlich einer Kombination aus componentDidMount und componentDidUpdate.
Beispiel
function Timer() {
const [seconds, setSeconds] = useState(0);
useEffect(() => {
const interval = setInterval(() => {
setSeconds(seconds => seconds + 1);
}, 1000);
return () => clearInterval(interval);
}, []); // Ein leeres Array als zweites Argument bedeutet, dass es nur ausgeführt wird, wenn die Komponente gemountet und unmountet wird
return <p>Timer: {seconds} seconds</p>;
}
useContext(context)- Einen React-Kontext abrufen und abonnieren.
Beispiel
const MyContext = React.createContext('default');
function MyComponent() {
const contextValue = useContext(MyContext);
return <p>Kontextwert: {contextValue}</p>;
}
useReducer(reducer, initialState)- Einen Reducer und eine Dispatch-Funktion für komplexe Zustandslogik deklarieren.
Beispiel
const initialState = { count: 0 };
function reducer(state, action) {
switch (action.type) {
case 'increment':
return { count: state.count + 1 };
case 'decrement':
return { count: state.count - 1 };
default:
throw new Error();
}
}
function Counter() {
const [state, dispatch] = useReducer(reducer, initialState);
return (
<div>
<p>Anzahl: {state.count}</p>
<button onClick={() => dispatch({ type: 'increment' })}>Erhöhen</button>
<button onClick={() => dispatch({ type: 'decrement' })}>Verringern</button>
</div>
);
}
useCallback(callback, [dependencies])- Eine Callback-Funktion zwischenspeichern, um zu vermeiden, dass sie bei Änderungen der Abhängigkeiten neu erstellt wird.
Beispiel
function ParentComponent() {
const [count, setCount] = useState(0);
const increment = useCallback(() => {
setCount(count + 1);
}, [count]);
return (
<div>
<ChildComponent onClick={increment} />
</div>
);
}
function ChildComponent({ onClick }) {
return <button onClick={onClick}>Anzahl erhöhen</button>;
}
useMemo(factory, [dependencies])- Einen berechneten Wert zwischenspeichern, um zu vermeiden, dass er bei Änderungen der Abhängigkeiten neu berechnet wird.
Beispiel
function ExpensiveComponent({ data }) {
const expensiveValue = useMemo(() => {
return computeExpensiveValue(data);
}, [data]);
return <div>Aufwändiger Wert: {expensiveValue}</div>;
}
useRef(initialValue)- Erstelle eine persistente Referenz, die verwendet werden kann, um auf DOM-Elemente zuzugreifen oder jeden veränderlichen Wert zwischenzuspeichern.
Beispiel
function TextInputWithFocusButton() {
const inputRef = useRef(null);
useEffect(() => {
inputRef.current.focus();
}, []);
return (
<>
<input ref={inputRef} type="text" />
<button onClick={() => inputRef.current.focus()}>Eingabe fokussieren</button>
</>
);
}
Weitere gängige Funktionen
ReactDOM.render(element, container[, callback])- Rendert ein React-Element in den angegebenen DOM-Knoten.
Beispiel
import ReactDOM from 'react-dom';
const element = <h1>Hallo, Welt!</h1>;
ReactDOM.render(element, document.getElementById('root'));
ReactDOM.createRoot(container[, options])- Erstellt eine React-Root-Instanz, die Concurrent-Rendering-Funktionen unterstützt.
Beispiel
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<App />);
ReactDOM.unmountComponentAtNode(container)- Entfernt die React-Komponente aus dem angegebenen DOM-Knoten.
Beispiel
import ReactDOM from 'react-dom';
ReactDOM.unmountComponentAtNode(document.getElementById('root'));
ReactDOMServer.renderToString(element)- Rendert ein React-Element in einen statischen HTML-String für serverseitiges Rendering.
Beispiel
import ReactDOMServer from 'react-dom/server';
const element = <div>Hallo, Welt!</div>;
const htmlString = ReactDOMServer.renderToString(element);