react 18,react17新增特性

  react 18,react17新增特性

  本文将带您了解react18的新概念Transition,并简要介绍如何使用新的API:startTransition和hooks:useTransition和usedeferredValue。希望对你有帮助!

  在React 18中引入了一个新概念——transition,它带来了一个新的API —— Start Transition和两个新的钩子3354 Use Transition和usedeferredValue。本文介绍了早期采用者的使用。【相关推荐:Redis视频教程】

  1. 总览

  本文分为四个部分:

  谭情境的本意:开始过渡使用和引入使用过渡使用和引入使用默认值使用和引入2. transition产生初衷

  Transition直接翻译为过渡。过渡本质上是为了解决渲染并发的问题而提出的。在React中,一旦组件状态改变并且重新渲染被触发,渲染就不能停止。在组件重新呈现之前,页面无法继续响应用户交互。

  因此,react 18中的更新可以分为以下两类:

  紧急更新:用户期望立即响应的更新操作,如鼠标点击或键盘输入。过渡更新:一些延迟可接受的更新操作,如查询、搜索推荐、显示搜索结果等。//被StartTransit标记后,是过渡更新。

  startTransition(()={

  //非紧急更新会降低优先级,延迟执行。

  setQueryValue(输入值)

  })

  //如果没有标记,则立即执行。

  react 18中startTrionstion标记的setInputValue(输入值)的更新是过渡性更新(执行优先级降低)。此时,react将根据内部调度机制延迟内部状态更新。

  开发人员可以通过transition hook决定哪些更新被标记为转换事件。一旦被标记,就意味着低优先级执行,即react知道状态可以延迟更新,通过区分更新优先级,可以保持高优先级事件响应,提高用户交互体验,保持页面响应。

  3. startTransiton

  startTransiton使用介绍

  const handleClick=()={

  //startTransition包被标记为低优先级更新。

  startTransition(()={

  setQueryValue(输入值)

  })

  //如果没有标记,则立即执行。

  设置输入值(输入值)

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

  StartTransiton是一个接受回调的函数,用来告诉React需要延迟更新的状态。如果一个状态的更新会导致组件挂起,那么应该在startTransition中将它包装成通过演示对比

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

  我们尝试连续输入123,监测搜索框值(紧急更新)和searchValue搜索值(过渡更新)的变化,输出到控制栏。

  从“react”导入React,{ useEffect,useState,start transition };

  “导入”。/App.css

  const SearchResult=(props)={

  const resultList=props.query

  ?Array.from({ length: 10000 },(_,index)=({

  id:索引,

  关键字:` $ { props . query }-搜索结果$ {index } `,

  })) : [];

  返回resultList.map(({ id,keyword })=(

  li key={id}{keyword}/li

  ))

  }

  const App=()={

  const [type,setTpye]=useState(1)

  const [value,setValue]=use state();

  const [searchVal,setSearchVal]=useState(-);

  useEffect(()={

  //侦听搜索值的更改

  Console.log(对搜索值更新的响应 searchVal )

  },[searchVal])

  useEffect(()={

  Console.log(对输入框值更新的响应-)

  if (type===1) {

  setSearchVal(值 -)

  }

  if (type===2) {

  startTransition(()={

  setSearchVal(值 -)

  })

  }

  },[值,类型]);

  返回(

  div className=App

  输入值={ value } onChange={ e=setValue(e . target . value)}/

  div class name={ ` type _ button $ { type===1?type _ button _ checked : } `} onClick={()=setTpye(1)} normal/div

  div class name={ ` type _ button $ { type===2?type _ button _ checked : } `} onClick={()=setTpye(2)} transition/div

  保险商实验所

  搜索结果查询={searchVal}/SearchResult

  /ul

  /div

  );

  };在正常模式下

  如图:连续输入字符123。当输入第一个字符时,搜索值会立即响应,列表渲染会立即开始,导致卡顿输入框停止响应用户输入,直到渲染完成,输入框才会继续响应。

  开始过渡

  如图:连续输入字符123,输入框连续响应,搜索值响应延迟,保证页面反馈。直到输入结束,页面才响应搜索值,呈现搜索结果,并保留页面响应。

  4. useTransiton

  useTransiton使用介绍

  从“react”导入{ useTransiton }

  const [isPending,start transition]=use transition({ time out ms:2000 })

  //例如,在挂起状态下,可以显示一个微调器

  { isPending?Spinner/:null }startTransition是一个接受回调的函数,用来告诉React需要延迟更新的状态。IsPending是一个布尔值,react通过它告诉我们是否要等待转换完成。UseTransition接受带有timeoutMs的延迟响应的值。如果给定的timeoutMs没有完成,它将强制更新startTransition回调函数中的状态。useTransiton简单分析

  让我们通过伪代码来理解useTransition。

  函数useTransition(){

  const [isPending,set pending]=mount state(false);

  常量开始=(回调)={

  setPending(真);

  //Scheduler.unstable_next通过transiton模式,回调函数以低优先级调度执行。

  //您可以降低更新的优先级。如果回调中触发的更新优先级较低,

  //它会让位于高优先级的更新,或者当当前事务繁忙时,它会被调度应用到下一个空闲期。

  Scheduler.unstable_next(()={

  const prev transition=reactcurrentbatchconfig . transition;

  reactcurrentbatchconfig . transition=1;

  尝试{

  setPending(假);

  //实现回调函数

  回调();

  }最后{

  reactcurrentbatchconfig . transition=prev transition;

  }

  })

  }

  return [isPending,start];

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

  5. useDeferredValue

  useDeferredValue使用介绍

  const [value,setValue]=useState( )

  //defferedValue值晚于状态更新。

  const Deferred Value=use Deferred Value(Value,{ timeoutMs:2000 })use Deferred Value返回延迟响应的状态,可以设置最大延迟时间time out ms。可以传入可选的timeoutMs,如果在给定的timeoutMs内没有完成,将强制更新。与useTransition的不同:useTransition是处理一段逻辑,而useDeferred是生成一个新的状态。useDeferredValue的使用

  从“react”导入React,{ useEffect,useState,useTransition,useDeferredValue };

  “导入”。/App.css

  const SearchResult=(props)={

  const resultList=props.query

  ?Array.from({ length: 10000 },(_,index)=({

  id:索引,

  关键字:` $ { props . query }-搜索结果$ {index } `,

  })) : [];

  返回resultList.map(({ id,keyword })=(

  li key={id}{keyword}/li

  ))

  }

  const App=()={

  const [value,setValue]=use state();

  const search value=useDeferredValue(value,{ time out ms:2000 });

  useEffect(()={

  Console.log(对输入框值的响应-)

  },[值])

  useEffect(()={

  //侦听搜索值的更改

  Console.log(对searchValue的更新响应 searchvalue )

  },[搜索值])

  返回(

  div className=App

  输入值={ value } onChange={ e=setValue(e . target。值)}/

  div class name={ ` type _ button type _ button _ checked ` } useDeferredValue/div

  保险商实验所

  搜索结果查询={搜索值}/搜索结果

  /ul

  /div

  );

  };

  useDeferredValue简单分析

  我们通过伪代码理解下useDeferredValue。

  函数useDeferredValue(值){

  const [prevValue,setValue]=updateState(value);

  updateEffect(()={

  //在使用效果中通过过渡模式来更新价值。

  Scheduler.unstable_next(()={

  const prev transition=reactcurrentbatchconfig。过渡;

  reactcurrentbatchconfig。过渡=1;

  尝试{

  设置值(值);

  }最后{

  reactcurrentbatchconfig。过渡=前一次过渡;

  }

  })

  },[值]);

  返回前值

  }useDeferredValue通过使用效果监听传入值的变化,然后通过过渡任务执行值的改变。这样保证双爆炸成形环默认值的更新滞后于setState,同时符合过渡更新的原则,因为是通过过渡调度机制执行的。

  更多编程相关知识,请访问:编程视频!以上就是浅析react18中的新概念过渡的详细内容,更多请关注我们其它相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: