如果没有这个hook,则当父组件的事件触发时,会触发传递给子组件的的事件,从而会导致子组件全局更新,触发它的函数再次调用

    1. //父组件
    2. import React, { useState} from "react";
    3. import Child from "./Itemtwo.jsx"
    4. const Itemone=()=>{
    5. const [text,setText]=useState('')
    6. const changeHandle=(e)=>{
    7. setText(e.target.value)
    8. }
    9. return (
    10. <div>
    11. <div>text文本:{text}</div>
    12. <Child onChange={changeHandle}></Child>
    13. </div>
    14. )
    15. }
    16. export default Itemone
    17. //子组件
    18. import React, {memo} from 'react'
    19. const Itemtwo=memo((props)=>{
    20. const date=new Date()
    21. return (
    22. <div>
    23. {date.toLocaleString()}
    24. <input type="text" onChange={props.onChange}/>
    25. </div>
    26. )
    27. })
    28. export default Itemtwo
    29. //上面代码中,我们在子组件中修改文本框的值,会触发子组件的onChange,从而触发父组件的changeHandler方法,在父组件中的changeHandler方法中修改了text文本,所以页面上的text值发生了改变。
    30. //但是除了我们发现页面上text文本改变之外,子组件中的时间也发生了改变 (说明每一次子组件输入内容的时候都会触发子组件的重新渲染)
    31. //原因是每一次子组件输入内容,父组件的text文本发生变化,造成父组件被重新渲染,从而造成父组件传递给子组件的changeHandler方法(props)发生了变化,从而造成子组件的重新渲染
    1. //修改后的父组件
    2. import React,{useState,useCallback} from 'react'
    3. import Child from './Itemtwo';
    4. const Itemthree=(props)=>{
    5. const [text,setText]=useState('')
    6. const changeHandle=useCallback(
    7. (e) => {
    8. setText(e.target.value)
    9. },
    10. []
    11. )
    12. return (
    13. <div>
    14. <div>text文本为:{text}</div>
    15. <Child onChange={changeHandle}></Child>
    16. </div>
    17. )
    18. }
    19. export default Itemthree