Transfer

一个更直观高效的多选选择器,可以露出更多选项的信息,支持搜索功能,缺点是占据更多空间。

设计文档(新窗口打开)

代码演示

如何引入

import { Transfer } from '@chenzy-design/svelte';

基本使用

数据项需传入 value、label、key。勾选左侧条目即立即迁移到右侧已选列表(左侧条目会一直保留展示,仅勾选态变化),无需额外的移动按钮。

总个数:100
选项名称 0
选项名称 1
选项名称 2
选项名称 3
选项名称 4
选项名称 5
选项名称 6
选项名称 7
选项名称 8
选项名称 9
选项名称 10
选项名称 11
选项名称 12
选项名称 13
选项名称 14
选项名称 15
选项名称 16
选项名称 17
选项名称 18
选项名称 19
选项名称 20
选项名称 21
选项名称 22
选项名称 23
选项名称 24
选项名称 25
选项名称 26
选项名称 27
选项名称 28
选项名称 29
选项名称 30
选项名称 31
选项名称 32
选项名称 33
选项名称 34
选项名称 35
选项名称 36
选项名称 37
选项名称 38
选项名称 39
选项名称 40
选项名称 41
选项名称 42
选项名称 43
选项名称 44
选项名称 45
选项名称 46
选项名称 47
选项名称 48
选项名称 49
选项名称 50
选项名称 51
选项名称 52
选项名称 53
选项名称 54
选项名称 55
选项名称 56
选项名称 57
选项名称 58
选项名称 59
选项名称 60
选项名称 61
选项名称 62
选项名称 63
选项名称 64
选项名称 65
选项名称 66
选项名称 67
选项名称 68
选项名称 69
选项名称 70
选项名称 71
选项名称 72
选项名称 73
选项名称 74
选项名称 75
选项名称 76
选项名称 77
选项名称 78
选项名称 79
选项名称 80
选项名称 81
选项名称 82
选项名称 83
选项名称 84
选项名称 85
选项名称 86
选项名称 87
选项名称 88
选项名称 89
选项名称 90
选项名称 91
选项名称 92
选项名称 93
选项名称 94
选项名称 95
选项名称 96
选项名称 97
选项名称 98
选项名称 99
已选个数:0
暂无内容,可从左侧勾选

分组

将 type 设为 groupList。分组的 dataSource,一级子元素必须拥有 title 以及 children 属性。暂不支持多层嵌套。

总个数:13
类别A
A-1
A-2
A-3
类别B
B-1
B-2
B-3(disabled)
类别C
C-1
C-2
C-3
C-4
C-5
C-6
C-7
已选个数:1
B-3(disabled)

自定义筛选逻辑,自定义选项数据渲染

使用 filter 自定义搜索逻辑,返回 true 时表示当前项符合筛选规则,保留当前项在列表中的显示,返回 false 则表示不符合,当前项会被隐藏。当 type 为 treeList 时,如需自定义搜索逻辑,需设置 filter 为 true,并通过 treeProps 的 filterTreeNode 设置自定义的搜索函数。使用 renderSourceItem,你可以自定义左侧每一条源数据的渲染结构,例如结合 Highlight 组件高亮搜索匹配文本。使用 renderSelectedItem 你可以自定义右侧每一条已选项的渲染结构。

总个数:6
夏
夏可漫
申
申悦
文
文嘉茂
曲
曲晨一
二
曲晨二
三
曲晨三
已选个数:2
夏
夏可漫
申
申悦

禁用

总个数:20
选项名称 0
选项名称 1
选项名称 2
选项名称 3
选项名称 4
选项名称 5
选项名称 6
选项名称 7
选项名称 8
选项名称 9
选项名称 10
选项名称 11
选项名称 12
选项名称 13
选项名称 14
选项名称 15
选项名称 16
选项名称 17
选项名称 18
选项名称 19
已选个数:2
选项名称 2
选项名称 4

