React学习笔记(二)

useTransition 过渡函数

用来管理UI中的过渡状态,特别是在处理长时间运行的状态更新时,可以将这些长时间运行的标记为过渡状态(这些状态只是过渡状态),React会先去处理更重要的更新,延时处理过渡更新。

将一些事件标记为过渡状态。

本质上是将事件或函数的优先级降低,让react优先去处理更高优先级的事件。

const [isPending,stratTrasition] = useTransition();//不需要任何参数

useDeferredValue

也是用于设置延迟处理,但他是设置某个变量进行延迟,类似防抖的功能,只有值(比如输入框的值)不在变化时才会去赋值,但是他不能设置延迟时间,具体的时间决定于设备的性能。

与useTransition也是有区别的,useTransition设置函数延后,比如输入框的值他只会保留最后一次的键入的值。

useEffect

副作用函数

useEffect(function,dependencies?)

执行时机

  1. 组件挂载后执行function
  2. 依赖项dependencies发生变化后执行,dependencies是一个数组,当不传入该变量时,只要组件重新渲染即执行,传入空数组则代表没有依赖项,只执行初始化一次。
  3. function中可以加入清理函数,执行需要的清除操作,比如清理settimeout函数等。清理函数在组件卸载时执行(下一次组件更新前也会卸载当前组件,挂载新的组件。)
    window.structclone函数可以实现深拷贝,在较高浏览器版本中可以使用。...展开符是浅拷贝,只能独立复制第一层的副本,如果第一层中是对象,则只能复制其地址。

useLayoutEffect

与useEffect相似,也是副作用。但也有不同点。

useEffect是异步执行,不阻塞DOM渲染,在浏览器布局和绘制之后执行,DOM渲染页面绘制后再刷新,可以添加过渡效果,但也会可能造成闪烁问题。

useLayoutEffect是同步执行,阻塞DOM渲染,在页面完成布局和绘制前执行,因此在其内部添加过渡效果没用,页面只会呈现最终的效果。但根据他的特性在一些场景可以避免页面闪烁现象。

应用:比如在瀑布流列表中页面跳转再返回后页面刷新执行useLayoutEffect保持原来的浏览位置,增强用户体验。模拟react的生命周期函数。

useRef

更优雅的获取和操作DOM

useRef无法像vue中一样直接获取子组件的实例。

存储旧值

React组件每次重新渲染,普通变量都会被初始化无法存储上一次的值,通过useRef可以保留下来。但他不是一个响应式状态,只是一个普通的JavaScript对象。

应用:设置一个定时器,开启和关闭

useImperativeHandle

用于给父组件暴露自组件的状态、属性和方法,比如在封装表单组件后向外暴露校验方法、清空方法等。

useImperativeHandle(ref,()=>{},deps)

在函数中返回暴露的值,deps是依赖性,用法机制和useEffect相同。

ref需要配合useRef使用。在父组件中使用useRef定义一个ref传递给子组件。在React18和React19中用法不一样,旧版中比较复杂,ref需要配合forwardRef来使用,在新版中ref直接可以从子组件的props中解构出来。

useContext

实现祖孙之间的直接通讯

首先使用createContext全局创建一个context,支持传入默认值。

const ThemeContext = React.createContext({} as IThemeContext)

接着直接使用创建的context去包裹要通信的子组件,通过value去传递值,包括变量和方法。在React19中可以省去provider

<ThemeContext.provider value={{theme,setTheme}}>

</>

/ThemeContext.provider>

在内部任何层级的子组件都可以去使用这个context,获得其中传递的值。

const theme = useContext(ThemeContext)

theme.setTheme()

组件外部可以包裹多层context,可以包裹多个相同的context,但是相同的context内层的会覆盖外层的。

React.memo useMemo

只要父组件重新渲染,子组件也会重新渲染,这是React的一个缺陷。使用React.memo可以进行优化,将子组件用React.memo包裹起来,当只有传给子组件的props变化时,才会触发子组件的重新渲染。

useMemo是缓存值,类似于vue中的compute函数。组件重新渲染时,所有的值都会被重新计算,使用useMemo包裹某个计算,当只有依赖项(类似于useEffect)发生变化时才会重新计算,否则就使用上一次的值。

useCallback

缓存函数,减少不必要的销毁和重建。

使用WeakMap来验证函数是否销毁并重新创建。WeakMap是弱引用,当changvalue在重新渲染被销毁后会重新新建立一个崭新的实例(内存地址发生变化),map.has(changeValue)就为false。

使用useCallBack包裹函数防止函数重复创建后,如果该函数作为props传入子组件时,子组件使用React.memo进行包裹,也能防止子组件重新渲染。

useDebugValue

调试自定义hook中的值,与devtools拓展配合使用,可以在devtools中显示该值。

useId

生成唯一的id

在React中label标签的for属性改为了htmlFor

相关推荐
用户5757303346244 分钟前
🔥 一文搞懂 JavaScript 包装类(面试必考)
javascript
yuki_uix7 分钟前
别让 AI 骗了:这些状态管理工具真的适合你吗?
前端·ai编程
日月云棠7 分钟前
UE5 打包后 EXE 程序单实例的两种实现方法
前端·c++
滕青山12 分钟前
Base64编码/解码 核心JS实现
前端·javascript·vue.js
Novlan143 分钟前
@tdesign/uniapp 常见问题
前端
sww_102644 分钟前
SAA ReactAgent工作原理
开发语言·前端·javascript
linux_cfan1 小时前
拒绝“黑屏”与“哑剧”:Web视频播放器UX体验与自动播放选型指南 (2026版)
前端·javascript·音视频·html5·ux
小庄梦蝶1 小时前
宝塔使用nodejs管理器下载nodejs版本失败解决方式之一
linux·运维·前端
be or not to be1 小时前
假期js学习汇总
前端·javascript·学习
SuperEugene1 小时前
日期与时间处理:不用库和用 dayjs 的两种思路
前端·javascript