Hooks-useCallback

useCallback

1. 说明

  • useCallback 可以让你在函数组件中 缓存计算函数

2. 语法

2.1 语法格式

const fnA = useCallback(fnB, [a])

2.2 语法说明

  • useCallback 会将我们传递给它的函数fnB返回,并且将这个结果fnA 缓存;
  • 当依赖a变更时,会返回新的函数。

把内联回调函数及依赖项数组作为参数传入 useCallback,它将返回该回调函数的 memoized 版本,该回调函数仅在某个依赖项改变时才会更新。当你把回调函数传递给经过优化的并使用引用相等性去避免非必要渲染(例如 shouldComponentUpdate)的子组件时,它将非常有用。

3. 使用

// const inputChange = e => {
//   console.log(e.target.value)
// }

// 这里面的箭头函数 依赖 count
// 如果 count 有变化, 就会创建一个新的 ()=>{}
// 如果 count 没有变化,
const inputChange = useCallback(() => {
	console.log(count)
}, [count])

return (
    <div>
        <div>函数组件 - {count}</div>
        <input type="text" onChange={inputChange} />
        <button onClick={() => setCount(count + 1)}>改count</button>
        <button onClick={() => setOther(other + 1)}>改干扰项</button>
    </div>
)

4. 验证

  • 返回的是函数,我们无法很好的判断返回的函数是否变更,所以我们可以借助ES6新增的数据类型Set来判断,
// 创建一个  全局的  set
const set = new Set();

// 缓存函数   
const inputChange = useCallback(e => {
    console.log('input获取的值', e.target.value)
}, [])

// 如果 地址一样 是不会添加的 地址不一样才会添加
set.add(inputChange)
console.log('长度', set.size)

5. 使用场景

//2. 创建组件
const App = () => {
  const [count, setCount] = useState(0)
  // 干扰
  const [other, setOther] = useState(0)

  const inputChange = useCallback(() => {
    console.log(count)
  }, [count])

  set.add(inputChange)
  console.log('set个数', set.size)

  return (
    <div>
      <div>
        函数组件 - {count} - {other}
      </div>
      <input type="text" onChange={inputChange} />
      <button onClick={() => setCount(count + 1)}>1</button>
      <button onClick={() => setOther(other + 1)}>1</button>
      <Child f={inputChange}></Child>
    </div>
  )
}

// memo 是缓存外界传来的函数 不变会不更新
// 自己如果不变的话 自己就不更新了
const Child = memo(({ f }) => {
  console.log('child')

  return <div>Child组件</div>
})
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值