减少不必要的渲染
- 使用 React.memo 或 PureComponent
- React.memo:对于函数式组件,可以使用
React.memo
来包裹组件。它会对组件的 props 进行浅比较,如果 props 没有变化,组件就不会重新渲染。
- 示例代码:
import React from'react';
const MyFormComponent = React.memo((props) => {
// 表单内容
return (
<form>
{/* 输入字段等 */}
</form>
);
});
export default MyFormComponent;
- PureComponent:对于类组件,可以继承
PureComponent
。它会自动对 props 和 state 进行浅比较,只有当它们发生变化时才重新渲染。
- 示例代码:
import React, { PureComponent } from'react';
class MyFormClassComponent extends PureComponent {
render() {
return (
<form>
{/* 输入字段等 */}
</form>
);
}
}
export default MyFormClassComponent;
- 使用 useCallback 和 useMemo
- useCallback:用于缓存函数,避免在每次渲染时都重新创建函数。这对于传递给子组件的事件处理函数非常有用,因为如果函数引用发生变化,可能会导致子组件不必要的重新渲染。
- 示例代码:
import React, { useCallback } from'react';
const MyForm = () => {
const handleSubmit = useCallback((e) => {
e.preventDefault();
// 提交表单逻辑
}, []);
return (
<form onSubmit={handleSubmit}>
{/* 输入字段 */}
</form>
);
};
export default MyForm;
- useMemo:用于缓存值,只有当依赖项发生变化时才重新计算。例如,可以用来缓存复杂的表单计算结果,避免不必要的重复计算。
- 示例代码:
import React, { useMemo } from'react';
const MyForm = () => {
const formData = { /* 表单数据 */ };
const complexCalculation = useMemo(() => {
// 复杂计算逻辑,依赖 formData
return formData.someValue * 2;
}, [formData.someValue]);
return (
<form>
{/* 输入字段 */}
</form>
);
};
export default MyForm;
防抖和节流技术
- 防抖(Debounce)
- 原理:防抖是指在事件触发一定时间后才执行回调函数,如果在这段时间内事件再次触发,则重新计时。常用于搜索框实时搜索、窗口 resize 等场景。
- 实现思路:使用
setTimeout
来延迟执行回调函数,每次触发事件时,如果已经有定时器在执行,则清除它并重新设置定时器。
- 示例代码:
import React, { useState } from'react';
const debounce = (func, delay) => {
let timer;
return function() {
const context = this;
const args = arguments;
clearTimeout(timer);
timer = setTimeout(() => {
func.apply(context, args);
}, delay);
};
};
const MyForm = () => {
const [inputValue, setInputValue] = useState('');
const handleInputChange = debounce((e) => {
setInputValue(e.target.value);
// 实时验证逻辑
}, 300);
return (
<form>
<input type="text" onChange={handleInputChange} />
</form>
);
};
export default MyForm;
- 节流(Throttle)
- 原理:节流是指在一定时间内,只允许事件触发一次。常用于滚动事件监听、高频点击等场景。
- 实现思路:通过记录上次触发事件的时间,当新的事件触发时,检查距离上次触发的时间是否超过了指定的间隔时间,如果超过则执行回调函数并更新上次触发时间。
- 示例代码:
import React, { useState } from'react';
const throttle = (func, delay) => {
let lastTime = 0;
return function() {
const context = this;
const args = arguments;
const now = new Date().getTime();
if (now - lastTime >= delay) {
func.apply(context, args);
lastTime = now;
}
};
};
const MyForm = () => {
const [inputValue, setInputValue] = useState('');
const handleInputChange = throttle((e) => {
setInputValue(e.target.value);
// 实时验证逻辑
}, 300);
return (
<form>
<input type="text" onChange={handleInputChange} />
</form>
);
};
export default MyForm;