在 React 的类组件中,生命周期方法(Lifecycle Methods)用于在 组件挂载(Mount)、更新(Update)、卸载(Unmount) 时执行不同的操作。
当组件被创建并插入 DOM 时,会依次调用以下方法:
生命周期方法 | 作用 |
---|---|
constructor |
初始化 state,绑定事件 |
static getDerivedStateFromProps |
根据 props 更新 state |
render |
渲染 UI |
componentDidMount |
组件挂载完成,可用于请求数据、DOM 操作 |
示例:
class Example extends React.Component {
constructor(props) {
super(props);
this.state = { count: 0 };
console.log("constructor");
}
componentDidMount() {
console.log("componentDidMount: 组件挂载完成");
}
render() {
console.log("render");
return Count: {this.state.count}
;
}
}
当 props
或 state
发生变化时,组件会进入更新阶段,调用以下方法:
生命周期方法 | 作用 |
---|---|
static getDerivedStateFromProps |
监听 props 变化更新 state |
shouldComponentUpdate |
控制组件是否需要重新渲染 |
render |
重新渲染组件 |
getSnapshotBeforeUpdate |
访问更新前的 DOM 数据 |
componentDidUpdate |
组件更新后执行(如请求新数据) |
示例:
class Example extends React.Component {
state = { count: 0 };
shouldComponentUpdate(nextProps, nextState) {
console.log("shouldComponentUpdate");
return nextState.count % 2 === 0; // 只在 count 为偶数时更新
}
componentDidUpdate(prevProps, prevState) {
console.log("componentDidUpdate: 组件更新完成");
}
render() {
return Count: {this.state.count}
;
}
}
当组件被移除时,会调用以下方法:
生命周期方法 | 作用 |
---|---|
componentWillUnmount |
组件即将被卸载,清理副作用(如取消定时器、移除事件监听等) |
示例:
class Example extends React.Component {
componentWillUnmount() {
console.log("componentWillUnmount: 组件即将被销毁");
}
render() {
return 组件即将销毁
;
}
}
阶段 | 生命周期方法 | 作用 |
---|---|---|
挂载 | constructor |
初始化 state 和绑定事件 |
getDerivedStateFromProps |
根据 props 变化更新 state |
|
render |
渲染 UI | |
componentDidMount |
组件挂载完成,可执行副作用 | |
更新 | getDerivedStateFromProps |
监听 props 变化 |
shouldComponentUpdate |
控制是否重新渲染 | |
render |
重新渲染组件 | |
getSnapshotBeforeUpdate |
访问更新前的 DOM 数据 | |
componentDidUpdate |
组件更新完成后执行副作用 | |
卸载 | componentWillUnmount |
清理副作用(如移除监听器) |
React 16.8 之后,引入了 Hooks,让函数组件也能管理状态和生命周期,避免类组件的复杂性。
Hook | 作用 |
---|---|
useState |
组件的状态管理 |
useEffect |
副作用(如请求数据、订阅事件) |
useContext |
共享全局状态 |
useReducer |
复杂状态管理(类似 Redux) |
useRef |
获取 DOM 元素或存储可变数据 |
useMemo |
计算缓存,优化性能 |
useCallback |
记忆化函数,防止不必要的重渲染 |
useState
—— 状态管理const [count, setCount] = useState(0);
setCount(count + 1);
function Counter() {
const [count, setCount] = useState(0);
return (
Count: {count}
);
}
useEffect
—— 副作用管理useEffect(() => {
console.log("组件渲染/更新时执行");
});
useEffect(() => {
console.log("count 变化时触发");
}, [count]); // 仅当 count 变化时执行
useEffect(() => {
const interval = setInterval(() => {
console.log("定时任务");
}, 1000);
return () => clearInterval(interval); // 组件卸载时清除定时器
}, []);
useRef
—— 获取 DOM 节点function InputFocus() {
const inputRef = useRef(null);
return (
);
}
useMemo
vs useCallback
useMemo
(缓存计算结果)const expensiveValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);
useCallback
(缓存函数)const handleClick = useCallback(() => {
console.log("Clicked");
}, []);
对比项 | 类组件 | 函数组件 |
---|---|---|
语法复杂度 | 复杂 | 简单 |
状态管理 | this.state |
useState |
生命周期 | componentDidMount 等 |
useEffect |
适用场景 | 旧项目 / 复杂逻辑 | 现代开发推荐 |
Hook | 作用 |
---|---|
useState |
状态管理 |
useEffect |
副作用管理 |
useRef |
获取 DOM |
useMemo |
计算优化 |
useCallback |
记忆化函数 |