拖拽排序

将 draggable 设为 true,开启拖拽排序功能。

总个数:30
选项名称 0
选项名称 1
选项名称 2
选项名称 3
选项名称 4
选项名称 5
选项名称 6
选项名称 7
选项名称 8
选项名称 9
选项名称 10
选项名称 11
选项名称 12
选项名称 13
选项名称 14
选项名称 15
选项名称 16
选项名称 17
选项名称 18
选项名称 19
选项名称 20
选项名称 21
选项名称 22
选项名称 23
选项名称 24
选项名称 25
选项名称 26
选项名称 27
选项名称 28
选项名称 29
已选个数:2
选项名称 2
选项名称 4

左侧分页

当左侧选项较多时,可以通过 pagination 属性开启分页功能。pagination 接收一个对象,包含 pageSize(每页条数,默认 10)、currentPage(受控页码)、defaultCurrentPage(默认页码)、onPageChange(页码变化回调)等属性。

总个数:100
选项名称 0
选项名称 1
选项名称 2
选项名称 3
选项名称 4
选项名称 5
选项名称 6
选项名称 7
选项名称 8
选项名称 9
  • 1
  • 2
  • 3
  • 4
  • …
  • 9
  • 10
已选个数:0
暂无内容,可从左侧勾选

左侧分页 + 受控页码

通过 pagination.currentPage 可以受控地设置当前页码。

当前页码: 1
总个数:100
选项名称 0
选项名称 1
选项名称 2
选项名称 3
选项名称 4
选项名称 5
选项名称 6
选项名称 7
选项名称 8
选项名称 9
  • 1
  • 2
  • 3
  • 4
  • …
  • 9
  • 10
已选个数:0
暂无内容,可从左侧勾选

拖拽 + 自定义已选项渲染

将 draggable 设为 true 开启拖拽排序功能;使用 renderSelectedItem 自定义右侧已选项渲染。你可以将拖拽触发器定义为任意节点并添加样式,将该节点用 sortableHandle() 返回的 attachment 挂载({@attach sortableHandle()})即可。

总个数:6
夏
夏可漫
申
申悦
文
文嘉茂
曲
曲晨一
二
曲晨二
三
曲晨三
已选个数:2
夏
夏可漫
申
申悦

自定义渲染面板头部信息

renderSourceHeader、renderSelectedHeader 允许用户自定义渲染左右两个面板的头部信息。

共 30 项
选项名称 0
选项名称 1
选项名称 2
选项名称 3
选项名称 4
选项名称 5
选项名称 6
选项名称 7
选项名称 8
选项名称 9
选项名称 10
选项名称 11
选项名称 12
选项名称 13
选项名称 14
选项名称 15
选项名称 16
选项名称 17
选项名称 18
选项名称 19
选项名称 20
选项名称 21
选项名称 22
选项名称 23
选项名称 24
选项名称 25
选项名称 26
选项名称 27
选项名称 28
选项名称 29
0 项已选
暂无内容,可从左侧勾选

完全自定义渲染

renderSourcePanel、renderSelectedPanel 允许你完全自定义左右侧两个面板的渲染结构。通过该功能,你可以直接复用 Transfer 内部的逻辑能力,实现高度自定义样式结构的 Transfer 组件。

门店列表
待选门店: 100

海底捞门店 0

海底捞门店 1

海底捞门店 2

海底捞门店 3

海底捞门店 4

海底捞门店 5

海底捞门店 6

海底捞门店 7

海底捞门店 8

海底捞门店 9

海底捞门店 10

海底捞门店 11

海底捞门店 12

海底捞门店 13

海底捞门店 14

海底捞门店 15

海底捞门店 16

海底捞门店 17

海底捞门店 18

海底捞门店 19

海底捞门店 20

海底捞门店 21

海底捞门店 22

海底捞门店 23

海底捞门店 24

海底捞门店 25

海底捞门店 26

海底捞门店 27

