React需要注意的点

235 阅读2分钟

1. 组件状态(State)管理:

  • 避免直接修改状态:React 的状态不应该直接修改。例如,不能这样做:
count = count + 1; // 错误! 
应该使用 setState(类组件)或 useState(函数组件)来更新状态:
setCount(count + 1);  
  • 使用状态更新函数:当更新状态时,最好使用函数形式的更新(prev => prev + 1),以避免多次更新时状态不一致的问题。

2. 组件重渲染优化:

  • 避免不必要的重新渲染:React 会在状态或属性(props)变化时重新渲染组件。如果组件渲染过于频繁,可能会影响性能。使用 React.memo 或 useMemo 来优化这些渲染。
  • React.memo:用于防止组件在 props 没有变化时重新渲染。
const MyComponent = React.memo(function MyComponent(props) {   // 渲染内容 }); 

3. 事件处理:

  • 绑定事件处理程序:在类组件中,记得绑定 this:
this.handleClick = this.handleClick.bind(this); 
  • 在函数组件中,通常不需要手动绑定,直接定义一个箭头函数即可。

4. 性能优化:

  • 异步操作:React 的状态更新是异步的。如果依赖前一状态值更新,可以使用回调函数形式的 setState 或 setCount:
setCount((prev) => prev + 1); 
  • React.lazy 和 Suspense:用于懒加载组件,减少初次加载时的资源消耗。
const MyComponent = React.lazy(() => import('./MyComponent')); 

5. Props 和状态传递:

  • 数据流向:React 的数据流是单向的。父组件可以通过 props 向子组件传递数据,但子组件不能直接修改父组件的状态。子组件需要通过事件或回调函数来通知父组件更新状态。

6. 表单处理:

  • 受控组件:在 React 中,表单输入通常是“受控组件”,即输入字段的值由状态管理:
const [value, setValue] = useState(''); 
const handleChange = (e) => setValue(e.target.value); return <input type="text" value={value} onChange={handleChange} />; 
  • 不受控组件:如果你不想每次输入时都更新状态,可以使用不受控组件:
const inputRef = useRef(); return <input ref={inputRef} />; 

7. Hooks 使用注意事项:

  • 遵循规则:React 的 hooks(如 useState、useEffect)必须遵循以下规则:
  • 只能在函数组件中调用。
  • 只能在组件的最顶层调用(不要在循环或条件语句中调用)。

8. JSX 语法:

  • 嵌套组件:JSX 支持嵌套组件,确保返回的 JSX 元素有一个根元素:
return (   <div> <ChildComponent /> </div> ); 
  • 条件渲染:React 提供了多种方式来进行条件渲染,比如 if 语句、三元运算符等:
return condition ? <ComponentA /> : <ComponentB />; 

9. Error Boundaries(错误边界):

  • 处理渲染错误:使用错误边界捕获组件中的错误,并防止整个应用崩溃。可以通过 componentDidCatch 或 static getDerivedStateFromError 来实现。
class ErrorBoundary extends React.Component {   componentDidCatch(error, info) {     // 处理错误   }   render() {     return this.props.children;   } } 

10. Context API:

  • 跨组件共享状态:React 的 Context API 使得跨层级的组件之间可以共享状态,而不需要通过 props 一层一层地传递。
const ThemeContext = React.createContext('light');