• 9. React18之useTransition与useDeferredValue


    • useDeferredValue: 返回一个状态值表示过渡任务的等待状态,以及一个启动该过渡任务的函数
    • useDeferredValue接受一个值,并返回该值的新副本,该副本将推迟到更紧急的更新之后

    1. 使用useTransition钩子函数,导出pendding状态和startTransition

          let {  useTransition } = React;
          const [ pending, startTransition ] = useTransition(); // 增加loading效果
    	  const handleChange = (ev) => {
              setSearchWord(ev.target.value)  //第一个任务
    
              // 添加延时过渡
              startTransition(()=>{
                setQuery(ev.target.value)   //第二个任务(不紧急的任务)
              })
            }
            
            return (
    		<>
    		{
                  pending? <div>loading...</div> : <List query={query} />
            }
    		</>
    	)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    完整代码

        <script type="text/babel">
          let app = document.querySelector('#app');
          let root = ReactDOM.createRoot(app);
          let { memo, useState, useTransition} = React;
    
          let List = memo(({query})=>{
            const text = 'hello world'
            const items = []
            // 匹配输入的选项并且高亮
            if( query !== '' && text.includes(query) ){
              const arr = text.split(query);
              for(let i=0;i<10000;i++){
                items.push(<li key={i}>{arr[0]}<span style={{color:'red'}}>{query}</span>{arr[1]}</li>)
              }
            }
            else{
              for(let i=0;i<10000;i++){
                items.push(<li key={i}>{text}</li>);
              }
            }
    
            return (
              <ul>
                { items }
              </ul>
            )
          })
    
          let Welcome = memo(()=>{
            const [ searchWord, setSearchWord ] = useState('');
            const [ query, setQuery ] = useState('');
            const [ pending, startTransition ] = useTransition(); // 增加loading效果
            const handleChange = (ev) => {
              setSearchWord(ev.target.value)  //第一个任务
    
              // 添加延时过渡
              startTransition(()=>{
                setQuery(ev.target.value)   //第二个任务(不紧急的任务)
              })
            }
            return (
              <div>
                <input type="text" value={searchWord} onChange={handleChange} />
                {
                  pending? <div>loading...</div> : <List query={query} />
                }
              </div>
            )
          })
    
          let Element = (
            <Welcome />
          );
          
          root.render(Element)
    
        </script>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57

    2. 使用useDeferredValue ,获取返回值的新副本

          let { memo, useState, useTransition, useDeferredValue } = React;
          let Welcome = memo(()=>{
            const [ searchWord, setSearchWord ] = useState('');
            const query = useDeferredValue(searchWord) // query就是不紧急的值(就是延迟后的值)
       
            const handleChange = (ev) => {
              setSearchWord(ev.target.value)  //第一个任务
            }
            return (
              <div>
                <input type="text" value={searchWord} onChange={handleChange} />
                <List query={query} />
              </div>
            )
          })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
  • 相关阅读:
    C#源代码生成器深入讲解一
    [附源码]Python计算机毕业设计SSM流浪猫狗救助站(程序+LW)
    【极术读书】赠卡活动第二期,免费领极客时间月卡系统学习技术管理
    Ubuntu22.04 虚拟机中搭建 DPDK 开发环境
    Java并发编程-前期准备知识-上
    C语言——数组详解
    JAVAEE框架技术之17之SSM综合案例 角色管理
    最大网络流算法之dinic算法
    因果发现方法概述
    如何利用CANN DVPP进行图片的等比例缩放?
  • 原文地址:https://blog.csdn.net/qq_35812380/article/details/132955238