美文网首页
react hooks 之 memo

react hooks 之 memo

作者: RickyWu585 | 来源:发表于2021-11-30 09:29 被阅读0次
  • 如果你希望你的组件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 之 memo

    如果你希望你的组件props没变化的时候就不重新渲染,就可以用React.memo:点击button1,child...

  • react Hooks —— memo用法

    改变Parent组件中的num,会重新渲染Child组;改变Parent组件中的count,不会重新渲染Child组件

  • React中hooks之useCallback搭配memo

    React.memo类似于React.PureComponent,能对props做浅比较,防止组件无效的重复渲染 ...

  • React.memo()

    React 16.6.0 正式发布 React.memo() React.memo() 是什么? React.me...

  • React hooks中memo,usememo,useCall

    memomemo类似于PureCompoent 作用是优化组件性能,防止组件触发重渲染memo针对 一个组件的渲染...

  • 如何使用React.memo()

    目录 包装函数 PureComponent React.memo() React.memo() 与Redux 其他...

  • React Hooks

    React Hooks Hooks其实就是有状态的函数式组件。 React Hooks让React的成本降低了很多...

  • react-hooks

    前置 学习面试视频 总结react hooks react-hooks react-hooks为函数组件提供了一些...

  • React Hooks

    前言 React Conf 2018 上 React 提出了关于 React Hooks 的提案,Hooks 作为...

  • [React Hooks] 样例学习---useWhyDidYo

    前置知识 React.memo React.memo 是一个高阶组件。类似于 React.PureComponen...

网友评论

      本文标题:react hooks 之 memo

      本文链接:https://www.haomeiwen.com/subject/yaqrxrtx.html