海底捞门店 28

海底捞门店 29

海底捞门店 30

海底捞门店 31

海底捞门店 32

海底捞门店 33

海底捞门店 34

海底捞门店 35

海底捞门店 36

海底捞门店 37

海底捞门店 38

海底捞门店 39

海底捞门店 40

海底捞门店 41

海底捞门店 42

海底捞门店 43

海底捞门店 44

海底捞门店 45

海底捞门店 46

海底捞门店 47

海底捞门店 48

海底捞门店 49

海底捞门店 50

海底捞门店 51

海底捞门店 52

海底捞门店 53

海底捞门店 54

海底捞门店 55

海底捞门店 56

海底捞门店 57

海底捞门店 58

海底捞门店 59

海底捞门店 60

海底捞门店 61

海底捞门店 62

海底捞门店 63

海底捞门店 64

海底捞门店 65

海底捞门店 66

海底捞门店 67

海底捞门店 68

海底捞门店 69

海底捞门店 70

海底捞门店 71

海底捞门店 72

海底捞门店 73

海底捞门店 74

海底捞门店 75

海底捞门店 76

海底捞门店 77

海底捞门店 78

海底捞门店 79

海底捞门店 80

海底捞门店 81

海底捞门店 82

海底捞门店 83

海底捞门店 84

海底捞门店 85

海底捞门店 86

海底捞门店 87

海底捞门店 88

海底捞门店 89

海底捞门店 90

海底捞门店 91

海底捞门店 92

海底捞门店 93

海底捞门店 94

海底捞门店 95

海底捞门店 96

海底捞门店 97

海底捞门店 98

海底捞门店 99

已选同步门店: 0
暂无数据,请从左侧筛选

完全自定义渲染 + 拖拽排序

在完全自定义渲染的场景下,由于拖拽区的渲染也已由你完全接管,你需要自行实现拖拽逻辑,并在拖拽排序结束后将 { oldIndex, newIndex } 作为入参调用 onSortEnd。你可以直接复用本库内置 draggable 所用的 sortable action 快速实现。

门店列表
待选门店: 100

海底捞门店 0

海底捞门店 1

海底捞门店 2

海底捞门店 3

海底捞门店 4

海底捞门店 5

海底捞门店 6

海底捞门店 7

海底捞门店 8

海底捞门店 9

海底捞门店 10

海底捞门店 11

海底捞门店 12

海底捞门店 13

海底捞门店 14

海底捞门店 15

海底捞门店 16

海底捞门店 17

海底捞门店 18

海底捞门店 19

海底捞门店 20

海底捞门店 21

海底捞门店 22

海底捞门店 23

海底捞门店 24

海底捞门店 25

海底捞门店 26

海底捞门店 27

海底捞门店 28

海底捞门店 29

海底捞门店 30

海底捞门店 31

海底捞门店 32

海底捞门店 33

海底捞门店 34

海底捞门店 35

海底捞门店 36

海底捞门店 37

海底捞门店 38

海底捞门店 39

海底捞门店 40

海底捞门店 41

海底捞门店 42

海底捞门店 43

海底捞门店 44

海底捞门店 45

海底捞门店 46

海底捞门店 47

海底捞门店 48

海底捞门店 49

海底捞门店 50

海底捞门店 51

海底捞门店 52

海底捞门店 53

海底捞门店 54

海底捞门店 55

海底捞门店 56

海底捞门店 57

海底捞门店 58

海底捞门店 59

海底捞门店 60

海底捞门店 61

海底捞门店 62

海底捞门店 63

海底捞门店 64

海底捞门店 65

海底捞门店 66

海底捞门店 67

海底捞门店 68

海底捞门店 69

海底捞门店 70

海底捞门店 71

海底捞门店 72

海底捞门店 73

海底捞门店 74

海底捞门店 75

海底捞门店 76

海底捞门店 77

海底捞门店 78

海底捞门店 79

