为了便于自定义主题,dumi 提供了一套主题 API,我们可以从 dumi/theme 中 import 出以下内容。
可获取到 dumi 的配置项、当前路由的 meta 信息、国际化语言选择项等等,context 的详细定义可 查看源代码
包装后的 umi Link,可渲染外链,自动加上外部链接图标。
包装后的 umi NavLink,可渲染外链,自动加上外部链接图标。
包装后的 umi NavLink,用于带锚点的链接,且可高亮。
Object。主题 Previewer 组件接收到的 propsString。CodeSandbox创建 demo 时调用的API地址,默认值为https://codesandbox.io/api/v1/sandboxes/defineFunction。在 CodeSandbox.io 打开 demo 的执行函数根据 Previewer 的 props 生成一个函数,执行后可在 codesandbox.io 打开该 demo,例如:
// builtins/Previewer.tsximport React from 'react';import { useCodeSandbox } from 'dumi/theme';export default props => {const openCSB = useCodeSandbox(props);return <button onClick={openCSB}>点我会在 CodeSandbox.io 上打开 demo</button>;};
Function。拷贝执行函数,执行时传入的文本会被拷贝到剪贴板'ready' | 'copied'。默认值为 ready,在执行拷贝后会变成 copied,2s 后再变回 ready,便于开发者控制复制成功的提示信息提供复制函数及复制的状态,便于实现源代码复制和状态展示,例如:
// builtins/Previewer.tsximport React from 'react';import { useCopy } from 'dumi/theme';export default props => {const [copyCode, copyStatus] = useCopy();return <button onClick={() => copyCode('Hello')}>点我会复制文字</button>;};
String。当前输入框的关键字Function。如果用户开启 algolia,则返回 algolia 的绑定函数,将输入框的 CSS 选择器传入即可,后续筛选、呈现工作全部交给 algoliaArray。如果用户未开启 algolia,则返回基于关键字的内置搜索结果,目前只能搜索标题根据配置自动提供 algolia 的绑定函数或者根据关键字返回内置搜索的检索结果,具体用法可参考 dumi 内置主题的 SearchBar 组件。
String。当前 locale 值Object。需要过滤、转换的 propsObject。过滤、转换之后的 props根据 locale 自动过滤、转换 props,便于实现国际化 FrontMatter 的定义,比如 title.zh-CN 在中文语言下会被转换为 title,具体示例可参考 dumi 内置主题的 Previewer 组件。
String。主题 Previewer 组件接收到的 identifier 参数,demo 的唯一标识符String。demo 单独打开的页面地址获取单独打开 demo 的页面地址,例如 useDemoUrl(props.identifier) 会返回类似 http://example.com/~demos/demo-id 的 URL。
String。主题 API 组件接收到的 identifier 参数,API 的唯一标识符Array。Props 属性列表获取指定组件的 API 元数据,可参考 dumi 默认主题的 API 组件实现。
String。当前的语言选项String。要在 TypeScript Playground 中转换的 TSX 代码String。前往 TypeScript Playground 的 url获取当前 TypeScript 官网 Playground 的链接,用于将 TSX 代码提交到 Playground 中展示 JSX 代码。
'light' | 'dark' | 'auto'。当前的 color 值(color: 'light' | 'dark' | 'auto') => void。设置当前 color 的函数,设置为 auto 时意味着跟随操作系统的偏好设置当我们需要为主题增加暗黑/明亮模式的切换能力时,需要用到该 API。
对于开发者而言:
[data-prefers-color=dark] 的属性选择器,在主题 Less 中增量编写暗黑模式的样式,例如.navbar { /* 明亮样式 */ }[data-prefers-color=dark] .navbar { /* 暗黑样式 */ }// 或者.navbar {/* 明亮样式 */[data-prefers-color=dark] & {/* 暗黑样式 */}}
import React from 'react';import { usePrefersColor } from 'dumi/theme';export default props => {const [color, setColor] = usePrefersColor();return (<><button onClick={() => setColor('auto')}>启用自动主题色</button>当前主题色配置为:{color}</>);};
更多信息可参考 #543。