← 返回目录

React常见问题与最佳实践指南

解决开发中的常见问题,掌握React开发的最佳实践

📚 目录

基础概念问题

Q: React中函数组件和类组件有什么区别?什么时候使用哪种?

A: 函数组件是React推荐的写法,特别是配合Hooks使用。主要区别:

建议:新项目优先使用函数组件,旧项目可以逐步迁移。

Q: 为什么React组件名称必须以大写字母开头?

A: 这是React的约定,用于区分:

// ✅ 正确
function MyComponent() { return <div>Hello</div>; }

// ❌ 错误(会被当作HTML标签)
function myComponent() { return <div>Hello</div> }
Q: 什么时候应该将组件拆分成更小的组件?

A: 考虑拆分的情况:

Hooks相关问题

Q: useState和useReducer有什么区别?如何选择?

A: 选择依据:

// useState - 适合简单状态
const [count, setCount] = useState(0);

// useReducer - 适合复杂状态
const [state, dispatch] = useReducer(reducer, initialState);
Q: useEffect的依赖数组应该怎么设置?

A: 依赖数组的设置原则:

注意:确保依赖数组包含所有在effect中使用的状态和props,否则可能导致bug。

Q: 如何避免useEffect的无限循环?

A: 常见原因和解决方案:

// ❌ 错误 - 会导致无限循环
useEffect(() => {
    setCount(count + 1);
});

// ✅ 正确 - 添加依赖
useEffect(() => {
    setCount(count + 1);
}, [count]);

// ✅ 正确 - 使用函数式更新
useEffect(() => {
    setCount(prev => prev + 1);
}, []);

性能优化问题

Q: 什么时候应该使用React.memo?

A: 使用React.memo的情况:

// 使用React.memo优化
const ExpensiveComponent = React.memo(function MyComponent({ data }) {
    // 复杂计算
    return <div>{expensiveCalculation(data)}</div>;
});
Q: useMemo和useCallback有什么区别?

A: 主要区别:

// useMemo - 缓存计算结果
const expensiveValue = useMemo(() => {
    return computeExpensiveValue(a, b);
}, [a, b]);

// useCallback - 缓存函数
const handleClick = useCallback(() => {
    doSomething(a, b);
}, [a, b]);
Q: 如何优化长列表的渲染性能?

A: 优化策略:

状态管理问题

Q: 什么时候应该使用Context API?什么时候使用Redux?

A: 选择依据:

建议:从Context API开始,如果状态管理变得复杂再考虑Redux。

Q: 如何组织React应用的状态结构?

A: 状态组织原则:

最佳实践指南

1. 组件设计原则

2. 代码组织规范

// ✅ 良好的文件结构
src/
  components/
    Button/
      Button.jsx
      Button.module.css
      index.js
  hooks/
    useApi.js
  utils/
    helpers.js

3. 性能优化最佳实践

4. 测试策略

常见错误与解决方案

错误1:直接修改状态

// ❌ 错误 - 直接修改状态
state.items.push(newItem);
setState(state);

// ✅ 正确 - 创建新状态
setState({
    ...state,
    items: [...state.items, newItem]
});

错误2:在渲染中执行副作用

// ❌ 错误 - 在渲染中执行副作用
function MyComponent() {
    // 不要在渲染中执行副作用
    document.title = 'My Page';
    
    return <div>Hello</div>;
}

// ✅ 正确 - 在useEffect中执行副作用
function MyComponent() {
    useEffect(() => {
        document.title = 'My Page';
    }, []);
    
    return <div>Hello</div>;
}

错误3:忘记key属性

// ❌ 错误 - 缺少key属性
{items.map(item => (
    <li>{item.name}</li>
))}

// ✅ 正确 - 提供唯一key
{items.map(item => (
    <li key={item.id}>{item.name}</li>
))}

💡 调试技巧