๐Ÿ“ Sign Up | ๐Ÿ” Log In

โ† Root | โ†‘ Up

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ ๐Ÿ“„ shadcn/directory/udecode/plate/(plugins)/(functionality)/multi-select.cn โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘

title: ๅคš้€‰ docs:

  • route: /docs/components/tag-node
  • route: /docs/components/select-editor

<ComponentPreview name="select-editor-demo" /> <PackageInfo>

็‰นๆ€ง

ไธŽไผ ็ปŸ็š„ๅŸบไบŽ่พ“ๅ…ฅ็š„ๅคš้€‰ไธๅŒ๏ผŒ่ฏฅ็ป„ไปถๆž„ๅปบๅœจ Plate editor ไน‹ไธŠ๏ผŒๆไพ›๏ผš

  • ๅฎŒๆ•ด็š„ๅކๅฒ่ฎฐๅฝ•ๆ”ฏๆŒ๏ผˆๆ’ค้”€/้‡ๅš๏ผ‰
  • ๆ ‡็ญพไน‹้—ดๅ’Œๆ ‡็ญพๅ†…็š„ๅŽŸ็”Ÿๅ…‰ๆ ‡ๅฏผ่ˆช
  • ้€‰ๆ‹ฉไธ€ไธชๆˆ–ๅคšไธชๆ ‡็ญพ
  • ๅคๅˆถ/็ฒ˜่ดดๆ ‡็ญพ
  • ๆ‹–ๆ”พ้‡ๆ–ฐๆŽ’ๅบๆ ‡็ญพ
  • ๅช่ฏปๆจกๅผ
  • ้˜ฒๆญข้‡ๅคๆ ‡็ญพ
  • ไฝฟ็”จไธๅŒบๅˆ†ๅคงๅฐๅ†™็š„ๅŒน้…ๅˆ›ๅปบๆ–ฐๆ ‡็ญพ
  • ๆœ็ดขๆ–‡ๆœฌๆธ…็†ๅ’Œ็ฉบ็™ฝไฟฎๅ‰ช
  • ็”ฑ cmdk ๆไพ›ๆ”ฏๆŒ็š„ๆจก็ณŠๆœ็ดข
</PackageInfo>

ๆ‰‹ๅŠจไฝฟ็”จ

<Steps>

ๅฎ‰่ฃ…

npm install @platejs/tag

ๆทปๅŠ ๆ’ไปถ

import { MultiSelectPlugin } from '@platejs/tag/react';
import { createPlateEditor } from 'platejs/react';

const editor = createPlateEditor({
  plugins: [
    // ...otherPlugins,
    MultiSelectPlugin, // ๅ…ทๆœ‰ๆ ‡็ญพๅŠŸ่ƒฝ็š„ๅคš้€‰็ผ–่พ‘ๅ™จ
  ],
});

้…็ฝฎๆ’ไปถ

import { MultiSelectPlugin } from '@platejs/tag/react';
import { createPlateEditor } from 'platejs/react';
import { TagElement } from '@/components/ui/tag-node';

const editor = createPlateEditor({
  plugins: [
    // ...otherPlugins,
    MultiSelectPlugin.withComponent(TagElement),
  ],
});
  • MultiSelectPlugin๏ผšๆ‰ฉๅฑ• TagPlugin ๅนถๅฐ†็ผ–่พ‘ๅ™จ้™ๅˆถไธบไป…ๅŒ…ๅซๆ ‡็ญพๅ…ƒ็ด 
  • withComponent๏ผšๅˆ†้… TagElement ๆฅๆธฒๆŸ“ๆ ‡็ญพ็ป„ไปถ

ๆทปๅŠ  SelectEditor

<ComponentInstallation name="select-editor" inline />

ๅŸบๆœฌ็คบไพ‹

import { MultiSelectPlugin } from '@platejs/tag/react';
import { TagElement } from '@/components/ui/tag-node';
import {
  SelectEditor,
  SelectEditorContent,
  SelectEditorInput,
  SelectEditorCombobox,
  type SelectItem,
} from '@/components/ui/select-editor';

// ๅฎšไน‰ไฝ ็š„้กน็›ฎ
const ITEMS: SelectItem[] = [
  { value: 'React' },
  { value: 'TypeScript' },
  { value: 'JavaScript' },
];

export default function MySelectEditor() {
  const [value, setValue] = React.useState<SelectItem[]>([ITEMS[0]]);

  return (
    <SelectEditor
      value={value}
      onValueChange={setValue}
      items={ITEMS}
    >
      <SelectEditorContent>
        <SelectEditorInput placeholder="้€‰ๆ‹ฉ้กน็›ฎ..." />
        <SelectEditorCombobox />
      </SelectEditorContent>
    </SelectEditor>
  );
}

่กจๅ•็คบไพ‹

<ComponentSource name="select-editor-demo" /> </Steps>

ๆ’ไปถ

TagPlugin

็”จไบŽๅ•ไธชๆ ‡็ญพๅŠŸ่ƒฝ็š„ๅ†…่” void ๅ…ƒ็ด ๆ’ไปถใ€‚

MultiSelectPlugin

TagPlugin ็š„ๆ‰ฉๅฑ•๏ผŒๅฐ†็ผ–่พ‘ๅ™จ้™ๅˆถไธบไป…ๅŒ…ๅซๆ ‡็ญพๅ…ƒ็ด ๏ผŒๅฏ็”จๅคš้€‰่กŒไธบ๏ผŒๅ…ทๆœ‰่‡ชๅŠจๆ–‡ๆœฌๆธ…็†ๅ’Œ้‡ๅค้ข„้˜ฒๅŠŸ่ƒฝใ€‚

API

tf.insert.tag

