ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ â ð shadcn/directory/udecode/plate/(plugins)/(elements)/link.cn â ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â
title: éŸæ¥ docs:
æå¿«æ·æ·»å éŸæ¥åèœçæ¹åŒæ¯äœ¿çš LinkKitïŒå®å
å«é¢é
眮ç LinkPlugin 以念®åšå·¥å
·æ å Plate UI ç»ä»¶ã
LinkElement: æž²æéŸæ¥å
çŽ LinkFloatingToolbar: æäŸéŸæ¥çŒèŸçæµ®åšå·¥å
·æ å°å¥ä»¶æ·»å å°æä»¶äžïŒ
import { createPlateEditor } from 'platejs/react';
import { LinkKit } from '@/components/editor/plugins/link-kit';
const editor = createPlateEditor({
plugins: [
// ...å
¶ä»æä»¶
...LinkKit,
],
});
</Steps>
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>â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