React 作为当前最流行的前端框架之一,凭借其组件化、声明式编程和高效的虚拟 DOM 机制,成为构建复杂用户界面的首选工具。本文将深入解析 React 的核心 API、方法函数及属性,覆盖从基础到高级的各个方面,助你全面掌握 React 开发技巧。
React 应用由组件构成,分为函数组件和类组件:
React.Component
,具有生命周期方法和状态管理。// 函数组件
function Welcome(props) {
return Hello, {props.name}
;
}
// 类组件
class Welcome extends React.Component {
render() {
return Hello, {this.props.name}
;
}
}
JSX 是 JavaScript 的语法扩展,用于描述 UI 结构:
const element = Hello React;
{}
包裹 JavaScript 表达式。className
代替 class
)。React 通过虚拟 DOM 实现高效更新:
constructor(props)
:初始化状态和绑定方法。static getDerivedStateFromProps(props, state)
:根据 props 更新 state。render()
:返回 JSX,必须为纯函数。componentDidMount()
:组件挂载后执行,适合发起网络请求。shouldComponentUpdate(nextProps, nextState)
:决定是否重新渲染。getSnapshotBeforeUpdate(prevProps, prevState)
:捕获 DOM 更新前的状态。componentDidUpdate(prevProps, prevState, snapshot)
:更新完成后执行。componentWillUnmount()
:清理定时器、取消订阅等。static getDerivedStateFromError(error)
:更新状态以显示错误 UI。componentDidCatch(error, info)
:记录错误信息。useState(initialState)
:管理组件状态。const [count, setCount] = useState(0);
useEffect(effect, dependencies)
:处理副作用(数据获取、订阅等)。useEffect(() => {
document.title = `Count: ${count}`;
}, [count]); // 依赖项变化时重新执行
useContext(Context)
:访问 Context 值。const theme = useContext(ThemeContext);
useReducer(reducer, initialArg, init)
:复杂状态逻辑管理。const [state, dispatch] = useReducer(reducer, initialState);
useCallback(fn, dependencies)
:缓存回调函数。useMemo(() => value, dependencies)
:缓存计算结果。useRef(initialValue)
:访问 DOM 或保存可变值。const inputRef = useRef();
封装可复用的逻辑:
function useWindowWidth() {
const [width, setWidth] = useState(window.innerWidth);
useEffect(() => {
const handleResize = () => setWidth(window.innerWidth);
window.addEventListener('resize', handleResize);
return () => window.removeEventListener('resize', handleResize);
}, []);
return width;
}
const ThemeContext = React.createContext('light');
static contextType
或 Consumer
。useContext
Hook。class MyComponent extends React.Component {
constructor(props) {
super(props);
this.myRef = React.createRef();
}
render() {
return ;
}
}
const node = this.myRef.current;
const FancyButton = React.forwardRef((props, ref) => (
));
React 封装了跨浏览器的事件对象,支持冒泡机制:
function handleChange(e) {
console.log(e.target.value); // 输入框的值
}
合成事件对象会被重用,需通过 e.persist()
保留事件。
接收组件返回新组件:
function withLogging(WrappedComponent) {
return class extends React.Component {
componentDidMount() {
console.log('Component mounted');
}
render() {
return ;
}
};
}
通过函数 prop 共享代码:
(
)} />
React.memo()
缓存函数组件,避免不必要的渲染:
const MemoComponent = React.memo(MyComponent);
useMemo
与 useCallback
缓存值和函数:
const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);
const memoizedCallback = useCallback(() => doSomething(a, b), [a, b]);
PureComponent
类组件自动浅比较 props 和 state:
class MyComponent extends React.PureComponent { ... }
class ErrorBoundary extends React.Component {
state = { hasError: false };
static getDerivedStateFromError(error) {
return { hasError: true };
}
componentDidCatch(error, info) {
logErrorToService(error, info);
}
render() {
if (this.state.hasError) {
return ;
}
return this.props.children;
}
}
Chrome/Firefox 扩展,用于审查组件树、状态和性能。
} />
} />
About
const navigate = useNavigate();
navigate('/profile');
renderToString()
将组件渲染为 HTML 字符串:
ReactDOMServer.renderToString( );
renderToStaticMarkup()
生成静态 HTML(无额外 DOM 属性)。
interface ButtonProps {
label: string;
onClick: () => void;
}
const Button: React.FC = ({ label, onClick }) => (
);
React.memo
和 PureComponent
。useEffect
, useMemo
)。useReducer
。const LazyComponent = React.lazy(() => import('./Component'));
}>
React 的 API 生态庞大而灵活,本文涵盖了从基础到高级的核心知识点。掌握这些内容后,你将能够高效构建可维护的 React 应用。持续关注官方文档和社区动态,保持技术敏感度,是提升开发能力的关键。