浅析react18中的新概念Transition

本篇文章带大家了解一下react18的新概念transition,简单介绍一下新api:starttransition和新hooks:usetransition和usedeferredvalue的使用方法,希望对大家有所帮助!

浅析react18中的新概念Transition

React 18中,引入了一个新概念——transition,由此带来了一个新的API——startTransition和两个新的hooks——useTransitionusedeferredValue,本文由此展开使用尝鲜介绍。【相关推荐:Redis视频教程】

1. 总览

本文分为4部分进行:

tansition 产生初衷startTransition 使用和介绍useTransition 使用和介绍useDeferredValue 使用和介绍

2. transition产生初衷

transtion 直接翻译为 过渡。tansition本质上是为了解决渲染并发问题所提出。在React中一旦组件状态改变并触发了重新渲染,则无法停止渲染。直到组件重新渲染完毕,页面才能继续响应用户的交互。

为此react 18中更新都可以划分为以下两类:

紧急更新(urgent update):用户期望马上响应的更新操作,例如鼠标单击或键盘输入。过渡更新(transition update):一些延迟可以接受的更新操作,如查询时,搜索推荐、搜索结果的展示等。

// 被startTransiton标记后为过渡更新startTransition(()=> {    // 非紧急更新,会被降低优先级,延迟执行    setQueryValue(inputValue)})// 未被标记则马上执行setInputValue(inputValue)

在react 18中被startTrionstion标记的更新,即为过渡更新(执行的优先级被降低),此时react会根据内部的调度机制延迟执行内部的state更新。

开发中开发者可以通过transition hook决定哪些更新被标记为transition事件。一旦被标记则代表为低优先级执行,即react知道该state可以延迟更新,通过区分更新优先级,让高优先级的事件保持响应,提高用户交互体验,保持页面响应

3. startTransiton

startTransiton使用介绍

