Appearance
React Hooks 最佳实践
React Hooks 自推出以来,已经成为 React 开发的标准方式。本文将介绍一些 React Hooks 的最佳实践。
只在顶层调用 Hooks
不要在循环、条件或嵌套函数中调用 Hooks,这会导致 Hooks 的调用顺序不一致。
javascript
// 正确的做法
function Component() {
const [count, setCount] = useState(0)
const [name, setName] = useState('')
// 其他代码...
}
// 错误的做法
function Component() {
if (condition) {
const [count, setCount] = useState(0) // 不要这样做
}
// 其他代码...
}
使用自定义 Hooks 复用逻辑
将重复的逻辑提取到自定义 Hooks 中,提高代码复用性。
javascript
// 自定义 Hook
function useLocalStorage(key, initialValue) {
const [value, setValue] = useState(() => {
const storedValue = localStorage.getItem(key)
return storedValue ? JSON.parse(storedValue) : initialValue
})
useEffect(() => {
localStorage.setItem(key, JSON.stringify(value))
}, [key, value])
return [value, setValue]
}
// 使用自定义 Hook
function Component() {
const [name, setName] = useLocalStorage('name', '')
// 其他代码...
}
依赖项数组的正确使用
确保 useEffect 的依赖项数组包含所有在效果中使用的变量。
javascript
// 正确的做法
function Component({ id }) {
const [data, setData] = useState(null)
useEffect(() => {
fetchData(id).then(setData)
}, [id]) // 包含 id 作为依赖项
// 其他代码...
}
// 错误的做法
function Component({ id }) {
const [data, setData] = useState(null)
useEffect(() => {
fetchData(id).then(setData)
}, []) // 缺少 id 作为依赖项
// 其他代码...
}
使用 useCallback 和 useMemo 优化性能
对于复杂的计算或回调函数,使用 useCallback 和 useMemo 来避免不必要的重新渲染。
javascript
function Component({ items }) {
// 使用 useMemo 缓存计算结果
const total = useMemo(() => {
return items.reduce((sum, item) => sum + item.value, 0)
}, [items])
// 使用 useCallback 缓存回调函数
const handleClick = useCallback(() => {
console.log('Clicked')
}, [])
// 其他代码...
}
遵循这些最佳实践,可以编写更加清晰、高效的 React 代码。