海底捞门店 80

海底捞门店 81

海底捞门店 82

海底捞门店 83

海底捞门店 84

海底捞门店 85

海底捞门店 86

海底捞门店 87

海底捞门店 88

海底捞门店 89

海底捞门店 90

海底捞门店 91

海底捞门店 92

海底捞门店 93

海底捞门店 94

海底捞门店 95

海底捞门店 96

海底捞门店 97

海底捞门店 98

海底捞门店 99

已选同步门店: 2

海底捞门店 2

海底捞门店 4

树穿梭框

传入 type 为 treeList,使用 Tree 组件作为自定义渲染列表。可通过 treeProps 来覆盖默认树的属性。

总个数:8
Asia
China
Beijing
Shanghai
Chengdu
Japan
Osaka
North America
United States
Canada
Mexico
Cuba
已选个数:1
Shanghai

树穿梭框自定义头部显示叶子节点数量

当 type 为 treeList 时,renderSourceHeader 的入参中会额外提供 leafOnlyNum 字段,表示叶子节点的数量。这在文件选择等场景中非常有用,可以在头部只显示文件数量而不是包含文件夹的总数。

共 6 个叶子节点可选
Asia
China
Beijing
Shanghai
Chengdu
Japan
Osaka
North America
United States
Canada
已选个数:0
暂无内容,可从左侧勾选

API 参考

Transfer Props

属性说明类型默认值
class样式类名string-
dataSource数据源Item[] \| GroupItem[] \| TreeItem[][]
defaultValue默认已选中值Array<string \| number>-
disabled是否禁用booleanfalse
draggable是否开启拖拽排序booleanfalse
emptyContent自定义空状态提示文本,search 为无搜索结果、left 为左侧无源数据、right 为无勾选数据时的文本{ left, right, search }-
filter自定义筛选逻辑,为 false 时不展示搜索框,传函数可自定义搜索逻辑。当 type 为 treeList 时,如需自定义搜索逻辑,请通过 treeProps 的 filterTreeNode 设置boolean \| ((input: string, item: Item) => boolean)true
inputProps自定义搜索框 Input 的额外配置object-
loading是否正在加载左侧选项boolean-
pagination左侧面板分页配置,仅对 list 和 groupList 类型生效PaginationProps-
renderSelectedHeader自定义右侧面板头部信息的渲染Snippet<[SelectedHeaderProps]>-
renderSelectedItem自定义右侧单个已选项的渲染;当 type=treeList 且 showPath 为 true 时,可通过入参 fullPath 获取完整路径Snippet<[{ item: Item, onRemove, sortableHandle, fullPath }]>-
renderSelectedPanel自定义右侧已选面板的渲染Snippet<[SelectedPanelProps]>-
renderSourceHeader自定义左侧面板头部信息的渲染Snippet<[SourceHeaderProps]>-
renderSourceItem自定义左侧单个候选项的渲染Snippet<[{ item: Item, onChange, checked }]>-
renderSourcePanel自定义左侧候选面板的渲染Snippet<[SourcePanelProps]>-
showPath当 type 为 treeList 时,控制右侧选中项是否显示选择路径booleanfalse
style内联样式string-
treeProps当 type 为 treeList 时,作为 TreeProps 传入左侧的 Tree 组件object-
typeTransfer 类型,可选 list、groupList、treeListstringlist
virtualize右侧已选列表虚拟化,仅在默认右侧面板渲染且 draggable 为 false 时生效VirtualizeProps-
value已选中值,传入时作为受控组件使用Array<string \| number>-
onChange选中值发生变化时触发的回调,拖拽排序变化后也会触发(values, items) => void-
onDeselect取消勾选时的回调(item: Item) => void-
onSearch搜索框输入内容变化时调用(inputValue: string) => void-
onSelect勾选时的回调(item: Item) => void-

Item

