From 6c52e62caaf7ab8c685e420fa556ba8446c7a772 Mon Sep 17 00:00:00 2001 From: macrogui <40064208+macrogui@users.noreply.github.com> Date: Fri, 18 Sep 2026 02:31:14 +0800 Subject: [PATCH] docs(cn): translate react-dom browser --- src/content/reference/react-dom/browser.md | 462 +++++++++++++++++++++ src/content/reference/react-dom/index.md | 6 + 2 files changed, 468 insertions(+) create mode 100644 src/content/reference/react-dom/browser.md diff --git a/src/content/reference/react-dom/browser.md b/src/content/reference/react-dom/browser.md new file mode 100644 index 0000000000..8c8f257047 --- /dev/null +++ b/src/content/reference/react-dom/browser.md @@ -0,0 +1,462 @@ +--- +title: browser +--- + + + +`browser` 允许你在服务端渲染期间将组件标记为仅在浏览器中渲染。 + +```js +use(browser(reason?)) +``` + + + + + +--- + +## 参考 {/*reference*/} + +### `browser(reason?)` {/*browser*/} + +在 [`use`](/reference/react/use) 内部调用 `browser`,可以在服务端渲染期间将组件标记为仅在浏览器中渲染: + +```js +import { use } from 'react'; +import { browser } from 'react-dom'; + +function BrowserOnly() { + use(browser('此组件需要使用浏览器 API。')); + return ; +} +``` + +在服务端渲染期间,`use(browser())` 会停止渲染该组件,并将最近的 [``](/reference/react/Suspense) 边界的 fallback 保留在原处。而在浏览器中,`use(browser())` 会返回 `undefined`,因此组件可以正常渲染。 + +[请参阅下面的更多示例](#usage)。 + +#### 参数 {/*parameters*/} + +* **可选** `reason`:一个字符串或函数,用于解释这段内容为什么需要在浏览器中渲染。该字符串或函数的返回值会成为传递给 [`onBrowserBailout`](#reporting-browser-only-rendering-on-the-server) 的 `Error` 的 `cause`。每当服务端渲染器遇到 `browser` 返回的值时,React 都会调用一次 reason 函数,但在浏览器中不会调用它。如果创建这个 reason 的开销较大,可以传入一个函数,例如 `() => new Error(...)`。 + +#### 返回值 {/*returns*/} + +`browser` 返回一个不透明的值,你可以在组件中将它传递给 `use`,或者在 [中止服务端渲染](#aborting-pending-server-rendering-for-the-browser) 时将它作为 reason 使用。在浏览器中,将这个值传递给 `use` 会返回 `undefined`。 + +#### 注意事项 {/*caveats*/} + +* 在服务端渲染期间,`use(browser())` 必须位于 `` 边界内。如果没有 Suspense 边界,服务端渲染将会失败。 +* `use(browser())` 必须在 [客户端组件](/reference/rsc/use-client) 中调用,而不能在 [服务端组件](/reference/rsc/server-components) 中调用。 +* 单独调用 `browser()` 不会产生任何效果。要将组件标记为仅在浏览器中渲染,请将 `browser` 返回的值传递给 `use`。不要将它抛出(throw)。 + +--- + +## 用法 {/*usage*/} + +### 仅在浏览器中渲染内容 {/*rendering-content-only-in-the-browser*/} + +在需要仅在浏览器中渲染的组件中,于 `use` 内部调用 `browser`: + +你可以用它来代替检查 `typeof window`、等待 [`Effect`](/reference/react/useEffect) 设置挂载状态,或使用框架选项来禁用服务端渲染。 + +点击 **重新加载**,可以看到初始 HTML 中的加载 fallback。在完成 hydration 之后,React 会显示从 `localStorage` 中加载的草稿。 + + + +```js src/App.js active +import { Suspense, use, useState } from 'react'; +import { browser } from 'react-dom'; + +function SavedDraft() { + use(browser('此草稿存储在 localStorage 中。')); + const [draft, setDraft] = useState( + () => localStorage.getItem('draft') ?? '' + ); + + function handleChange(event) { + const nextDraft = event.target.value; + setDraft(nextDraft); + localStorage.setItem('draft', nextDraft); + } + + return ( +