React,Hooks中UseCallback的使用

useCallback:是为了性能的优化

1.useCallback会返回一个函数的memoized(记忆的)值
2.在依赖不变的情况下,多次定义的时候,返回的值是相同的

先说一下useCallback不能做的性能优化

import React, { useState, useCallback } from 'react'
export default function UseCallbackDemoOne() {
  const [count,setCount] = useState(0)
  
  const  increament1 = () => {
  
    console.log('执行increament1')
    setCount(count + 1)
  }
 
  const  increament2 = useCallback(()=>{
    console.log('执行increament2')
    setCount(count + 1)
  },[])

  return (
    <div>
      <h2>{count}</h2>
      <button onClick={increament1}>+1</button>
      <button onClick={increament2}>+1</button>
    </div>
  )
}

首先当我们点击多少次的时候,increament1肯定执行多少次,但是当我们点击increament2时候,页面并没有发生变化,因为这个里面返回的永远是同样的初始count0,当给它一个依赖值就可以了,当没有依赖的情况下,increament2永远返回的是同一个值

 const  increament2 = useCallback(()=>{
    console.log('执行increament2')
    setCount(count + 1)
  },[count])

再说一下useCallback能做的性能优化

当我们修改父组件里面值的时候,子组件肯定也会重新渲染,但是我们不想它重新渲染,怎么做呢?

import React, { useState, useCallback,memo } from 'react'

const HYButton = memo((props)=>{
  console.log(props.title)
  return <button onClick={props.increament}>HYButton+1</button>
})

export default function UseCallbackDemoOne() {

  const [count,setCount] = useState(0)
  const [show,setShow] = useState(true)
   
  const  increament1 = () => {
    console.log('执行increament1')
    setCount(count + 1)
  }
  
  const  increament2 = useCallback(()=>{
    console.log('执行increament2')
    setCount(count + 1)
  },[count])
  

  return (
    <div>
      <h2>{count}</h2>
      <HYButton title="btn1" increament={increament1}/>
      <HYButton title="btn2" increament={increament2}/>

      <button onClick={e=>setShow(!show)}>切换</button>
    </div>
  )
}

当父组件发生改变时候,里面的子组件也会重新渲染,怎么解决,加一个memo,可以看到btn1是重新渲染,而btn2没有,因为increament2依赖的count没有改变,所以每次返回都是相同的值,所以btn2就不会重新渲染

那么useCallback在什么场景使用?

通常在将一个组件中的函数,传递给子元素进行回调使用时,使用useCallback对函数进行处理
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值