React 高级特性
2026/7/15大约 1 分钟
React 高级特性
Context
import { createContext, useContext, useState } from 'react';
interface ThemeContextType {
theme: 'light' | 'dark';
toggleTheme: () => void;
}
const ThemeContext = createContext<ThemeContextType | undefined>(undefined);
function ThemeProvider({ children }: { children: React.ReactNode }) {
const [theme, setTheme] = useState<'light' | 'dark'>('light');
const toggleTheme = () => setTheme(t => t === 'light' ? 'dark' : 'light');
return (
<ThemeContext.Provider value={{ theme, toggleTheme }}>
{children}
</ThemeContext.Provider>
);
}
function ThemedButton() {
const { theme, toggleTheme } = useContext(ThemeContext)!;
return <button onClick={toggleTheme} className={`btn-${theme}`}>Current: {theme}</button>;
}
状态提升
function Parent() {
const [value, setValue] = useState('');
return (
<div>
<Input value={value} onChange={setValue} />
<Display value={value} />
</div>
);
}
function Input({ value, onChange }: { value: string; onChange: (v: string) => void }) {
return <input value={value} onChange={e => onChange(e.target.value)} />;
}
function Display({ value }: { value: string }) {
return <p>Current value: {value}</p>;
}
useReducer
import { useReducer } from 'react';
interface State { count: number; }
type Action = { type: 'INCREMENT' } | { type: 'DECREMENT' } | { type: 'RESET' };
function reducer(state: State, action: Action): State {
switch (action.type) {
case 'INCREMENT': return { count: state.count + 1 };
case 'DECREMENT': return { count: state.count - 1 };
case 'RESET': return { count: 0 };
}
}
function Counter() {
const [state, dispatch] = useReducer(reducer, { count: 0 });
return (
<>
<p>Count: {state.count}</p>
<button onClick={() => dispatch({ type: 'INCREMENT' })}>+</button>
<button onClick={() => dispatch({ type: 'DECREMENT' })}>-</button>
<button onClick={() => dispatch({ type: 'RESET' })}>Reset</button>
</>
);
}
React 18 新特性
新的渲染方式
import { createRoot } from 'react-dom/client';
const root = createRoot(document.getElementById('root')!);
root.render(<App />);
startTransition
import { startTransition, useState } from 'react';
function SearchResults() {
const [query, setQuery] = useState('');
const [results, setResults] = useState([]);
const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
const value = e.target.value;
setQuery(value); // 紧急更新
startTransition(() => {
setResults(search(value)); // 非紧急更新,可被中断
});
};
return <div>...</div>;
}
useDeferredValue
import { useDeferredValue, useState, Suspense } from 'react';
function SearchPage() {
const [query, setQuery] = useState('');
const deferredQuery = useDeferredValue(query);
return (
<div>
<input value={query} onChange={e => setQuery(e.target.value)} />
<Suspense fallback="Loading...">
<SearchResults query={deferredQuery} />
</Suspense>
</div>
);
}
状态管理
轻量方案
大型应用
- Redux Toolkit - 官方推荐
- MobX - 响应式状态