const handleClick = () => {    // startTransition包裹标记为低优先级更新    startTransition(()=> {        setQueryValue(inputValue)    })        // 未被标记则马上执行    setInputValue(inputValue)}

首先我们来介绍下最简单的startTransition

startTransiton 是一个接受回调的函数,用于告知React需要延迟更新的state。如果某个state的更新会导致组件挂起,则应该包裹在startTransition中

通过演示对比

这是一个对输入字符后展示搜索结果的场景模拟,通过伪造大量搜索结果,模拟容易卡顿的情况。

我们试着连续输入123,监听搜索框值value变化(urgent update)和搜索值searchVal变化(transition update)并输出到控制栏。

import React, { useEffect, useState, startTransition } from 'react';import './App.css'const SearchResult = (props) => {    const resultList = props.query        ? Array.from({ length: 10000 }, (_, index) => ({            id: index,            keyword: `${props.query} -- 搜索结果${index}`,        })) : [];    return resultList.map(({ id, keyword }) => (        
  • {keyword}
  • ))}const App = () => { const [type, setTpye] = useState(1) const [value, setValue] = useState(''); const [searchVal, setSearchVal] = useState('-'); useEffect(() => { // 监听搜索值改变 console.log('对搜索值更新的响应++++++' + searchVal + '+++++++++++') }, [searchVal]) useEffect(() => { console.log('对输入框值更新的响应-----' + value + '-------------') if (type === 1) { setSearchVal(value || '-') } if (type === 2) { startTransition(() => { setSearchVal(value || '-') }) } }, [value, type]); return (
    setValue(e.target.value)} />
    setTpye(1)}>normal
    setTpye(2)}>transiton
    );};

    普通模式下

    1.gif

    如图所示:连续输入字符123,当第一个字符输入后,搜索值马上响应,列表渲染立刻开始,造成卡顿输入框停止了对用户输入的响应,直到渲染结束,输入框才继续响应。

    闪念贝壳 闪念贝壳

    闪念贝壳是一款AI 驱动的智能语音笔记,随时随地用语音记录你的每一个想法。

    闪念贝壳 53 查看详情 闪念贝壳

    使用startTransition后

    2.gif

    如图所示:连续输入字符123,输入框不断响应,搜索值的响应被延后,保证页面反馈,直到输入结束,才开始响应搜索值,渲染搜索结果,保持页面响应。

    4. useTransiton

    useTransiton使用介绍

    import { useTransiton } from 'react'const [isPending, startTransition] = useTransiton({timeoutMs: 2000})// 例如, 在pending状态下,您可以展示一个Spinner{ isPending ?  : null }

    startTransition 是一个接受回调的函数,用于告知React需要延迟更新的state。isPending 是一个布尔值,这是react告知我们是否等待过渡完成的方式。useTransition 接受带有 timeoutMs 的延迟响应的值,如果给定的timeoutMs内未完成,它将会强制执行startTransition回调函数内state的更新。

    useTransiton简单分析

    我们通过伪代码理解下useTransition

    function useTransition(){    const [isPending, setPending] = mountState(false);    const start = (callback)=>{        setPending(true);        // Scheduler.unstable_next 通过 transiton 模式,低优先级调度执行回调函数        // 可以降低更新的优先级。如果回调中触发的更新优先级会比较低,        // 它会让位为高优先级的更新,或者当前事务繁忙时,调度到下一空闲期再应用。        Scheduler.unstable_next(() => {            const prevTransition = ReactCurrentBatchConfig.transition;            ReactCurrentBatchConfig.transition = 1;            try {                setPending(false);                //实行回调函数                callback();            } finally {                ReactCurrentBatchConfig.transition = prevTransition;            }        })    }    return [isPending, start];}

    startTransition执行过程中,会触发两次setPending ,一次在transition=1之前,一次在之后。startTransition被调用时setPending(true),当startTransition内部的回调函数执行时transiton过渡任务更新setPending(false)。react内部可以根据pending值的变化准确把握等待的过渡时间,并依此判断是否超过了timeoutMs(如果有传入)强制执行更新。

    5. useDeferredValue

    useDeferredValue使用介绍

    const [value, setValue] = useState('')// defferedValue值延后于state更新const deferredValue = useDeferredValue(value, {timeoutMs: 2000})

    useDeferredValue 返回一个延迟响应的状态,可以设置最长延迟时间timeoutMs。可以传入可选的timeoutMs,如果给定的timeoutMs内未完成,它将会强制更新。与useTransition的不同: useTransition是处理一段逻辑,而useDeferred是产生一个新状态

    useDeferredValue的使用

    import React, { useEffect, useState, useTransition, useDeferredValue } from 'react';import './App.css'const SearchResult = (props) => {    const resultList = props.query        ? Array.from({ length: 10000 }, (_, index) => ({            id: index,            keyword: `${props.query} -- 搜索结果${index}`,        })) : [];    return resultList.map(({ id, keyword }) => (        
  • {keyword}
  • ))}const App = () => { const [value, setValue] = useState(''); const searchValue = useDeferredValue(value, { timeoutMs: 2000 }); useEffect(() => { console.log('对输入框值的响应--------' + value + '---------------') }, [value]) useEffect(() => { // 监听搜索值改变 console.log('对搜索值的更新响应++++++' + searchValue + '+++++++++++') }, [searchValue]) return (
    setValue(e.target.value)} />
    useDeferredValue
    );};

    3.gif

    useDeferredValue简单分析

    我们通过伪代码理解下useDeferredValue

    function useDeferredValue(value){    const [prevValue, setValue] = updateState(value);    updateEffect(() => {        // 在 useEffect 中通过 transition 模式来更新 value 。        Scheduler.unstable_next(() => {            const prevTransition = ReactCurrentBatchConfig.transition;            ReactCurrentBatchConfig.transition = 1;            try {                setValue(value);            } finally {                ReactCurrentBatchConfig.transition = prevTransition;            }         })    }, [value]);    return prevValue;}

    useDeferredValue通过useEffect监听传入值的变化,然后通过过渡任务执行值的改变。这样保证defrredValue的更新滞后于setState,同时符合过渡更新的原则,因为是通过transition 调度机制执行的。

    更多编程相关知识,请访问:编程视频!!

    以上就是浅析react18中的新概念Transition的详细内容,更多请关注创想鸟其它相关文章!

    版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
    如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
    发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/552323.html

    (0)
    打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
    上一篇 2025年11月9日 20:40:41
    下一篇 2025年11月9日 20:41:54

    相关推荐

    • CSS 渐变动画属性:transition 和 background-image

      CSS 渐变动画属性:transition 和 background-image 在网页设计中,动画效果能够为页面增添活力和吸引力。CSS提供了许多用于制作动画效果的属性,其中包括了渐变动画属性transition和background-image。本文将详细介绍这两个属性,并给出具体的代码示例。 …

      2025年12月24日
      000
    • CSS 图片过渡属性详解:transition 和 background-image

      CSS 图片过渡属性详解:transition 和 background-image 引言:在现代网页设计中,过渡效果是提升用户交互体验的重要技术。其中,图片过渡效果在美化网页、改善用户体验方面发挥了重要作用。本文将详细介绍两种常用的图片过渡属性:transition 和 background-im…

      2025年12月24日
      000
    • css3transition属性详解

      CSS3过渡(transition)允许我们在两个不同的CSS样式之间创建一种过渡效果。通过使用transition属性,我们可以定义CSS属性如何从一个值转换为另一个值。这种变化可以在鼠标事件(如::hover),按下按钮等场景下触发。 transition属性的基本用法 在CSS3中,trans…

      2025年12月24日
      000
    • CSS小技巧:利用transition保留hover状态

      如何保留 hover 的状态?下面本篇文章给大家介绍一下不借助javascript保留hover状态的方法,希望对大家有所帮助! 通常情况下,hover 是无法保存状态的。鼠标移入触发额外样式,一旦移出就还原了。 el:hover{ color: red} 这就意味着,如果需要保留hover的状态,…

      2025年12月24日 好文分享
      100
    • 你了解 Transition 吗?一起来深入了解下Transition!

      你了解 transition 吗?你可能并不了解 transition?下面本篇文章就来通过图文结合的方式带大家深入了解一下transition,希望对大家有所帮助! 这篇文章我们深入学习 Transition 动画。没错,CSS3 Transition 动画。你可能会问,不是很简单吗,这什么好讲的…

      2025年12月24日 好文分享
      000
    • 使用css过渡有哪些触发方式

      触发方式有:1、通过伪类元素“:hover”触发,语法“元素{transition:属性 过渡时间}元素:hover{属性:属性值}”;2、通过“element.classList.add(“元素名称”)”语句触发css过渡效果。 本教程操作环境:windows7系统、CSS…

      2025年12月24日
      000
    • css3动画之transition和animation属性介绍

      本文给大家介绍实现css3动画的transition和animation属性,有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。 tradition一共以下有4个属性: transition-property 过渡属性 transition-duration 完成动画所需时间,以秒或者…

      好文分享 2025年12月24日
      000
    • CSS3 中什么是transition, transform 和 animation?三者的区别

      本章给大家介绍css3 中什么是transition, transform 和 animation?三者的区别。有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 transition transition允许css的属性值在一定的时间区间内平滑地过渡,语法如下: transition …

      好文分享 2025年12月24日
      000
    • 如何使用纯CSS实现悬停时右移的按钮效果(附源码)

      本篇文章给大家带来的内容是关于如何使用纯css实现悬停时右移的按钮效果(附源码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 效果预览 源代码下载 https://github.com/comehope/front-end-daily-challenges 代码解读 定义 dom…

      2025年12月24日
      000
    • 深入理解CSS3中transition的使用方法

      可以让动画在css层面实现,此时不是利用setinterval(),不是定时器,而是底层c++在渲染,渲染动画的质量、丝滑程度都要远远优于js、jquery。 要颠覆我们传统制作网页动画的思维模式,现在的手机页面中,绝对不会有任何动画是setInterval()完成的,而都是过渡实现的。今后2~3年…

      好文分享 2025年12月24日
      000
    • CSS详细认识制作动画的几个属性

      基本上我们会有这样的一个简单的概念,css 的动画效果由浏览器控制和渲染,理论上比 javascript 的动画效果性能好,但是控制上没有 javascript 那么灵活方便。而css 动画是分成 transform,transition 和 animation 三个部分,其中 transfrom …

      2025年12月24日
      000
    • 如何使用纯CSS实现小球变矩形背景的按钮悬停效果(附源码)

      本篇文章给大家带来的内容是关于如何使用纯css实现小球变矩形背景的按钮悬停效果(附源码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 效果预览 源代码下载 https://github.com/comehope/front-end-daily-challenges 代码解读 定义…

      2025年12月24日
      000
    • 如何使用纯CSS实现切换按钮时背景的悬停动画效果

      本篇文章给大家带来的内容是关于如何使用纯css实现切换按钮时背景的悬停动画效果,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 效果预览 源代码下载 https://github.com/comehope/front-end-daily-challenges 代码解读 定义 dom,…

      2025年12月24日
      000
    • 基于css3的属性transition制作菜单导航的效果

      这篇文章主要为大家介绍了基于css3的属性transition制作菜单导航效果,可实现鼠标滑过菜单项动态改变背景滑块的功能,基于css3的属性transition实现,非常具有实用价值,需要的朋友可以参考下 本文实例讲述了基于css3的属性transition制作菜单导航效果。分享给大家供大家参考。…

      2025年12月24日
      000
    • CSS3中Transition动画属性的用法介绍

      这篇文章主要为大家详细介绍了css3中transition动画属性用法,教大家如何使用transition动画,感兴趣的小伙伴们可以参考一下 W3C标准中对css3的transition这是样描述的:“css的transition允许css的属性值在一定的时间区间内平滑地过渡。这种效果可以在鼠标单击…

      2025年12月24日
      000
    • CSS3中的Transition过度与Animation动画属性的使用介绍

      这篇文章主要介绍了css3中的transition过度与animation动画属性使用要点transition和animation能被用来制作基本的页面图片动态效果,当然进一步的控制还是需要javascript的帮助,需要的朋友可以参考下 Transition(过度)Transition允许CSS的…

      2025年12月24日
      000
    • 关于CSS3中动画属性transform和transition以及animation属性的区别分析

      这篇文章主要介绍了关于css3中动画属性transform和transition以及animation属性的区别分析,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 最近在项目中用到了CSS3中的动画属性。无奈对于css3几个新加的属性不太熟悉,常常容易搞混。所以从网站研究了点资料,总…

      好文分享 2025年12月24日
      000
    • css3的Transition平滑过渡菜单栏实现

      这次给大家带来css3的Transition平滑过渡菜单栏实现,实现Transition平滑过渡菜单栏的注意事项有哪些,下面就是实战案例,一起来看一下。 CSS3的制作动画的三大属性(Transform,Transition,Animation)下面介绍一下 Transition属性。transit…

      2025年12月24日
      000
    • CSS3中transform、transition和animationsan三种属性的区别实例详解

      最近在项目中用到了css3中的动画属性。常常容易搞混。所以从网上查了点资料,总结一下,方便有需要的朋友们可以参考学习。 Transform在部分的test case当中,每每演示transform属性的,看起来好像都是带动画。这使得小部分直觉化思维的人认为transform属性是动画属性。而恰恰相反…

      好文分享 2025年12月23日
      000
    • 使用CSS3过渡transition效果实例介绍

      这篇文章主要为大家详细介绍了css3过渡transition效果实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 本文实例为大家分享了CSS3过渡transition效果,供大家参考,具体内容如下 效果图: 实现代码: transition.html 立即学习“前端免费学习笔记(深入)”; T…

      2025年12月23日 好文分享
      000

    发表回复

    登录后才能评论
    关注微信