docs/(plugins)/(elements)/link.cn.mdx
最快捷添加链接功能的方式是使用 LinkKit,它包含预配置的 LinkPlugin 以及浮动工具栏和 Plate UI 组件。
LinkElement: 渲染链接元素LinkFloatingToolbar: 提供链接编辑的浮动工具栏将套件添加到插件中:
import { createPlateEditor } from 'platejs/react';
import { LinkKit } from '@/components/editor/plugins/link-kit';
const editor = createPlateEditor({
plugins: [
// ...其他插件
...LinkKit,
],
});
npm install @platejs/link
在创建编辑器时,将 LinkPlugin 包含到 Plate 插件数组中。
import { LinkPlugin } from '@platejs/link/react';
import { createPlateEditor } from 'platejs/react';
const editor = createPlateEditor({
plugins: [
// ...其他插件
LinkPlugin,
],
});
使用浮动工具栏和自定义组件配置插件。
import { LinkPlugin } from '@platejs/link/react';
import { createPlateEditor } from 'platejs/react';
import { LinkElement } from '@/components/ui/link-node';
import { LinkFloatingToolbar } from '@/components/ui/link-toolbar';
const editor = createPlateEditor({
plugins: [
// ...其他插件
LinkPlugin.configure({
render: {
node: LinkElement,
afterEditable: () => <LinkFloatingToolbar />,
},
}),
],
});
render.afterEditable: 在可编辑区域后渲染 LinkFloatingToolbar 用于链接编辑render.node: 指定 LinkElement 来渲染链接元素您可以在工具栏中添加 LinkToolbarButton 来插入和编辑链接。
LinkPlugin链接格式化插件。
<API name="LinkPlugin"> <APIOptions type="object"> <APIItem name="forceSubmit" type="boolean" optional> 决定是否强制提交链接表单。 </APIItem> <APIItem name="rangeBeforeOptions" type="RangeBeforeOptions" optional> 允许自定义 rangeBeforeOptions 配置。 - **默认值:** ```ts { matchString: ' ', skipInvalid: true, afterMatch: true, } ``` </APIItem> <APIItem name="triggerFloatingLinkHotkeys" type="string | string[]" optional> 触发浮动链接的热键。 - **默认值:** **`'meta+k, ctrl+k'`** </APIItem> <APIItem name="allowedSchemes" type="string[]" optional> 允许的URL协议列表。 - **默认值:** **`['http', 'https', 'mailto', 'tel']`** </APIItem> <APIItem name="dangerouslySkipSanitization" type="boolean" optional> 决定是否跳过链接的消毒处理。 - **默认值:** **`false`** </APIItem> <APIItem name="defaultLinkAttributes" type="AnchorHTMLAttributes<HTMLAnchorElement>" optional> 链接元素的默认HTML属性。 - **默认值:** **`{}`** </APIItem> <APIItem name="keepSelectedTextOnPaste" type="boolean" optional> 粘贴链接时默认保留选中文本。 - **默认值:** **`true`** </APIItem> <APIItem name="isUrl" type="(text: string) => boolean" optional> 验证URL的回调函数。 - **默认值:** **`isUrl`** </APIItem> <APIItem name="getUrlHref" type="(url: string) => string | undefined" optional> 可选获取URL href的回调函数。返回与文本内容不同的可选链接。例如,为 `google.com` 返回 `https://google.com`。 </APIItem> <APIItem name="transformInput" type="(url: string | null) => string | undefined" optional> 在验证前可选转换用户提交的URL输入的回调函数。 </APIItem> <APIItem name="getLinkUrl" type="(prevUrl: string | null) => Promise<string | null>" optional> 当使用键盘快捷键或工具栏鼠标按下时,调用此函数获取链接URL。默认行为是使用浏览器的原生 `prompt`。 </APIItem> </APIOptions> </API>tf.insert.link向编辑器中插入链接节点。
<API name="insert.link"> <APIParameters> <APIItem name="options" type="object"> 插入链接的选项。 </APIItem> </APIParameters> <APIOptions type="InsertLinkOptions"> <APIItem name="createLinkNodeOptions" type="CreateLinkNodeOptions"> 创建链接节点的选项。 </APIItem> <APIItem name="insertOptions" type="InsertNodesOptions" optional> 插入节点的附加选项。 </APIItem> </APIOptions> </API>api.floatingLink.hide隐藏浮动链接并重置其状态。
api.floatingLink.reset重置浮动链接状态但不改变 openEditorId。
api.floatingLink.show为指定模式和编辑器ID显示浮动链接。
<API name="floatingLink.show"> <APIParameters> <APIItem name="mode" type="FloatingLinkMode"> 设置浮动链接的模式('edit' 或 'insert')。 </APIItem> <APIItem name="editorId" type="string"> 应显示浮动链接的编辑器ID。 </APIItem> </APIParameters> </API>api.link.getAttributes获取链接元素的属性。
<API name="link.getAttributes"> <APIParameters> <APIItem name="element" type="TLinkElement"> 要获取属性的链接元素。 </APIItem> </APIParameters> <APIReturns type="React.AnchorHTMLAttributes<HTMLAnchorElement>"> 链接元素的HTML属性。 </APIReturns> </API>api.link.submitFloatingLink如果URL有效则插入链接,关闭浮动链接并聚焦编辑器。
<APIReturns type="boolean"> 如果链接成功插入则返回 `true`。 </APIReturns>insertLink向编辑器中插入链接节点。
<API name="insertLink"> <APIParameters> <APIItem name="createLinkNodeOptions" type="CreateLinkNodeOptions"> 创建链接节点的选项。 </APIItem> <APIItem name="options" type="InsertNodesOptions" optional> 节点插入的附加选项。 </APIItem> </APIParameters> </API>submitFloatingLink如果URL有效则插入链接,关闭浮动链接并聚焦编辑器。
triggerFloatingLink触发浮动链接。
<API name="triggerFloatingLink"> <APIOptions type="object"> <APIItem name="focused" type="boolean" optional> 浮动链接是否应被聚焦。 </APIItem> </APIOptions> </API>triggerFloatingLinkEdit触发浮动链接编辑。
<API name="triggerFloatingLinkEdit"> <APIReturns type="boolean"> 如果链接被编辑则返回 `true`。 </APIReturns> </API>triggerFloatingLinkInsert触发浮动链接。以下情况不触发:
unwrapLink解包链接节点。
<API name="unwrapLink"> <APIOptions type="UnwrapLinkOptions"> <APIItem name="split" type="boolean" optional> 如果为 `true`,当选择在链接内部时分割节点。 </APIItem> </APIOptions> </API>upsertLink插入或更新链接节点。行为取决于当前选择和选项:
insertTextInLink: true 时,在链接中插入URL作为文本text 为空,则设置为URLskipValidation: true,否则验证URLupdate: true:
text,则替换链接文本upsertLinkText如果文本与上方链接文本不同,则用新文本节点替换链接子节点。新文本节点具有与链接中第一个文本节点相同的标记。
<API name="upsertLinkText"> <APIOptions type="UpsertLinkTextOptions"> <APIItem name="text" type="string" optional> 用于替换链接子节点的新文本。 </APIItem> </APIOptions> </API>validateUrl根据插件选项验证URL。
<API name="validateUrl"> <APIOptions type="ValidateUrlOptions"> <APIItem name="url" type="string"> 要验证的URL。 </APIItem> </APIOptions> <APIReturns type="boolean"> 如果URL有效则返回 `true`。 </APIReturns> </API>wrapLink用分割方式包裹链接节点。
<API name="wrapLink"> <APIOptions type="WrapLinkOptions"> <APIItem name="url" type="string"> 链接的URL。 </APIItem> <APIItem name="target" type="string" optional> 链接的目标属性。 </APIItem> </APIOptions> </API>CreateLinkNodeOptions创建新链接节点的选项。
<API name="CreateLinkNodeOptions"> <APIOptions type="object"> <APIItem name="url" type="string"> 正在创建的链接节点的URL。 </APIItem> <APIItem name="text" type="string" optional> 链接节点显示的文本。如果未提供,则使用URL作为显示文本。 </APIItem> <APIItem name="target" type="string" optional> 指定打开URL的位置: - `_blank`: 新标签页 - `_self`: 相同框架 - `_parent`: 父框架 - `_top`: 整个窗口 </APIItem> <APIItem name="children" type="TText[]" optional> 表示链接内容的文本节点数组。 </APIItem> </APIOptions> </API>FloatingLinkNewTabInput控制链接是否在新标签页中打开的输入组件。
<API name="FloatingLinkNewTabInput"> <APIState> <APIItem name="checked" type="boolean"> 链接是否应在新标签页中打开。 </APIItem> <APIItem name="setChecked" type="React.Dispatch<React.SetStateAction<boolean>>"> 更新选中状态的函数。 </APIItem> <APIItem name="ref" type="RefObject<HTMLInputElement>"> 输入元素的引用。 </APIItem> </APIState> </API>FloatingLinkUrlInput用于输入和编辑链接URL的输入组件。
<API name="FloatingLinkUrlInput"> <APIState> <APIItem name="ref" type="RefObject<HTMLInputElement>"> 输入元素的引用。 </APIItem> </APIState> </API>LinkOpenButton用于打开链接URL的按钮组件。
<API name="LinkOpenButton"> <APIState> <APIItem name="element" type="TLinkElement"> 包含要打开URL的链接元素。 </APIItem> </APIState> </API>useFloatingLinkEdit浮动链接编辑功能的行为钩子。
<API name="useFloatingLinkEdit"> <APIState> <APIItem name="floating" type="object" optional> 虚拟浮动返回对象。 </APIItem> </APIState> <APIReturns type="object"> <APIItem name="ref" type="function"> 浮动元素的引用回调。 </APIItem> <APIItem name="props" type="object"> 浮动元素的属性。 <APISubList> <APISubListItem parent="props" name="style" type="object"> 浮动链接的样式。 </APISubListItem> </APISubList> </APIItem> <APIItem name="editButtonProps" type="object"> 编辑按钮的属性。 <APISubList> <APISubListItem parent="editButtonProps" name="onClick" type="function"> 点击编辑按钮时调用的函数。 </APISubListItem> </APISubList> </APIItem> <APIItem name="unlinkButtonProps" type="object"> 取消链接按钮的属性。 <APISubList> <APISubListItem parent="unlinkButtonProps" name="onClick" type="function"> 点击取消链接按钮时调用的函数。 </APISubListItem> </APISubList> </APIItem> </APIReturns> </API>useFloatingLinkEnter监听Enter键按下事件并提交编辑器中的浮动链接。
useFloatingLinkEscape监听Escape键按下事件并处理编辑器中浮动链接的行为。
useFloatingLinkInsert插入链接的行为钩子。
<API name="useFloatingLinkInsert"> <APIState> <APIItem name="floating" type="ReturnType<typeof useFloatingLinkInsertState>"> 虚拟浮动返回对象。 </APIItem> <APIItem name="refClickOutside" type="React.Ref"> 浮动元素的引用。 </APIItem> </APIState> <APIReturns type="object"> <APIItem name="ref" type="function"> 浮动元素的引用回调。 </APIItem> <APIItem name="props" type="object"> 浮动元素的属性。 <APISubList> <APISubListItem parent="props" name="style" type="object"> 浮动链接的样式。 </APISubListItem> </APISubList> </APIItem> <APIItem name="textInputProps" type="object"> 文本输入的属性。 <APISubList> <APISubListItem parent="textInputProps" name="onChange" type="function"> 文本输入值变化时调用的函数。 </APISubListItem> <APISubListItem parent="textInputProps" name="defaultValue" type="string"> 文本输入的默认值。 </APISubListItem> </APISubList> </APIItem> </APIReturns> </API>useLink链接元素的行为钩子。
<API name="useLink"> <APIOptions type="UseLinkOptions"> <APIItem name="element" type="TLinkElement"> 链接元素。 </APIItem> </APIOptions> <APIReturns type="object"> <APIItem name="props" type="object"> 链接元素的属性。 <APISubList> <APISubListItem parent="props" name="onMouseOver" type="function"> 鼠标悬停在链接上时调用的函数。 </APISubListItem> </APISubList> </APIItem> </APIReturns> </API>useLinkToolbarButton链接工具栏按钮的行为钩子。
<API name="useLinkToolbarButton"> <APIState> <APIItem name="pressed" type="boolean"> 选择是否在链接中。 </APIItem> </APIState> <APIReturns type="object"> <APIItem name="props" type="object"> 工具栏按钮的属性。 <APISubList> <APISubListItem parent="props" name="pressed" type="boolean"> 链接是否被按下。 </APISubListItem> <APISubListItem parent="props" name="onClick" type="function"> 点击按钮时调用的函数。 </APISubListItem> </APISubList> </APIItem> </APIReturns> </API>useVirtualFloatingLink用于管理链接虚拟浮动的自定义钩子。
<API name="useVirtualFloatingLink"> <APIOptions type="object"> <APIItem name="editorId" type="string"> 链接所属编辑器的 ID。 </APIItem> <APIItem name="floatingOptions" type="UseVirtualFloatingOptions" optional> 虚拟浮动的选项。 </APIItem> </APIOptions> <APIReturns type="UseVirtualFloatingReturn"> `useVirtualFloating` 钩子的返回值。 </APIReturns> </API>