react18 新特性 useTransition
react 18环境说明
脚手架
安装 create-react-app
npm install -g create-react-app
create-react-app demo-react
环境配置
将 package.json 里面的 "dependencies" 下面 react 的版本由稳定版 rea17 切换为 18beta版本
切换命令
npm uninstall react react-dom --save
npm install react@beta react-dom@beta --save
代码调整
将 src/index.js 进行调整
调整前
import React from 'react';
import { render } from 'react-dom';
import App from './App';render(<App />, document.getElementById('root'));
调整后
import React from 'react';
import { createRoot } from 'react-dom';
import App from './App';const root = createRoot(document.getElementById('root'));
root.render(<App />);
useTransition 使用说明
可以用来降低渲染优先级。分别用来包裹计算量大的 function和 value,降低优先级,减少重复渲染次数。
举个例子:搜索引擎的关键词联想。一般来说,对于用户在输入框中输入都希望是实时更新的,如果此时联想词比较多同时也要实时更新的话,这就可能会导致用户的输入会卡顿。这样一来用户的体验会变差,这并不是我们想要的结果。
我们将这个场景的状态更新提取出来:一个是用户输入的更新;一个是联想词的更新。这个两个更新紧急程度显然前者大于后者。
以前我们可以使用防抖的操作来过滤不必要的更新,但防抖有一个弊端,当我们长时间的持续输入(时间间隔小于防抖设置的时间),页面就会长时间都不到响应。而 startTransition 可以指定 UI 的渲染优先级,哪些需要实时更新,哪些需要延迟更新。即使用户长时间输入最迟 5s 也会更新一次,官方还提供了 hook 版本的 useTransition,接受传入一个毫秒的参数用来修改最迟更新时间,返回一个过渡期的pending 状态和startTransition函数。
源码如下:
import React, { useState, useTransition } from 'react';export default function Demo() {const [value, setValue] = useState('');const [searchQuery, setSearchQuery] = useState([]);const [loading, startTransition] = useTransition(2000);const handleChange = (e) => {setValue(e.target.value);// 延迟更新startTransition(() => {setSearchQuery(Array(20000).fill(e.target.value));});};return (<div className="App"><input value={value} onChange={handleChange} />{loading ? (<p>loading...</p>) : (searchQuery.map((item, index) => <p key={index}>{item}</p>))}</div>);
}
效果如下:
效果是不是和我们平时写的防抖差不多
探索 useTransition 源码
首先下载react18的源码,进入目录 packages\react\src\ReactHooks.js
接着查看 函数 resolveDispatcher
接着在目录 packages\react\src\ReactCurrentDispatcher.js 查找 对象 ReactCurrentDispatcher
然后进入目录 packages\react-reconciler\src\ReactInternalTypes.js,查找 Dispatcher
在目录 packages\react\src\ReactStartTransition.js,查找 startTransition 函数
参考资料
- React迁移至18beta版本
- 一文梳理 React 18 新特性
react18 新特性 useTransition相关推荐
- React18升级和React18新特性
背景: React官方在2022年3月29日React18版本正式发布了. 可以在官网看到,react 17 的发布时间是 2020 年 10 月 20 号,距离 React 18 发布足足间隔一年半 ...
- React16、17、18版本新特性
react-16版本新特性 一.hooks import { useState } from 'react'function App() {// 参数:状态初始值比如,传入 0 表示该状态的初始值为 ...
- React 18 新特性(三):渐变更新
文章目录 前言 一.startTransition:渐变更新 举个例子 模拟代码实现这个例子 启用渐变更新 二.useDeferredValue:返回一个延迟响应的值 三.useTransition ...
- 你必须了解的 React 18 新特性
你必须了解的 React 18 新特性 你必须了解的 React 18 新特性 1. React 18是什么? 2. 升级到 React 18 3. React 17 的问题 4. React 18 ...
- 我要学ASP.NET MVC 3.0(一): MVC 3.0 的新特性
摘要 MVC经过其1.0和2.0版本的发展,现在已经到了3.0的领军时代,随着技术的不断改进,MVC也越来越成熟.使开发也变得简洁人性化艺术化. 园子里有很多大鸟都对MVC了如指掌,面对问题犹同孙悟空 ...
- .NET 4.0 Interop新特性ICustomQueryInterface (转载)
.NET 4.0 Interop新特性ICustomQueryInterface 在.NET Framework v4.0发布的新功能中,在名字空间System.Runtime.InteropServ ...
- oracle如何查询虚拟列,Oracle11g新特性之--虚拟列(VirtualColumn)
Oracle 11g新特性之--虚拟列(Virtual Column) Oracle 11G虚拟列Virtual Column介绍 在老的 Oracle 版本,当我们需要使用表达式或者一些计算公式时, ...
- mysql8导入 psc 没有数据_新特性解读 | MySQL 8.0.22 任意格式数据导入
作者:杨涛涛 资深数据库专家,专研 MySQL 十余年.擅长 MySQL.PostgreSQL.MongoDB 等开源数据库相关的备份恢复.SQL 调优.监控运维.高可用架构设计等.目前任职于爱可生, ...
- mysql query browswer_MySQL数据库新特性之存储过程入门教程
MySQL数据库新特性之存储过程入门教程 在MySQL 5中,终于引入了存储过程这一新特性,这将大大增强MYSQL的数据库处理能力.在本文中将指导读者快速掌握MySQL 5的存储过程的基本知识,带领用 ...
最新文章
- 不要去追一匹马,用追马的时间种草
- MATLAB中的分类器
- 中科罗伯特工业机器人_「聚焦中日韩产业博览会」丈夫看机器人,妻子忙采购...
- 获取一个窗口的所有子窗口(包括嵌套) - 回复 asian 的问题
- LTTng 简介使用实战
- 微软重拳出击:盗版 Windows 将无处遁形!
- 数据处理入门干货:MongoDB和pandas极简教程
- AVEVA软件编程是C语言么,AVEVA PDMS 三维文字工具
- android 键盘遮盖输入框_android弹出输入框,软键盘挡住部分编辑框
- mongodb默认的用户名密码_Windows下MongoDB设置用户、密码
- 错误C2398:从“double”转换为“float”需要缩小转换
- Nginx 学习总结(4)—— Rewrite 模块
- linux-文件系统格式区别xfs、ext4、ext3、ext2、vfat、swap、EFI system partition
- java如何防止sql注入
- 怀旧服务器联盟优势,魔兽世界tbc联盟服务器选哪个_wowtbc怀旧服联盟服务器排名_3DM网游...
- Human Pose Estimation姿态估计调研
- jy-09-SERVLETJSP——Servlet-Cookie-Session
- 对不起,精英主义与特斯拉精神背道而驰
- ipc开发(liteos hi3518ev200----smaple【如何把hi1131 wifi驱动跟venc驱动整合到一个sample bin文件里面)
- xml文件消除黄色警报_新机器,XML和歧义消除