Skip to content
import React, { useState } from "react"

const Head = React.memo(() => {
  // React.memo组件,只有在props发生变化时,才会重新渲染
  // 如果不包裹的话,父组件state变化了,子组件就会重新渲染
  // 尽管变化的数据跟子组件没有关系

  // 浅比较变化:基本类型 -> 值相等 引用类型 -> 比较内存地址
  console.log("head render!!!!");
  return (
    <div>Head组件, {Math.random()}</div>
  )
})

const Head2 = () => {
  console.log("head2 render!!!!");
  return (
    <div>Head2组件, {Math.random()}</div>
  )
}

const UseMemoCom = () => {
  const [ count, setCount ] = useState(0)

  const handleClick = () => {
    // 如果更新 State Hook 后的 state 与当前的 state 相同时,React 将跳过子组件的渲染并且不会触发 effect 的执行
    // 这里是0,与初始值相同,所以不会打印【render!!】
    // setCount(0)

    // 注意:严格模式React.StrictMode会额外调用,为了帮助开发者发现潜在的问题

    // 这里是1,与初始值不同,所以会打印【render!!】
    // 点击2次,会打印2次
    // 注意,这里是会打印2次,但是并不是渲染了2次,因为Component rendered or re-rendered只渲染了1次
    // React的奇妙机制
    setCount(1)
  }

  React.useEffect(() => {
    console.log('Component rendered or re-rendered');
  });

  console.log('render!!');

  return (
    <div>
      <button onClick={handleClick}>点击</button>
      hello memo { Math.random() }
      <Head count={count} />
      <Head2 count={count} />
    </div>
  )
}


export default UseMemoCom