自定义样式类型
除了 BlockNote 提供的默认样式类型之外,您还可以使用 React 组件创建自己的自定义样式。请查看下面的演示,在其中我们向 BlockNote 编辑器添加了自定义字体样式,以及一个用于设置该样式的自定义格式工具栏按钮。
创建自定义样式类型
使用 createReactStyleSpec
函数来创建自定义样式类型。该函数接收两个参数:
function createReactStyleSpec(
styleConfig: CustomStyleConfig,
styleImplementation: ReactStyleImplementation,
);
让我们来看演示中的自定义字体样式,并逐一解释每个字段的作用:
export const Font = createReactStyleSpec(
{
type: "font",
propSchema: "string",
},
{
render: (props) => (
<span style={{ fontFamily: props.value }} ref={props.contentRef} />
),
}
);
样式配置(CustomStyleConfig
)
样式配置描述了自定义样式的结构。使用它来指定类型,以及样式是否应该接受字符串值:
type CustomStyleConfig = {
type: string;
readonly propSchema: "boolean" | "string";
};
type
定义自定义样式的标识符。
propSchema
propSchema
指定样式是仅能切换开启/关闭的("boolean"
),还是可以接受字符串值的("string"
)。支持字符串值对于例如设置样式的颜色非常有用。
在字体样式演示中,我们将其设置为 "string"
,以便存储字体族名称。
样式实现(ReactCustomStyleImplementation
)
样式实现定义了样式如何被呈现为 HTML。
type ReactCustomStyleImplementation = {
render: React.FC<{
value?: string;
contentRef: (node: HTMLElement | null) => void;
}>;
};
render
这是您的 React 组件,用于定义自定义样式的渲染方式,并接受两个 React 属性:
value:
样式的字符串值,仅当您的样式配置包含 propSchema: "string"
时可用。
contentRef:
一个 React ref
,用于标记可编辑元素。
注意,与自定义块和内联内容不同,自定义样式的 render
函数无法访问 React 上下文或其他状态。它们应当是普通的 React 函数组件,类似示例所示。
将自定义样式添加到编辑器
最后,使用您的自定义样式定义来创建一个 BlockNoteSchema:
const schema = BlockNoteSchema.create({
styleSpecs: {
// 如有需要,可启用默认样式
...defaultStyleSpecs,
// 添加您自己的自定义样式:
font: Font,
},
});
接下来,您可以使用这个自定义的 schema 来实例化您的编辑器,具体说明请参见自定义架构页面。