解决开发中的常见问题,掌握React开发的最佳实践
A: 函数组件是React推荐的写法,特别是配合Hooks使用。主要区别:
建议:新项目优先使用函数组件,旧项目可以逐步迁移。
A: 这是React的约定,用于区分:
// ✅ 正确
function MyComponent() { return <div>Hello</div>; }
// ❌ 错误(会被当作HTML标签)
function myComponent() { return <div>Hello</div> }
A: 考虑拆分的情况:
A: 选择依据:
// useState - 适合简单状态
const [count, setCount] = useState(0);
// useReducer - 适合复杂状态
const [state, dispatch] = useReducer(reducer, initialState);
A: 依赖数组的设置原则:
注意:确保依赖数组包含所有在effect中使用的状态和props,否则可能导致bug。
A: 常见原因和解决方案:
// ❌ 错误 - 会导致无限循环
useEffect(() => {
setCount(count + 1);
});
// ✅ 正确 - 添加依赖
useEffect(() => {
setCount(count + 1);
}, [count]);
// ✅ 正确 - 使用函数式更新
useEffect(() => {
setCount(prev => prev + 1);
}, []);
A: 使用React.memo的情况:
// 使用React.memo优化
const ExpensiveComponent = React.memo(function MyComponent({ data }) {
// 复杂计算
return <div>{expensiveCalculation(data)}</div>;
});
A: 主要区别:
// useMemo - 缓存计算结果
const expensiveValue = useMemo(() => {
return computeExpensiveValue(a, b);
}, [a, b]);
// useCallback - 缓存函数
const handleClick = useCallback(() => {
doSomething(a, b);
}, [a, b]);
A: 优化策略:
A: 选择依据:
建议:从Context API开始,如果状态管理变得复杂再考虑Redux。
A: 状态组织原则:
// ✅ 良好的文件结构
src/
components/
Button/
Button.jsx
Button.module.css
index.js
hooks/
useApi.js
utils/
helpers.js
// ❌ 错误 - 直接修改状态
state.items.push(newItem);
setState(state);
// ✅ 正确 - 创建新状态
setState({
...state,
items: [...state.items, newItem]
});
// ❌ 错误 - 在渲染中执行副作用
function MyComponent() {
// 不要在渲染中执行副作用
document.title = 'My Page';
return <div>Hello</div>;
}
// ✅ 正确 - 在useEffect中执行副作用
function MyComponent() {
useEffect(() => {
document.title = 'My Page';
}, []);
return <div>Hello</div>;
}
// ❌ 错误 - 缺少key属性
{items.map(item => (
<li>{item.name}</li>
))}
// ✅ 正确 - 提供唯一key
{items.map(item => (
<li key={item.id}>{item.name}</li>
))}