最是凝眸无限意,似曾相逢在前生。
useCallback
1 | useCallback(fn, deps) |
React 更新机制
- 更新虚拟 dom
- 如果更新后的虚拟 dom 和老的虚拟 dom 有差异,则更新真实 dom,否则不更新真实 dom
useCallback 语法
1 | useCallback(() => {}, []); |
- useCallback 接收两个参数,分别是函数和一个数组(实际上是依赖),返回缓存的函数,数组内存放依赖。
- 会在渲染期间执行,返回一个函数,useCallback是用来帮忙缓存函数的,当依赖项没有发生变化时,返回缓存的指针,当在依赖项变化的时候会更新,返回一个新的函数
与 useEffect的执行时机对比
- useMemo和useCallback都会在组件第一次渲染的时候执行,之后会在其依赖的变量发生改变时再次执行;并且这两个hooks都返回缓存的值,useMemo返回缓存的变量,useCallback返回缓存的函数。
useCallback 使用
1 | import React, { useEffect,memo, useMemo, useState, useCallback } from 'react'; |
- 父组件传递方法,子组件memo 浅比较,若不使用useCallback 则改变n也会触发子组件渲染
useCallback 理解
- callbackFunc函数每次都会新建,useCallback不是为了减少函数创建次数
1 | const DemoComponent = ()=>{ |
- 不要所有函数包一层useCallback,useCallBack会造成多余函数执行,在大量计算的函数中使用
1 | import React, { useState, useCallback,memo } from "react"; |
- 子组件大数据渲染只渲染一次,优化了性能
useCallback 案例
- 存在问题:每次count 变化都会引起子组件更新
1 | import { useState, useCallback, memo } from "react"; |
- 使用setCount 获取最新的count
1 | import { useState, useCallback, memo } from "react"; |
- 官方解法,使用 useEffect 和 useRef 结合,useRef 获取最新count
1 | import { useState, useCallback, useRef, useEffect, memo } from "react"; |
- ahooks 的 useMemoizeFn
1 | import { useMemo, useRef } from 'react'; |