• 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
  • 相关阅读:
    HTTP协议深入理解+如何使用Fiddler抓包
    浅谈虚拟地址转换成物理地址(值得收藏)
    路由配置与mongoose模型构建
    UVA 294 约数 Divisors
    力扣 -- 132. 分割回文串 II
    云环境下集合隐私计算-解读
    containerd配置HTTP私仓
    JavaScript 运行时比较: Node.js、 Deno 和 Bun
    微信非群管理员,我实现了@所有人
    【python】python实现多线程并得到返回值
  • 原文地址:https://blog.csdn.net/qq_35812380/article/details/132955238