react hooks 之 memo

  • 如果你希望你的组件props没变化的时候就不重新渲染,就可以用React.memo点击button1,child不会刷新,点击button2,child才会刷新
const App = () => {
  const [n, setN] = useState(0)
  const [m, setM] = useState(0)
  const onClick = () => {
    setN(i => i + 1)
  }
  const onClick2 = () => {
    setM(i => i + 1)
  }
  return (
    <div>
      <div>
        <button onClick={onClick}>button1: update n {n}</button>
        <button onClick={onClick2}>button2: update m {m}</button>
      </div> 
      <Child2 data={m}/>
    </div>
  )
}
const Child = (props) => {
  console.log('child执行了');
  return (
    <div>child:{props.data}</div>
  )
}

const Child2 = React.memo(Child)
  • 但是这种方式,只要加了监听事件,就立马破功:点击button1,Child2组件会重新渲染,原因是:点击之后,App会重新执行,onClickChild会成为一个新的函数,就意味着传给Child2的函数地址变化了,相当于props变了,就会重新刷新了;而m是值,是同一个值,意味着不变,这时,我们可以用useMemo
const App = () => {
  const [n, setN] = useState(0)
  const [m, setM] = useState(0)
  const onClick = () => {
    setN(i => i + 1)
  }
  const onClick2 = () => {
    setM(i => i + 1)
  }
  const onClickChild = () => {
    
  }
  return (
    <div>
      <div>
        <button onClick={onClick}>button1:update n {n}</button>
        <button onClick={onClick2}>button2:update m {m}</button>
      </div>
      <Child2 onClick={onClickChild} data={m}/>
    </div>
  )
}
const Child = (props) => {
  console.log('child执行了');
  return (
    <div onClick={props.onClick}>child:{props.data}</div>
  )
}

const Child2 = React.memo(Child)
  • useMemo:useMemo(()=>value,[deps]),这里value可以是函数,对象等,useMemo类似vue的计算属性依赖缓存。由于这是一个返回函数的函数,所以很奇怪,于是有了后面的useCallback,useCallback就是useMemo的语法糖,功能完全一样
const App = () => {
  const [n, setN] = useState(0)
  const [m, setM] = useState(0)
  const onClick = () => {
    setN(i => i + 1)
  }
  const onClick2 = () => {
    setM(i => i + 1)
  }
  const onClickChild = useMemo(()=>{
    return ()=>{}
  },[m])  
// 这里加m这个依赖的原因是,这个函数可能用到了m,意思是只有m变化了,才重新生成一个新的函数
  return (
    <div>
      <div>
        <button onClick={onClick}>update n {n}</button>
      </div>
      <Child2 onClick={onClickChild} data={m}/>
    </div>
  )
}
const Child = (props) => {
  console.log('child执行了');
  return (
    <div onClick={props.onClick}>child:{props.data}</div>
  )
}

const Child2 = React.memo(Child)
  • useCallback写法:
const App = () => {
  const [n, setN] = useState(0)
  const [m, setM] = useState(0)
  const onClick = () => {
    setN(i => i + 1)
  }
  const onClick2 = () => {
    setM(i => i + 1)
  }
  const onClickChild = useCallback(
    () => {
    }, [m]
  )
  return (
    <div>
      <div>
        <button onClick={onClick}>update n {n}</button>
        <button onClick={onClick2}>update m {m}</button>
      </div>
      <Child2 onClick={onClickChild} data={m}/>
    </div>
  )
}
const Child = (props) => {
  console.log('child执行了');
  return (
    <div onClick={props.onClick}>child:{props.data}</div>
  )
}

const Child2 = React.memo(Child)
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在学会使用React Hooks之前,可以先看一下相关原理学习React Hooks 前言 在 React 的世界...
    DC_er阅读 9,142评论 1 16
  • 使用 React Hooks 相比于从前的类组件有以下几点好处: 1.代码可读性更强,原本同一块功能的代码逻辑被拆...
    Kinderzhu阅读 887评论 0 2
  • useState useState 返回的第一个值将始终是更新后最新的 state,并且与 class 组件中的 ...
    三粒黑子球阅读 474评论 0 0
  • useState 1.基本使用 等价于 2. 复杂的state 3.使用状态 4. 注意事项 1). 如果stat...
    sweetBoy_9126阅读 3,084评论 0 6
  • 刚学了一下 React Hooks 的用法,就写篇博客记录一下。因为学得也比较浅,所以这篇博客只讲怎么用。 use...
    写代码的海怪阅读 873评论 1 2