React Hooks最佳实践

深入探讨React Hooks的使用技巧、常见陷阱以及最佳实践,帮助你写出更优雅的React代码

2024年1月25日
3 min read
ReactHooks最佳实践前端开发

前言

自从React 16.8引入Hooks以来,它彻底改变了我们编写React组件的方式。本文将深入探讨Hooks的最佳实践。

useState的正确使用

1. 避免不必要的状态

不是所有数据都需要放在状态中。如果数据可以从现有状态派生,就应该使用计算值。

// ❌ 不好的做法
const [firstName, setFirstName] = useState('')
const [lastName, setLastName] = useState('')
const [fullName, setFullName] = useState('')
 
// ✅ 好的做法
const [firstName, setFirstName] = useState('')
const [lastName, setLastName] = useState('')
const fullName = `${firstName} ${lastName}`

2. 状态更新的函数式写法

当新状态依赖于旧状态时,应该使用函数式更新。

// ❌ 不好的做法
setCount(count + 1)
 
// ✅ 好的做法
setCount(prev => prev + 1)

useEffect的陷阱与技巧

依赖数组的正确使用

useEffect(() => {
  // 只在组件挂载时执行一次
  fetchData()
}, [])
 
useEffect(() => {
  // 当id变化时执行
  fetchUserData(userId)
}, [userId])

清理副作用

useEffect(() => {
  const timer = setInterval(() => {
    console.log('tick')
  }, 1000)
 
  // 清理函数
  return () => clearInterval(timer)
}, [])

自定义Hooks

自定义Hooks让逻辑复用变得简单:

function useLocalStorage(key: string, initialValue: string) {
  const [value, setValue] = useState(() => {
    const stored = localStorage.getItem(key)
    return stored ?? initialValue
  })
 
  useEffect(() => {
    localStorage.setItem(key, value)
  }, [key, value])
 
  return [value, setValue] as const
}

性能优化

useMemo和useCallback

// useMemo缓存计算结果
const expensiveValue = useMemo(() => {
  return computeExpensiveValue(a, b)
}, [a, b])
 
// useCallback缓存函数
const handleClick = useCallback(() => {
  doSomething(a, b)
}, [a, b])

总结

Hooks让React组件更简洁、更易于理解。掌握这些最佳实践,你将能够写出更高质量的React代码。

记住:

  1. 保持组件简单
  2. 合理使用依赖数组
  3. 注意性能优化
  4. 善用自定义Hooks