react16笔记(1)
2025年,二开项目基础版本 react v16+,当前文档 v19,差别应该不大,记录一下看文档的学习笔记。
基础知识
- 以 use 开头的函数被称为 Hook,只能在函数组件主体(或其他 Hook)顶层调用。
如果想在一个条件或循环中使用 useState,需要提取一个新的组件并在组件内部使用它。 - 组件和 Hook 中的纯净性是 React 的一个关键规则:
组件必须是幂等的:对一样的输入props、state 和 context,返回相同的输出。
副作用必须在渲染之外运行(React 可能会多次渲染组件以创建最佳的用户体验)。
属性和状态是不可变的(一个组件的属性和状态是针对单次渲染不可变)。永远不要直接修改。
Hook 的返回值和参数是不可变的,一旦值被传递给 Hook,不应该修改。
值在被传递给 JSX 后是不可变的,如需修改,在创建之前进行修改。 - React 负责在必要时渲染组件和 Hook ,它是
声明式
的:只要在组件逻辑中告诉 React 需要渲染什么。永远不要直接调用组件函数。永远不要将 Hook 作为常规值传递。 - 只在顶层调用 Hook。只在 React 函数中调用 Hook。
- 一个常见的具有副作用的例子是突变(mutation),在 JavaScript 中指的是改变一个非原始值的值。尽量进行局部 mutation。
react@19.1
Hook
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// 状态帮助组件
const [index, setIndex] = useState(0);
// 上下文帮助组件(从祖先组件接收信息,而无需将其作为 props 传递)
const theme = useContext(ThemeContext);
// ref 允许组件保存一些不用于渲染的信息,比如 DOM 节点或 timeout ID。
// 与状态不同,更新 ref 不会重新渲染组件。用于非 React 系统如浏览器内置 API 一同工作时。
const inputRef = useRef(null)
// Effect 允许组件连接到外部系统并与之同步,eg:处理网络、浏览器、DOM、动画、使用不同 UI 库编写的小部件以及其他非 React 代码。
useEffect(() => {
const connection = createConnection(roomId);
connection.connect();
return () => connection.disconnect();
}, [roomId]);
// useLayoutEffect 在浏览器重新绘制屏幕前执行,可以在此处测量布局。
// useInsertionEffect 在 React 对 DOM 进行更改之前触发,可以在此处插入动态 CSS。
// 优化重新渲染性能:告诉 React 重用缓存的计算结果,或者如果数据自上次渲染以来没有更改,则跳过重新渲染。
// 使用 useMemo 缓存计算代价昂贵的计算结果。
const visibleTodos = useMemo(() => filterTodos(todos, tab), [todos, tab]);
// 使用 useCallback 将函数传递给优化组件之前缓存函数定义。
const cachedFn = useCallback(fn, dependencies)
// useTransition 允许将状态转换标记为非阻塞,并允许其他更新中断它。
// useDeferredValue 允许延迟更新 UI 的非关键部分,以让其他部分先更新。组件(这里的 react 内置组件感觉不常用)
通常使用 <>…</> 代替,它们都允许你在不添加额外节点的情况下将子元素组合。
【生产环境禁用】使用
1 |
|
【开发环境】使用 StrictMode 来启用组件树内部的额外开发行为和警告
- API
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24// act 是个测试辅助工具,用于在断言前应用待处理的 React 更新。
await act(async actFn)
// cache 允许缓存数据获取或计算的结果。仅供与 React 服务器组件 一起使用。
const cachedFn = cache(fn);
// 【开发环境】captureOwnerStack 读取当前宿主环境的堆栈
const stack = captureOwnerStack();
// 使用 createContext 创建组件能够提供与读取的 上下文
const SomeContext = createContext(defaultValue)
// lazy 能够让你在组件第一次被渲染之前延迟加载组件的代码。
const SomeComponent = lazy(load)
// memo 允许你的组件在 props 没有改变的情况下跳过重新渲染。
const MemoizedComponent = memo(SomeComponent, arePropsEqual?)
// startTransition 可以让你在后台渲染 UI 的一部分。
startTransition(action)
// use 是一个 React API,读取类似于 Promise 或 context 的资源的值。
// 与 React Hook 不同的是,可以在循环和条件语句(如 if)中调用 use。但需要注意的是,调用 use 的函数仍然必须是一个组件或 Hook。
const value = use(resource);
react-domt@19.1
Hook
1
2
3
4// useFormStatus 是一个提供上次表单提交状态信息的 Hook。
// useFormStatus 不会返回在同一组件中渲染的 <form> 的状态信息。
// 必须从在 <form> 内渲染的组件中调用。
const { pending, data, method, action } = useFormStatus();组件
1
2
3
4
5
6
7
8
9
10<form action={search}>
<input name="query" />
<textarea name="postContent" />
<select>
<option value="someOption">Some option</option>
<option value="otherOption">Other option</option>
</select>
<progress value={0.5} />
<button type="submit">Search</button>
</form>
1 |
|
API
createPortal 允许你将 JSX 作为 children 渲染至 DOM 的不同部分。1
2
3
4<div>
<SomeComponent />
{createPortal(children, domNode, key?)}
</div>flushSync 允许你强制 React 在提供的回调函数内同步刷新任何更新,这将确保 DOM 立即更新。
preconnect 可以帮助提前连接到一个期望从中加载资源的服务器。
prefetchDNS 允许提前查找期望从中加载资源的服务器的 IP。
preinit 可以预获取和评估样式表或外部脚本。
preinitModule 可以预获取和评估 ESM 模块。
preload 可以预获取期望使用的资源,比如样式表、字体或外部脚本。
preloadModule 可以急切地预获取期望使用的 ESM 模块。客户端API
react-dom/client API 允许你在客户端(浏览器)渲染 React 组件。这些 API 通常在应用程序顶层调用,以初始化 React 树。大多数组件不需要导入或使用这些 API。
createRoot 允许在浏览器的 DOM 节点中创建根节点以显示 React 组件。
hydrateRoot 函数允许你在先前由 react-dom/server 生成的浏览器 HTML DOM 节点中展示 React 组件。服务端API
react-dom/server API 允许你通过服务端渲染将 React 组件渲染为 HTML。这些 API 仅在服务器应用程序顶层调用,以生成初始 HTML。大多数组件不需要导入或使用这些 API。
renderToPipeableStream 将一个 React 组件树渲染为管道化(pipeable)的 Node.js 流。
renderToReadableStream 将 React 树渲染后发送至 Web 可读流。
renderToStaticMarkup 会将非交互的 React 组件树渲染成 HTML 字符串。
renderToString 将 React 树渲染为一个 HTML 字符串。static APIs
react-dom/static API 允许你为 React 组件生成静态 HTML。大多数组件不需要导入或使用这些 API。
prerender 使用 Web Stream 将 React 树渲染为静态 HTML 字符串。
prerenderToNodeStream renders a React tree to a static HTML string using a Node.js Stream..
javascript
以下这些特殊的 React 属性适用于所有内置组件:
(1)children:React 节点(可以是元素、字符串、数字、portal,如 null,undefined 这样的空节点和布尔值,或其他 React 节点数组)。children 属性指定了组件内部的内容。当使用 JSX 时,通常会通过嵌套标签
(2)dangerouslySetInnerHTML:其中包含原始的 HTML 字符串。
(3)ref:使用 useRef 或者 createRef 的 ref 对象,或者一个 ref 回调函数,再或者一个用于 传统 ref 的字符串。ref 将被填充为此节点的 DOM 元素。
(4)suppressContentEditableWarning:布尔值。如果为 true 将会抑制 React 对同时具有 child 和 contentEditable={true} 属性的元素发出的警告。
(5)suppressHydrationWarning:布尔值。如果你使用 服务器渲染,通常会在服务器和客户端渲染不同内容时发出警告。
(6)style:CSS 样式对象,使用像 camelCase 这样的驼峰命名法。
所有内置组件也支持这些标准的 DOM 属性:
accessKey:为该元素指定一个键盘快捷键。通常不建议使用
。
aria-*:指定辅助功能树信息。
autoCapitalize:指定用户输入的大小写形式。
className:指定元素的 CSS 类名。阅读更多关于应用 CSS 样式的内容。
contentEditable:一个布尔值。如果为 true,浏览器允许用户直接编辑渲染的元素。
data-*:数据属性允许你将一些字符串数据附加到元素上,例如 data-fruit=”banana”。由于通常会从 props 与 state 中读取数据,因此在 React 中不常用此属性
。
dir:值为 ltr 与 rtl 之一,指定元素的文本方向。
draggable:布尔值,指定元素是否可拖动。
enterKeyHint:字符串,指定虚拟键盘上的回车键应该呈现哪种操作。
htmlFor:字符串,用于
onAnimationEnd(onAnimationEndCapture):在 CSS 动画完成时触发。
onAnimationIteration(onAnimationIterationCapture):当 CSS 动画的一次迭代结束并开始另一个迭代时触发。
onAnimationStart(onAnimationStartCapture):当 CSS 动画开始时触发。
onAuxClick(onAuxClickCapture):当非主要指针按钮被点击时触发。
onBeforeInput(onBeforeInputCapture):在可编辑元素的值被修改之前触发。React 尚未使用原生的 beforeinput 事件
。
onBlur(onBlurCapture):当元素失去焦点时触发。与内置的浏览器 blur 不同,在 React 中,onBlur 事件会冒泡
。
onClick(onClickCapture):当指针设备上的主按钮被点击时触发。
onCompositionStart(onCompositionStartCapture):当输入法编辑器开始新的组合会话时触发。
onCompositionEnd(onCompositionEndCapture):在输入法编辑器完成或者取消组合会话时触发。
onCompositionUpdate(onCompositionUpdateCapture):在输入法输入法编辑器收到一个新的字符时触发。
onContextMenuCaptureonContextMenu():当用户尝试打开上下文菜单时触发。
onCopy(onCopyCapture):当用户尝试将某些内容复制到剪贴板时触发。
onCut(onCutCapture):当用户尝试将某些内容剪切到剪贴板时触发。
onDoubleClick(onDoubleClickCapture):在用户双击时触发。对应于浏览器 dblclick 事件。
onDrag(onDragCapture):当用户拖拽某些元素时触发。
onDragEnd(onDragEndCapture):当用户停止拖拽元素时触发。
onDragEnter(onDragEnterCapture):当拖动的元素进入有效的放置目标时触发。
onDragOver(onDragOverCapture):当拖动的元素进入有效的放置目标完成时触发。你需要声明 e.preventDefault() 去允许拖拽。
onDragStart(onDragStartCapture):当用户开始拖拽元素时触发。
onDrop(onDropCapture):当元素被拖放到有效的目标区域时触发。
onFocus(onFocusCapture):当元素失去焦点时触发。与内置的浏览器 focus 时间不同,在 React 中,onFocus 事件会冒泡
。
onGotPointerCapture(onGotPointerCaptureCapture):当元素以编程方式捕获指针时触发。
onKeyDown(onKeyDownCapture):当按键被按下时触发。
onKeyPress:此属性已废弃,请使用 onKeyDown 或 onBeforeInput 替代
。
onKeyUp(onKeyUpCapture):当按键被释放时触发。
onLostPointerCapture(onLostPointerCaptureCapture):当元素停止捕获指针时触发。
onMouseDown(onMouseDownCapture):当指针按下时触发。
onMouseEnter:当指针在元素内移动时触发。没有捕获阶段。
onMouseLeave:当指针移动到元素外部时触发。没有捕获阶段。
onMouseMove(onMouseMoveCapture):当指针改变坐标时触发。
onMouseOut(onMouseOutCapture):当指针移动到元素外部或移动到子元素时触发。
onMouseUp(onMouseUpCapture):当指针释放时触发。
onPointerCancel(onPointerCancelCapture):当浏览器取消指针交互时触发。
onPointerDown(onPointerDownCapture):当指针变为活动状态时触发。
onPointerEnter:当指针在元素内移动时触发。没有捕获阶段。
onPointerLeave:当指针移动到元素外部时触发。没有捕获阶段。
onPointerMove(onPointerMoveCapture):当指针改变坐标时触发。
onPointerOut(onPointerOutCapture):当指针移动到元素外部时触发,如果指针交互被取消以及 其他一些原因。
onPointerUp(onPointerUpCapture):当指针不再活动时触发。
onPaste(onPasteCapture):当用户尝试从剪贴板粘贴内容时触发。
onScroll(onScrollCapture):当元素被滚动时触发。此事件不会冒泡。
onSelect(onSelectCapture):在可编辑元素内部的选择更改后触发,例如输入框。React 扩展了 onSelect 事件以适用于 contentEditable={true} 元素。此外,React 还将其扩展为在空选择和编辑时触发(可能会影响选择)。
onTouchCancelCaptureonTouchCancel():当浏览器取消触摸交互时触发。
onTouchEnd(onTouchEndCapture):当一个或多个触摸点被移除时触发。
onTouchMove(onTouchMoveCapture):当一个或多个触点移动时,会触发火灾。
onTouchStart(onTouchStartCapture):当一个或多个触摸点被放置时触发。
onTransitionEnd(onTransitionEndCapture):当 CSS 过渡完成时触发。
onWheel(onWheelCapture):当用户旋转滚轮按钮时触发。
role:一个字符串。为辅助技术明确指定元素角色
slot:一个字符串。当使用 shadow DOM 时,指定插槽名称。在 React 中,通常通过将 JSX 作为 props 传递来实现等效模式。例如 <Layout left={
spellCheck:布尔值或空值。如果明确设置为 true 或 false,则启用或禁用拼写检查。
tabIndex:一个数字。覆盖默认的 Tab 按钮行为。避免使用除了 -1 和 0 以外的值。
title:一个字符串。指定元素的工具提示文本。
translate:’yes’ 或者 ‘no’。选择 ‘no’ 将排除元素内容的翻译。
你还可以将自定义属性作为 props 传递。例如 mycustomprop=”someValue”。当与第三方库集成时,这可能很有用。但是自定义属性名称必须为小写,并且不能以 on 开头。该值将被转换为一个字符串。如果你传递 null 或 undefined,则自定义属性将被删除。
这些事件仅适用于
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!