Docusaurus 客户端 API
Docusaurus 提供了一些客户端 API,帮助你搭建网站。
组件
<ErrorBoundary />
这个组件会创建一个 React 错误边界。
用它来包裹可能抛出错误的组件,并在发生这种情况时显示备用界面,而不会让整个应用崩溃。
import React from 'react';
import ErrorBoundary from '@docusaurus/ErrorBoundary';
const SafeComponent = () => (
<ErrorBoundary
fallback={({error, tryAgain}) => (
<div>
<p>这个组件崩溃了,因为错误:{error.message}.</p>
<button onClick={tryAgain}>再试一次!</button>
</div>
)}>
<SomeDangerousComponentThatMayThrow />
</ErrorBoundary>
);
看看实际效果,点这里:
Docusaurus 用这个组件来捕捉主题布局中以及整个应用中的错误。
这个组件不会捕捉构建时抛出的错误,只会保护有状态的 React 组件在客户端渲染时可能发生的错误。
属性
fallback
: 一个可选的渲染回调,返回一个 JSX 元素。 它会收到一个具有两个属性的对象:error
,被捕捉的错误,和tryAgain
,一个函数回调 (() => void
),用来重置组件中的错误并尝试重新渲染它。 如果 fallback 不存在,@theme/Error
会被渲染。@theme/Error
默认用于在布局上层包裹整个站点的错误边界。
fallback
prop 是一个回调,不是一个 React 函数组件。 你不能在这个回调中使用 React 钩子。
<Head/>
此可复用的 React 组件将管理您向文档头做出的所有更改。 它接受纯 HTML 标签作为参数,输出也是纯 HTML 标签,且对新手友好。 这是 React Helmet 的封装。
示例用法:
import React from 'react';
import Head from '@docusaurus/Head';
const MySEO = () => (
<Head>
<meta property="og:description" content="我的自定义描述" />
<meta charSet="utf-8" />
<title>我的标题</title>
<link rel="canonical" href="http://mysite.com/example" />
</Head>
);
嵌套或之后使用的组件将覆盖先前使用的组件:
<Parent>
<Head>
<title>我的标题</title>
<meta name="description" content="Helmet 应用" />
</Head>
<Child>
<Head>
<title>嵌套标题</title>
<meta name="description" content="嵌套组件" />
</Head>
</Child>
</Parent>
会输出:
<head>
<title>嵌套标题</title>
<meta name="description" content="嵌套组件" />
</head>
<Link/>
此组件链接到内部页面,同时提供强大的预加载功能。 预加载让用户在使用此组件导航之前预先加载资源。 我们用 IntersectionObserver
让位于视窗内的 <Link>
发送低优先级抓取请求,随后在用户可能前往被请求的资源时,用 onMouseOver
事件来触发高优先级请求。
此组件是 react-router 的 <Link>
组件封装,同时添加了一些 Docusaurus 的专有改进。 所有的 props 都会被传递给 react-router 的 <Link>
组件。
外部链接也能正常工作,并且会自动拥有这些 props: target="_blank" rel="noopener noreferrer"
。
import React from 'react';
import Link from '@docusaurus/Link';
const Page = () => (
<div>
<p>
看看我的<Link to="/blog">博客</Link>吧!
</p>
<p>
{/* highlight-next line */}
关注我的<Link to="https://twitter.com/docusaurus">Twitter</Link>!
</p>
</div>
);
to
: string
导航的目标位置。 示例: /docs/introduction
。
<Link to="/courses" />
建议用这个组件,而不是原生的 <a>
标签,因为如果你用 <Link>
,Docusaurus 会做很多优化(比如无效链接探测、预抓取、添加 base URL……)。
<Redirect/>
渲染 <Redirect>
组件将导航至新的位置。 新位置会覆盖历史记录栈的现有位置,效果类似服务端重定向 (HTTP 3xx)。 您可参阅 React Router 的重定向文档来了解更多可传入的属性。
Example usage:
import React from 'react';
import {Redirect} from '@docusaurus/router';
const Home = () => {
return <Redirect to="/docs/test" />;
};
@docusaurus/router
实现了 React Router 且兼容其功能特性。
<BrowserOnly/>
<BrowserOnly>
组件允许某些 React 组件只在 React 应用注水后才在浏览器中渲染。
用它整合某些不能在 Node.js 中运行的代码,比如如果代码要访问 window
或 document
对象。
属性
children
: 一个渲染函数,返回只在浏览器中被渲染的 JSX。 不会在 Node.js 中被执行。fallback
(可选): 在服务器 (Node.js) 上渲染的 JSX,直到 React 注水完毕后被替换为真实内容。
代码示例
import BrowserOnly from '@docusaurus/BrowserOnly';
const MyComponent = () => {
return (
<BrowserOnly>
{() => <span>page url = {window.location.href}</span>}
</BrowserOnly>
);
};
使用库的示例
import BrowserOnly from '@docusaurus/BrowserOnly';
const MyComponent = (props) => {
return (
<BrowserOnly fallback={<div>Loading...</div>}>
{() => {
const LibComponent = require('some-lib').LibComponent;
return <LibComponent {...props} />;
}}
</BrowserOnly>
);
};
<Interpolate/>
一个简单的插值组件,用于包含动态占位符的文本。
占位符会被替换为你提供的动态值和 JSX 元素(字符串、链接、样式元素等)。
属性
children
: 含有类似{placeholderName}
的插值占位符的文本values
: 包含插值占位符对应的值的对象
import React from 'react';
import Link from '@docusaurus/Link';
import Interpolate from '@docusaurus/Interpolate';
export default function VisitMyWebsiteMessage() {
return (
<Interpolate
values={{
firstName: '思达',
website: (
<Link to="https://docusaurus.io" className="my-website-class">
网站
</Link>
),
}}>
{'你好,{firstName}! 你好吗? 看看我的{website}吧'}
</Interpolate>
);
}
<Translate/>
When localizing your site, the <Translate/>
component will allow providing translation support to React components, such as your homepage. <Translate>
组件支持插值.
The translation strings will statically extracted from your code with the docusaurus write-translations
CLI and a code.json
translation file will be created in website/i18n/[locale]
.
<Translate/>
的所有属性必须是硬编码的字符串。
除了插值用到的 values
属性,你不能用变量,否则静态提取就不能工作。