当前位置: 首页 > news >正文

react中useRef和useMemo和useCallback

memo : 被memo包裹的组件,会浅层比较 props,不会深度比较,如果浅层比较相同,就不会重新渲染组件

默认是,无论怎么,都会重新渲染一遍子组件,,

useMemo: 包裹一个函数,返回一个值,,只会在监听的状态改变的时候,才会重新执行一遍这个函数

这两个用来避免重新渲染,子组件,,或者重新执行一个复杂的函数,,,在不需要的情况下,,比如说,你的状态改变跟某个子组件没有关系,,就不用触发这个子组件的重新渲染

父组件:

import {useMemo, useState} from "react";
import ChildComponent from "./children/ChildComponent";

function HeheMemo(){

    const [count, setCount] = useState(0)
    const [text, setText] = useState("")


    function expensiveResult(){
        console.log("recalculate...")

        // return Math.random().;
        return Math.floor(Math.random()*1000000)
    }


    const memoizedValueValue = useMemo(()=>expensiveResult(),[count])


    // 只有当count变化的时候,才会重新渲染子组件
    const memoizedChild = useMemo(()=>{
        return <ChildComponent count={count}/>
    },[count])





    return(
        <div>
            <h1>expensive calculation</h1>
            <ChildComponent count={count} />
            <div>count : {count}</div>
            <div>expensive {memoizedValueValue} </div>
            <button onClick={()=>setCount(count+1)}>btn</button>
            <input type="text" onChange={e=>setText(e.target.value)}/>


        </div>
    )
}


export default HeheMemo

子组件:

import React, {memo} from "react";

// interface ChildProps extends React.ComponentProps<any>

interface ChildProps{
    count:number
}

const Child = memo((props:ChildProps)=>{
    console.log("我被渲染了")

    return (
        <div> child component --{props.count} </div>
    )
})



export default Child

useRef

setState 会触发页面的重新渲染,,就会重新执行函数,,,,像那种计时器,如果第二次渲染就变了,,需要保证是同一个定时器,,使用useRef,,
useEffect()只会在依赖变化的时候重新执行,,如果依赖没有变化,他取得就是最开始的那个状态,,,闭包中的函数和变量是静态的,,函数捕获了定义时的变量环境,,后续无法感知变量的变化

import React, {Component, useEffect, useRef, useState} from 'react';

function Hello02() {


    const [text, setText] = useState("")
    function handleClick(){
        console.log("click with text"+text)
    }

    const clickRef = useRef<Function>(null);
    clickRef.current = handleClick

    /**
     * 初次渲染 ===》   clickRef被赋值,,
     * 后续渲染 ===》 setText() ==> 更新状态,触发再次渲染 ==》 clickRef重新被赋值
     *
     *
     * 闭包中的函数和变量是静态的,,函数捕获了定义时的变量环境,,后续无法感知变量的变化
     */

    useEffect(()=>{

      const interval =   setInterval(()=>{
            clickRef.current?.()
        },1000)
        return ()=>clearInterval(interval)
    },[])

    return (
        <div>
            <input type="text" value={text} onChange={e=>setText(e.target.value)}/>
            <button onClick={handleClick}>btn</button>

        </div>
    )
}


export default Hello02;

useState:可以获取之前的状态

    const startTimer = ()=>{
        if (!timeRef.current){
            timeRef.current = window.setInterval(()=>{
                setCount(prevState => prevState+1)
            },1000)
        }
    }
useCallback

父组件在传递回调函数给子组件的时候,,如果父组件更改了状态,重新渲染,,这个函数会被重新创建,返回一个新的函数,,这个新的函数的引用,,让props改变了,导致子组件,,即使使用了 memo,,也会重新渲染

使用 useCallback记忆化回调函数,,这个函数就不会返回新的引用

import {memo, useCallback, useState} from "react";
interface ChildProps{
    onClick:()=>void
}
const Child = memo(({onClick}:ChildProps)=>{
    console.log("child render...")
    return (
        <div onClick={onClick}>child</div>
    )
})


function Parent(){
    const [count, setCount] = useState(0)

    // function handleClick(){
    //     console.log("click")
    // }


    const handleClick = useCallback(()=>{
        console.log("click")
    },[])
    return (
        <div>
            <p>{count}</p>
            <button onClick={e=>setCount(count+1)}>btn</button>
            <Child onClick={handleClick}></Child>
        </div>
    )
}


export default Parent

相关文章:

  • 常见框架漏洞--Spring
  • 部署Tomcat及jdk
  • Redis Sentinel 详解
  • linux的权限管理
  • 在 ASP.NET Core 中实现限流(Rate Limiting):保护服务免受滥用与攻击
  • Flask接口开发--POST接口
  • Linux(8.5)FTP
  • win32汇编环境,网络编程入门之十
  • C++实现决策树与随机森林调优困境:从性能瓶颈到高效突破
  • K8s 是什么? 基本元件、核心功能、4 大优点一次看!
  • 【差分隐私相关概念】一个问题的对偶转换
  • 【江协科技STM32】Unix时间戳BKP备份寄存器RTC实时时钟(学习笔记)
  • 基于SpringBoot的名著阅读网站
  • 【RHCE】综合实战练习
  • Unity 实现一个简易可拓展性的对话系统
  • deepseek搭建本地私有知识库dify安装介绍docker compose图文教程
  • Spring漏洞再现
  • 卷积神经网络 - 关于LeNet-5的若干问题的解释
  • 【机器学习/大模型/八股文 面经 (一)】
  • 深度学习技术与应用的未来展望:从基础理论到实际实现
  • 晒被子最大的好处,其实不是杀螨虫,而是……
  • 今天全国铁路、公路进入返程高峰,这些路段时段通行压力大
  • 给3亿老人爆改房子,是门好生意吗?
  • 遭反特朗普情绪拖累?澳大利亚联盟党大选落败、党魁痛失议席
  • 17家A股城商行一季报扫描:青岛银行营收增速领跑,杭州银行净利增速领跑
  • 重庆市大渡口区区长黄红已任九龙坡区政协党组书记