blog icon indicating copy to clipboard operation
blog copied to clipboard

useMemo和useCallback的优化

Open wuxianqiang opened this issue 4 years ago • 0 comments

function Child({ onButtonClick, data }) {
  console.log('Child Render')
  return (
    <button onClick={onButtonClick}>{data.number}</button>
  )
}

Child = memo(Child)

function App() {
  const [number, setNumber] = useState(0)
  const [name, setName] = useState('hello') // 表单的值
  const addClick = useCallback(() => setNumber(number + 1), [number])
  const data = useMemo(() => ({ number }), [number])
  return (
    <div>
      <input type="text" value={name} onChange={e => setName(e.target.value)} />
      <Child onButtonClick={addClick} data={data} />
    </div>
  )
}

export default App;

但是大多数场景下,更新是没有必要的,我们可以借助useCallback来返回函数,然后把这个函数作为props传递给子组件;这样,子组件就能避免不必要的更新。

前提是子组件必须使用Memo处理之后

在 React 应用中,当某个组件的状态发生变化时,它会以该组件为根,重新渲染整个组件子树。(虽然有Diff可以避免DOM回流,但是这个递归过程是耗时的,所以优化是有必要的)

wuxianqiang avatar Apr 05 '20 07:04 wuxianqiang