属性说明类型默认值
class样式类名string-
disabled是否禁用booleanfalse
key必填,每个选项的唯一标识,不允许重复string \| number-
label选项展示内容string \| Snippet-
group所属分组名(非分组数据源可省略,由 groupList 的 title 自动填充)string-
fullPathtype=treeList 且 showPath 为 true 时,返回当前节点从根到自身的完整路径节点数组Item[]-
style内联样式string-
value选项代表的值,onChange 回传的 values 即为该字段的集合;未传时缺省等同 keystring \| number-

GroupItem

GroupItem 继承 Item 的所有属性:

属性说明类型
children该分组的元素Item[]
title分组名称string

TreeItem

TreeItem 继承 Item 的所有属性:

属性说明类型
children子元素TreeItem[]

VirtualizeProps

属性说明类型
height虚拟列表高度number \| string
width虚拟列表宽度number \| string
itemSize每行高度(固定)number

PaginationProps

属性说明类型默认值
currentPage当前页码(受控模式)number-
defaultCurrentPage默认当前页码(非受控模式)number1
pageSize每页显示条数number10
onPageChange页码变化时的回调(currentPage: number) => void-

SourceHeaderProps

renderSourceHeader snippet 的入参:

属性说明类型
num数据总数或筛选结果数目number
showButton是否展示全选/取消全选按钮boolean
allChecked当前数据是否已全选boolean
onAllClick点击全选/取消全选按钮后应调用的函数() => void
leafOnlyNum仅在 type 为 treeList 时有效,表示叶子节点数量number

SelectedHeaderProps

renderSelectedHeader snippet 的入参:

属性说明类型
num已选中数据总数number
showButton是否展示清空按钮boolean
onClear点击清空按钮后应调用的函数() => void

SourcePanelProps

renderSourcePanel snippet 的入参:

属性说明类型
value所有选中项的 keyArray<string \| number>
loading是否加载中boolean
noMatch是否没有符合当前搜索值匹配的项boolean
filterData匹配当前搜索值的项Item[]
sourceData所有项Item[]
propsDataSource原始 dataSource(Svelte snippet 无法像 React 组件那样隐式访问外部 props,故显式透传)Item[] \| GroupItem[] \| TreeItem[]
allChecked是否全部选中boolean
showNumber筛选结果数量number
inputValue搜索框的值string
onSearch搜索框变化时应调用的函数,入参为搜索值(searchString: string) => void
onAllClick左侧全部按钮点击时应调用的函数() => void
onSelectOrRemove选择、删除单个选项时应调用的函数,入参应为当前操作 item(item: Item) => void
onSelect受控批量选中 key(value: Array<string \| number>) => void
selectedItems所有已选项的集合Map<string \| number, Item>

SelectedPanelProps

renderSelectedPanel snippet 的入参:

属性说明类型
length已选项的数量number
selectedData所有已选项集合Item[]
onClear点击清空时应调用的回调函数() => void
onRemove删除单个选项时应调用的函数(item: Item) => void
onSortEnd对结果重新排序时应调用的函数({ oldIndex, newIndex }) => void

Methods

绑定在组件实例上的方法,可以通过 bind:this 拿到实例后调用:

名称描述
search(value)可通过实例调用该方法进行搜索,该搜索值会被置给 Input

Accessibility

ARIA

  • 搜索框添加 role search。
  • 右侧选中列表添加 role list,选中项添加 role listitem。

设计变量

变量
默认值
用法
--cd-transition-delay-transfer-item-bg var(--cd-motion-delay-none) 穿梭框条目-背景色-延迟时间(Semi transition_delay-none)
--cd-transition-duration-transfer-item-bg var(--cd-motion-duration-none) 穿梭框条目-背景色-动画持续时间(Semi transition_duration-none)
--cd-transition-function-transfer-item-bg var(--cd-motion-ease-in) 穿梭框条目-背景色-过渡曲线(Semi transition_function-easeIn)
显示第 1 条-第 3 条,共 3 条
  • 1