ๅœจๅฝ“ๅ‰้€‰ๆ‹ฉๅค„ๆ’ๅ…ฅๆ–ฐ็š„ๅคš้€‰ๅ…ƒ็ด ใ€‚

<API name="tf.insert.tag"> <APIParameters> <APIItem name="props" type="TTagProps"> ๅคš้€‰ๅ…ƒ็ด ็š„ๅฑžๆ€งใ€‚ </APIItem> </APIParameters> <APIOptions type="TTagProps"> <APIItem name="value" type="string"> ๅคš้€‰ๅ…ƒ็ด ็š„ๅ”ฏไธ€ๅ€ผใ€‚ </APIItem> </APIOptions> </API>

getSelectedItems

่Žทๅ–็ผ–่พ‘ๅ™จไธญ็š„ๆ‰€ๆœ‰ๆ ‡็ญพ้กน็›ฎใ€‚

<API name="getSelectedItems"> <APIReturns type="TTagProps[]"> ็ผ–่พ‘ๅ™จไธญ็š„ๆ ‡็ญพ้กน็›ฎๆ•ฐ็ป„ใ€‚ </APIReturns> </API>

isEqualTags

ๆฏ”่พƒไธค็ป„ๆ ‡็ญพๆ˜ฏๅฆ็›ธ็ญ‰็š„ๅทฅๅ…ทๅ‡ฝๆ•ฐ๏ผŒๅฟฝ็•ฅ้กบๅบใ€‚

<API name="isEqualTags"> <APIParameters> <APIItem name="newTags" type="TTagProps[]" optional> ่ฆไธŽๅฝ“ๅ‰็ผ–่พ‘ๅ™จๆ ‡็ญพๆฏ”่พƒ็š„ๆ–ฐๆ ‡็ญพใ€‚ </APIItem> </APIParameters> <APIReturns type="boolean"> ไธค็ป„ๆ˜ฏๅฆๅŒ…ๅซ็›ธๅŒ็š„ๅ€ผใ€‚ </APIReturns> </API>

Hooks

useSelectedItems

่Žทๅ–็ผ–่พ‘ๅ™จไธญๅฝ“ๅ‰้€‰ไธญ็š„ๆ ‡็ญพ้กน็›ฎ็š„ Hookใ€‚

<API name="useSelectedItems"> <APIReturns type="TTagProps[]"> ๅ…ทๆœ‰ๅ€ผๅ’Œๅฑžๆ€ง็š„้€‰ไธญๆ ‡็ญพ้กน็›ฎๆ•ฐ็ป„ใ€‚ </APIReturns> </API>

useSelectableItems

่Žทๅ–ๅฏ้€‰ๆ‹ฉ็š„ๅฏ็”จ้กน็›ฎ็š„ Hook๏ผŒ้€š่ฟ‡ๆœ็ดข่ฟ‡ๆปคๅนถๆŽ’้™คๅทฒ้€‰ไธญ็š„้กน็›ฎใ€‚

<API name="useSelectableItems"> <APIOptions type="options"> <APIItem name="allowNew" type="boolean" optional> ๆ˜ฏๅฆๅ…่ฎธๅˆ›ๅปบๆ–ฐ้กน็›ฎใ€‚ - **้ป˜่ฎคๅ€ผ๏ผš** `true` </APIItem> <APIItem name="filter" type="(value: string, search: string) => boolean" optional> ้กน็›ฎ็š„่‡ชๅฎšไน‰่ฟ‡ๆปคๅ‡ฝๆ•ฐใ€‚ </APIItem> <APIItem name="items" type="T[]" optional> ๅฏ็”จ้กน็›ฎๆ•ฐ็ป„ใ€‚ </APIItem> <APIItem name="newItemFilter" type="(search: string) => boolean" optional> ๆ–ฐ้กน็›ฎ็š„่ฟ‡ๆปคๅ‡ฝๆ•ฐใ€‚ </APIItem> <APIItem name="newItemPosition" type="'end' | 'start'" optional> ๆ–ฐ้กน็›ฎๅœจๅˆ—่กจไธญ็š„ไฝ็ฝฎใ€‚ - **้ป˜่ฎคๅ€ผ๏ผš** `'end'` </APIItem> </APIOptions> <APIReturns type="T[]"> ่ฟ‡ๆปคๅŽ็š„ๅฏ้€‰้กน็›ฎๆ•ฐ็ป„ใ€‚ </APIReturns> </API>

useSelectEditorCombobox

ๅค„็†็ผ–่พ‘ๅ™จไธญ็ป„ๅˆๆก†่กŒไธบ็š„ Hook๏ผŒๅŒ…ๆ‹ฌๆ–‡ๆœฌๆธ…็†ๅ’Œ้กน็›ฎ้€‰ๆ‹ฉใ€‚

<API name="useSelectEditorCombobox"> <APIOptions type="options"> <APIItem name="open" type="boolean"> ็ป„ๅˆๆก†ๆ˜ฏๅฆๆ‰“ๅผ€ใ€‚ </APIItem> <APIItem name="selectFirstItem" type="() => void"> ้€‰ๆ‹ฉ็ฌฌไธ€ไธช็ป„ๅˆๆก†้กน็›ฎ็š„ๅ‡ฝๆ•ฐใ€‚ </APIItem> <APIItem name="onValueChange" type="(items: TTagProps[]) => void" optional> ้€‰ไธญ้กน็›ฎๆ›ดๆ”นๆ—ถ็š„ๅ›ž่ฐƒใ€‚ </APIItem> </APIOptions> </API>

็ฑปๅž‹

TTagElement

type TTagElement = TElement & {
  value: string;
  [key: string]: unknown;
};

TTagProps

type TTagProps = {
  value: string;
  [key: string]: unknown;
};
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

โ† Root | โ†‘ Up