From 86432fc7a139950edab17f15bcf55d81c07c91ef Mon Sep 17 00:00:00 2001 From: qianmoQ Date: Sun, 4 Jan 2026 09:26:31 +0800 Subject: [PATCH 1/4] =?UTF-8?q?feat(=E7=A9=BF=E6=A2=AD=E6=A1=86):=20?= =?UTF-8?q?=E6=94=AF=E6=8C=81=20Transfer=20=E7=A9=BF=E6=A2=AD=E6=A1=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/.vitepress/config.js | 3 +- docs/components/form/transfer.md | 526 +++++++++++++++++++++ packages/index.ts | 5 +- playground/src/example/transfer/custom.vue | 44 ++ playground/src/example/transfer/glass.vue | 59 +++ playground/src/example/transfer/usage.vue | 95 ++++ src/App.vue | 189 ++++---- src/ui/transfer/ShadcnTransfer.vue | 371 +++++++++++++++ src/ui/transfer/index.ts | 1 + 9 files changed, 1209 insertions(+), 84 deletions(-) create mode 100644 docs/components/form/transfer.md create mode 100644 playground/src/example/transfer/custom.vue create mode 100644 playground/src/example/transfer/glass.vue create mode 100644 playground/src/example/transfer/usage.vue create mode 100644 src/ui/transfer/ShadcnTransfer.vue create mode 100644 src/ui/transfer/index.ts diff --git a/docs/.vitepress/config.js b/docs/.vitepress/config.js index 2c85b44b..4797e92c 100644 --- a/docs/.vitepress/config.js +++ b/docs/.vitepress/config.js @@ -260,7 +260,8 @@ export default { {text: '日期选取器 (Date Picker)', link: 'form/date-picker', icon: '/components/form/date-picker.svg', version: '2024.5.3'}, {text: '计划任务 (Cron)', link: 'form/cron', icon: '/components/form/cron.svg', version: '2024.5.3'}, {text: '提及 (Mention)', link: 'form/mention', icon: '/components/form/mention.svg', version: '2025.1.0'}, - {text: 'IP输入框 (IP Input)', link: 'form/ip-input', icon: '/components/form/ip-input.svg', version: '2025.1.3'} + {text: 'IP输入框 (IP Input)', link: 'form/ip-input', icon: '/components/form/ip-input.svg', version: '2025.1.3'}, + {text: '穿梭框 (Transfer)', link: 'form/transfer', icon: '/components/form/transfer.svg', version: '2026.0.0'} ] return { diff --git a/docs/components/form/transfer.md b/docs/components/form/transfer.md new file mode 100644 index 00000000..e4d6d0cf --- /dev/null +++ b/docs/components/form/transfer.md @@ -0,0 +1,526 @@ +--- +title: 穿梭框 (Transfer) +--- + +# 介绍 + +
+ +本文档主要用于描述 `ShadcnTransfer` 组件的一些特性和用法。 + +## 用法 + + + + + +::: details 查看代码 + +```vue + + + +``` + +::: + +## 自定义列表标题 + + + + + +::: details 查看代码 + +```vue + + + +``` + +::: + +## 禁用 (disabled) + + + + + +::: details 查看代码 + +```vue + + + +``` + +::: + +## 尺寸 (size) + + +
+ + + +
+
+ +::: details 查看代码 + +```vue + + + +``` + +::: + +## 类型 (type) + + +
+ + + + +
+
+ +::: details 查看代码 + +```vue + + + +``` + +::: + +## 液态玻璃效果 (glass) + +::: raw + + +
+ +
+
+ +::: + +::: details 查看代码 + +```vue + + + +``` + +::: + +## 自定义渲染 + + + + + + + +::: details 查看代码 + +```vue + + + +``` + +::: + +## 穿梭框 (Transfer) 属性 + + + + +## 穿梭框 (Transfer) 事件 + + + + +## 穿梭框 (Transfer) 插槽 + + + + +## Types + +```typescript +interface TransferItem { + [key: string]: any + disabled?: boolean +} +``` + + diff --git a/packages/index.ts b/packages/index.ts index 43e6d116..a684ff48 100644 --- a/packages/index.ts +++ b/packages/index.ts @@ -83,6 +83,7 @@ import { ShadcnNotification, ShadcnNotificationItem } from '@/ui/notification' import { ShadcnTime } from '@/ui/time' import { ShadcnIPInput } from '@/ui/ip-input' import { ShadcnMarkdown } from '@/ui/markdown' +import { ShadcnTransfer } from '@/ui/transfer' let components = [ ShadcnButton, ShadcnButtonGroup, @@ -163,7 +164,8 @@ let components = [ ShadcnNotification, ShadcnNotificationItem, ShadcnTime, ShadcnIPInput, - ShadcnMarkdown + ShadcnMarkdown, + ShadcnTransfer ] interface InstallOptions @@ -279,6 +281,7 @@ export { ShadcnNotification, ShadcnNotificationItem } from '@/ui/notification' export { ShadcnTime } from '@/ui/time' export { ShadcnIPInput } from '@/ui/ip-input' export { ShadcnMarkdown } from '@/ui/markdown' +export { ShadcnTransfer } from '@/ui/transfer' // Export functions export { fnToString, fnToFunction } from '@/utils/formatter' diff --git a/playground/src/example/transfer/custom.vue b/playground/src/example/transfer/custom.vue new file mode 100644 index 00000000..3af7e72c --- /dev/null +++ b/playground/src/example/transfer/custom.vue @@ -0,0 +1,44 @@ + + + diff --git a/playground/src/example/transfer/glass.vue b/playground/src/example/transfer/glass.vue new file mode 100644 index 00000000..2d047476 --- /dev/null +++ b/playground/src/example/transfer/glass.vue @@ -0,0 +1,59 @@ + + + diff --git a/playground/src/example/transfer/usage.vue b/playground/src/example/transfer/usage.vue new file mode 100644 index 00000000..3337c7c4 --- /dev/null +++ b/playground/src/example/transfer/usage.vue @@ -0,0 +1,95 @@ + + + diff --git a/src/App.vue b/src/App.vue index fbe67bee..e345a976 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,98 +1,123 @@ diff --git a/src/ui/transfer/ShadcnTransfer.vue b/src/ui/transfer/ShadcnTransfer.vue new file mode 100644 index 00000000..bd1e32ac --- /dev/null +++ b/src/ui/transfer/ShadcnTransfer.vue @@ -0,0 +1,371 @@ + + + diff --git a/src/ui/transfer/index.ts b/src/ui/transfer/index.ts new file mode 100644 index 00000000..59a296bf --- /dev/null +++ b/src/ui/transfer/index.ts @@ -0,0 +1 @@ +export { default as ShadcnTransfer } from './ShadcnTransfer.vue' From 9fe4ba273621c53082d938ee2f77c2a415dfbc7a Mon Sep 17 00:00:00 2001 From: qianmoQ Date: Sun, 4 Jan 2026 10:18:24 +0800 Subject: [PATCH 2/4] =?UTF-8?q?feat(=E7=A9=BF=E6=A2=AD=E6=A1=86):=20?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E8=87=AA=E5=AE=9A=E4=B9=89=E9=AB=98=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/components/form/transfer.md | 185 ++++++++++++++++++++-- playground/src/example/transfer/usage.vue | 26 ++- src/App.vue | 23 ++- src/locales/en-US.ts | 6 + src/locales/zh-CN.ts | 6 + src/ui/transfer/ShadcnTransfer.vue | 125 +++++++-------- src/ui/transfer/index.ts | 1 + src/ui/transfer/types.ts | 26 +++ types/view-shadcn.d.ts | 5 +- 9 files changed, 321 insertions(+), 82 deletions(-) create mode 100644 src/ui/transfer/types.ts diff --git a/docs/components/form/transfer.md b/docs/components/form/transfer.md index e4d6d0cf..6bacfdc7 100644 --- a/docs/components/form/transfer.md +++ b/docs/components/form/transfer.md @@ -15,7 +15,7 @@ title: 穿梭框 (Transfer) v-model="selected1" :data="data1" :dark="darkMode" - @change="handleChange" /> + @on-change="handleChange" /> ::: details 查看代码 @@ -26,7 +26,7 @@ title: 穿梭框 (Transfer) v-model="selected" :data="data" :dark="darkMode" - @change="handleChange" /> + @on-change="handleChange" /> +``` + +::: + ## 禁用 (disabled) @@ -373,6 +419,88 @@ const data = ref([ ::: +## 在表单中使用 + + + + + + +
+ + 重置 + + + 提交 + +
+
+
+ +::: details 查看代码 + +```vue + + + +``` + +::: + ## 穿梭框 (Transfer) 属性 @@ -518,6 +647,40 @@ const data12 = ref([ { key: 4, label: '选项 4' }, ]) +const selected13 = ref([1, 2]) +const data13 = ref([ + { key: 1, label: '选项 1' }, + { key: 2, label: '选项 2' }, + { key: 3, label: '选项 3' }, + { key: 4, label: '选项 4' }, + { key: 5, label: '选项 5' }, + { key: 6, label: '选项 6' }, + { key: 7, label: '选项 7' }, + { key: 8, label: '选项 8' }, +]) + +const formRef = ref() +const formData = ref({ + skills: [1, 2] +}) + +const skillsData = ref([ + { key: 1, label: 'JavaScript' }, + { key: 2, label: 'TypeScript' }, + { key: 3, label: 'Vue.js' }, + { key: 4, label: 'React' }, + { key: 5, label: 'Angular' }, + { key: 6, label: 'Node.js' }, +]) + +const onSubmit = (data: any) => { + console.log('Form submitted:', data) +} + +const resetForm = () => { + formRef.value.reset() +} + const handleChange = (value, direction, movedKeys) => { console.log('value:', value) console.log('direction:', direction) diff --git a/playground/src/example/transfer/usage.vue b/playground/src/example/transfer/usage.vue index 3337c7c4..c46f6d04 100644 --- a/playground/src/example/transfer/usage.vue +++ b/playground/src/example/transfer/usage.vue @@ -5,7 +5,7 @@ + @on-change="handleChange" />
@@ -13,8 +13,16 @@ + left-title="待选择" + right-title="已选择" /> +
+ +
+

自定义高度

+
@@ -87,6 +95,18 @@ const data5 = ref([ { key: 3, label: '选项 3' }, ]) +const selected6 = ref([1, 2]) +const data6 = ref([ + { key: 1, label: '选项 1' }, + { key: 2, label: '选项 2' }, + { key: 3, label: '选项 3' }, + { key: 4, label: '选项 4' }, + { key: 5, label: '选项 5' }, + { key: 6, label: '选项 6' }, + { key: 7, label: '选项 7' }, + { key: 8, label: '选项 8' }, +]) + const handleChange = (value: (string | number)[], direction: 'left' | 'right', movedKeys: (string | number)[]) => { console.log('value:', value) console.log('direction:', direction) diff --git a/src/App.vue b/src/App.vue index e345a976..6d37b1e4 100644 --- a/src/App.vue +++ b/src/App.vue @@ -6,13 +6,18 @@ + @on-change="handleTransferChange"/>
自定义列表标题
+ left-title="待选择" + right-title="已选择"/> + +
自定义高度
+
液态玻璃效果
@@ -115,6 +120,18 @@ const transferData7 = ref([ { key: 4, label: '文件', icon: 'File' }, ]); +const transferSelected8 = ref([1, 2]); +const transferData8 = ref([ + { key: 1, label: '选项 1' }, + { key: 2, label: '选项 2' }, + { key: 3, label: '选项 3' }, + { key: 4, label: '选项 4' }, + { key: 5, label: '选项 5' }, + { key: 6, label: '选项 6' }, + { key: 7, label: '选项 7' }, + { key: 8, label: '选项 8' }, +]); + const handleTransferChange = (value: (string | number)[], direction: 'left' | 'right', movedKeys: (string | number)[]) => { console.log('value:', value); console.log('direction:', direction); diff --git a/src/locales/en-US.ts b/src/locales/en-US.ts index fb3c8be0..9b9ffe16 100644 --- a/src/locales/en-US.ts +++ b/src/locales/en-US.ts @@ -333,5 +333,11 @@ export default { clearAll: 'Clear All', noData: 'No data' } + }, + transfer: { + text: { + leftTitle: 'Source', + rightTitle: 'Target' + } } } \ No newline at end of file diff --git a/src/locales/zh-CN.ts b/src/locales/zh-CN.ts index 3dba708d..86818e55 100644 --- a/src/locales/zh-CN.ts +++ b/src/locales/zh-CN.ts @@ -333,5 +333,11 @@ export default { clearAll: '全部清除', noData: '暂无数据' } + }, + transfer: { + text: { + leftTitle: '源列表', + rightTitle: '目标列表' + } } } \ No newline at end of file diff --git a/src/ui/transfer/ShadcnTransfer.vue b/src/ui/transfer/ShadcnTransfer.vue index bd1e32ac..1fd44e7c 100644 --- a/src/ui/transfer/ShadcnTransfer.vue +++ b/src/ui/transfer/ShadcnTransfer.vue @@ -15,34 +15,33 @@ @update:modelValue="toggleLeftAll" :dark="dark" :glass="glass" - :type="type" + :type="checkboxType" :size="size"> - {{ leftTitle }} + {{ computedLeftTitle }} {{ leftCheckedCount }}/{{ leftData.length }}
-
+
- + + :type="checkboxType" + :disabled="item.disabled"> - {{ item[labelProp] }} + {{ item[props.labelProp] }}
@@ -84,36 +83,35 @@ :value="true" :indeterminate="rightIndeterminate" @update:modelValue="toggleRightAll" - :type="type" + :type="checkboxType" :glass="glass" :dark="dark" :size="size"> - {{ rightTitle }} + {{ computedRightTitle }} {{ rightCheckedCount }}/{{ rightData.length }}
-
+
- + + :disabled="item.disabled"> - {{ item[labelProp] }} + {{ item[props.labelProp] }}
@@ -127,8 +125,8 @@ import { computed, inject, ref, watch } from 'vue' import { ShadcnCheckbox } from '@/ui/checkbox' import { ShadcnButton } from '@/ui/button' import { ShadcnIcon } from '@/ui/icon' -import { Size } from '@/ui/enum/Size' -import { Type } from '@/ui/enum/Type' +import { t } from '@/utils/locale' +import type { TransferEmits, TransferProps } from './types' enum HeaderSize { @@ -139,9 +137,9 @@ enum HeaderSize enum ContentSize { - small = 'p-2 max-h-48', - default = 'p-3 max-h-64', - large = 'p-4 max-h-80' + small = 'p-2', + default = 'p-3', + large = 'p-4' } enum ItemSize @@ -165,47 +163,19 @@ enum TextSize large = 'text-lg' } -interface TransferItem -{ - [key: string]: any - - disabled?: boolean -} - -type TransferSize = keyof typeof Size -type TransferType = keyof typeof Type - -interface Props -{ - data: TransferItem[] - modelValue: (string | number)[] - keyProp?: string - labelProp?: string - leftTitle?: string - rightTitle?: string - dark?: boolean - glass?: boolean - type?: TransferType - size?: TransferSize -} - -const props = withDefaults(defineProps(), { +const props = withDefaults(defineProps(), { keyProp: 'key', labelProp: 'label', - leftTitle: '源列表', - rightTitle: '目标列表', dark: false, type: 'primary', - size: 'default' + size: 'default', + height: '256px' }) // Form context support const formContext = inject('formContext', null) -const emit = defineEmits<{ - 'update:modelValue': [value: (string | number)[]] - 'change': [value: (string | number)[], direction: 'left' | 'right', movedKeys: (string | number)[]] -}>() +const emit = defineEmits() // Update form context when value changes watch(() => props.modelValue, (newValue) => { @@ -295,14 +265,14 @@ const toggleRightAll = (checked: boolean) => { const moveToRight = () => { const newValue = [...props.modelValue, ...leftChecked.value] emit('update:modelValue', newValue) - emit('change', newValue, 'right', [...leftChecked.value]) + emit('on-change', newValue, 'right', [...leftChecked.value]) leftChecked.value = [] } const moveToLeft = () => { const newValue = props.modelValue.filter(key => !rightChecked.value.includes(key)) emit('update:modelValue', newValue) - emit('change', newValue, 'left', [...rightChecked.value]) + emit('on-change', newValue, 'left', [...rightChecked.value]) rightChecked.value = [] } @@ -365,7 +335,34 @@ const countClass = computed(() => { // 尺寸类名 const sizeClass = computed(() => TextSize[props.size]) const sizeHeaderClass = computed(() => HeaderSize[props.size]) -const sizeContentClass = computed(() => ContentSize[props.size]) const sizeItemClass = computed(() => ItemSize[props.size]) const iconSizeClass = computed(() => IconSize[props.size]) + +// 高度样式 +const heightStyle = computed(() => { + return props.height ? { maxHeight: props.height } : {} +}) + +// 国际化标题 +const computedLeftTitle = computed(() => { + return props.leftTitle || String(t('transfer.text.leftTitle')) +}) + +const computedRightTitle = computed(() => { + return props.rightTitle || String(t('transfer.text.rightTitle')) +}) + +// Checkbox type mapping +const checkboxType = computed(() => { + const typeMap: Record = { + primary: 'primary', + success: 'success', + warning: 'warning', + danger: 'error', + error: 'error', + info: 'primary', + text: 'primary' + } + return typeMap[props.type] || 'primary' +}) diff --git a/src/ui/transfer/index.ts b/src/ui/transfer/index.ts index 59a296bf..fd187233 100644 --- a/src/ui/transfer/index.ts +++ b/src/ui/transfer/index.ts @@ -1 +1,2 @@ export { default as ShadcnTransfer } from './ShadcnTransfer.vue' +export type { TransferProps, TransferEmits, TransferItem } from './types' diff --git a/src/ui/transfer/types.ts b/src/ui/transfer/types.ts new file mode 100644 index 00000000..94494feb --- /dev/null +++ b/src/ui/transfer/types.ts @@ -0,0 +1,26 @@ +import { Size } from '@/ui/enum/Size' +import { Type } from '@/ui/enum/Type' + +export interface TransferItem { + [key: string]: any + disabled?: boolean +} + +export interface TransferProps { + data: TransferItem[] + modelValue: (string | number)[] + keyProp?: string + labelProp?: string + leftTitle?: string + rightTitle?: string + dark?: boolean + glass?: boolean + type?: keyof typeof Type + size?: keyof typeof Size + height?: string +} + +export type TransferEmits = { + 'update:modelValue': [value: (string | number)[]] + 'on-change': [value: (string | number)[], direction: 'left' | 'right', movedKeys: (string | number)[]] +} diff --git a/types/view-shadcn.d.ts b/types/view-shadcn.d.ts index be7f3099..57e6b65e 100644 --- a/types/view-shadcn.d.ts +++ b/types/view-shadcn.d.ts @@ -9,7 +9,7 @@ declare module 'view-shadcn-ui' export const ShadcnCopy: typeof import('@/ui/copy').default export const ShadcnCode: typeof import('@/ui/code').default export const ShadcnInput: typeof import('@/ui/input').default - export const Icon: typeof import('@/ui/icon').default + export const ShadcnIcon: typeof import('@/ui/icon').default export const ShadcnModal: typeof import('@/ui/modal').default export const ShadcnTooltip: typeof import('@/ui/tooltip').default export const ShadcnRow: typeof import('@/ui/row').default @@ -49,4 +49,7 @@ declare module 'view-shadcn-ui' export const ShadcnBreadcrumb: typeof import('@/ui/breadcrumb').default export const ShadcnBreadcrumbItem: typeof import('@/ui/breadcrumb/item').default export const ShadcnSlider: typeof import('@/ui/slider').default + export const ShadcnTransfer: typeof import('@/ui/transfer').ShadcnTransfer + + export type { TransferProps, TransferEmits, TransferItem } from '@/ui/transfer' } From 388fb29bf5e3b678f5b2824056a36d43b431e886 Mon Sep 17 00:00:00 2001 From: qianmoQ Date: Sun, 4 Jan 2026 10:23:45 +0800 Subject: [PATCH 3/4] =?UTF-8?q?feat(=E7=A9=BF=E6=A2=AD=E6=A1=86):=20?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=AF=B9=E5=85=B6=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ui/transfer/ShadcnTransfer.vue | 11 ++++++++--- src/ui/transfer/types.ts | 2 +- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/ui/transfer/ShadcnTransfer.vue b/src/ui/transfer/ShadcnTransfer.vue index 1fd44e7c..6c494ac8 100644 --- a/src/ui/transfer/ShadcnTransfer.vue +++ b/src/ui/transfer/ShadcnTransfer.vue @@ -127,6 +127,7 @@ import { ShadcnButton } from '@/ui/button' import { ShadcnIcon } from '@/ui/icon' import { t } from '@/utils/locale' import type { TransferEmits, TransferProps } from './types' +import { calcSize } from "@/utils/common.ts"; enum HeaderSize { @@ -169,7 +170,7 @@ const props = withDefaults(defineProps(), { dark: false, type: 'primary', size: 'default', - height: '256px' + height: 256 }) // Form context support @@ -306,7 +307,7 @@ const contentClass = computed(() => { // 列表项类名 const itemClass = computed(() => { - const baseClass = 'flex items-center px-3 py-2' + let baseClass = 'flex items-center px-4 py-2' let hoverClass = '' if (props.glass) { @@ -316,6 +317,10 @@ const itemClass = computed(() => { hoverClass = props.dark ? 'hover:bg-gray-700/50' : 'hover:bg-gray-100' } + if (props.size === 'small') { + baseClass = 'flex items-center px-3 py-1' + } + return [baseClass, hoverClass] }) @@ -340,7 +345,7 @@ const iconSizeClass = computed(() => IconSize[props.size]) // 高度样式 const heightStyle = computed(() => { - return props.height ? { maxHeight: props.height } : {} + return props.height ? { maxHeight: calcSize(props.height), minHeight: calcSize(props.height) } : {} }) // 国际化标题 diff --git a/src/ui/transfer/types.ts b/src/ui/transfer/types.ts index 94494feb..cd60c7ce 100644 --- a/src/ui/transfer/types.ts +++ b/src/ui/transfer/types.ts @@ -17,7 +17,7 @@ export interface TransferProps { glass?: boolean type?: keyof typeof Type size?: keyof typeof Size - height?: string + height?: any } export type TransferEmits = { From b0b29b9d6e1f54d01636e632bf08e5f63b8725ad Mon Sep 17 00:00:00 2001 From: qianmoQ Date: Sun, 4 Jan 2026 10:41:30 +0800 Subject: [PATCH 4/4] =?UTF-8?q?feat(=E7=A9=BF=E6=A2=AD=E6=A1=86):=20?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E6=90=9C=E7=B4=A2=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/components/form/transfer.md | 140 +++++++++++++++++++++++++++-- src/App.vue | 42 ++++++++- src/locales/en-US.ts | 3 +- src/locales/zh-CN.ts | 3 +- src/ui/transfer/ShadcnTransfer.vue | 68 +++++++++++--- src/ui/transfer/types.ts | 3 + 6 files changed, 233 insertions(+), 26 deletions(-) diff --git a/docs/components/form/transfer.md b/docs/components/form/transfer.md index 6bacfdc7..843bd688 100644 --- a/docs/components/form/transfer.md +++ b/docs/components/form/transfer.md @@ -142,6 +142,106 @@ const data = ref([ ::: +## 可搜索 (filterable) + + + + + +::: details 查看代码 + +```vue + + + +``` + +::: + +## 自定义搜索方法 + + + + + +::: details 查看代码 + +```vue + + + +``` + +::: + ## 禁用 (disabled) @@ -513,6 +613,9 @@ const resetForm = () => { ['leftTitle', '左侧列表标题(支持国际化)', 'string', 'transfer.text.leftTitle', '-'], ['rightTitle', '右侧列表标题(支持国际化)', 'string', 'transfer.text.rightTitle', '-'], ['height', '列表高度', 'string', '\'256px\'', '-'], + ['filterable', '是否可搜索', 'boolean', 'false', '-'], + ['filterPlaceholder', '搜索框占位符(支持国际化)', 'string', 'transfer.text.filterPlaceholder', '-'], + ['filterMethod', '自定义搜索方法', '(query: string, item: TransferItem) => boolean', '-', '-'], ['dark', '暗黑模式', 'boolean', 'false', '-'], ['glass', '液态玻璃效果', 'boolean', 'false', '-'], ['type', '按钮和复选框类型', 'enum', 'primary', 'primary | success | warning | danger | info'], @@ -539,15 +642,6 @@ const resetForm = () => { ]"> -## Types - -```typescript -interface TransferItem { - [key: string]: any - disabled?: boolean -} -``` -