Transfer 穿梭框
主要用于多组数据操作的场景中,当一组数据和另一组数据可以相互交换内容,或从一组数据选择其中部分数据组成一组新的数据组时,可使用穿梭框来实现。
组件注册
js
import { FTransfer } from '@fesjs/fes-design';
app.use(FTransfer);
代码演示
基础用法
当内容只需单项穿梭时,可用此组件完成操作,此组件属于排列组合型
play
<template> <FTransfer :options="options" :style="{ width: '520px' }" /> </template> <script setup lang="ts"> import { ref } from 'vue'; const options = ref( new Array(10) .fill(null) .map((_, index) => ({ label: `Option ${index + 1}`, value: index })), ); </script>
双向穿梭
当数据可进行相互交换时,可用此组件完成操作,此组件属于离散重组型
play
<template> <FTransfer twoWay :options="options" :style="{ width: '520px' }" /> </template> <script setup lang="ts"> import { ref } from 'vue'; const options = ref( new Array(10) .fill(null) .map((_, index) => ({ label: `Option ${index + 1}`, value: index })), ); </script>
搜索
可在穿梭框中配置过滤条件
play
<template> <FSpace vertical> <FTransfer filterable :options="options1" :style="{ width: '520px', height: '502px' }" /> <FTransfer twoWay filterable :options="options2" :style="{ width: '520px', height: '502px' }" /> </FSpace> </template> <script setup lang="ts"> import { ref } from 'vue'; const createOptions = (num = 12) => new Array(num) .fill(null) .map((_, index) => ({ label: `Option ${index + 1}`, value: index })); const options1 = ref(createOptions()); const options2 = ref(createOptions()); </script>
固定高度
指定 height
属性,固定组件高度
play
<template> <FForm> <FFormItem label="开启过滤"> <FSwitch v-model="filterable" /> </FFormItem> </FForm> <FTransfer :options="options" :twoWay="false" :filterable="filterable" :height="400" :style="{ width: '520px' }" /> </template> <script setup lang="ts"> import { ref } from 'vue'; const filterable = ref<boolean>(true); const options = ref( new Array(50) .fill(null) .map((_, index) => ({ label: `Option ${index + 1}`, value: index })), ); </script>
树形结构
仅在单向穿梭框生效
play
<template> <FTransfer :options="options" :style="{ width: '520px' }" /> </template> <script setup lang="ts"> import { ref } from 'vue'; const LABEL_MAP = [undefined, '三生万物', '二生三', '一生二', '道生一']; const createData = (level = 1, prefix = '') => { if (!level) { return undefined; } return new Array(2).fill(null).map((_, index) => { const key = [prefix, level, index].join(''); return { label: LABEL_MAP[level], value: key, children: createData(level - 1, key), checkable: level % 2 !== 0, }; }); }; const options = ref(createData(4)); </script>
自定义标签内容
play
<template> <FTransfer :options="options" :style="{ width: '520px' }"> <template #label="{ option }"> <div :style="{ display: 'flex', alignItems: 'center' }"> <UserManagementOutlined :style="{ marginRight: '4px' }" /> <span> {{ option.label }}</span> </div> </template> </FTransfer> </template> <script setup lang="ts"> import { ref } from 'vue'; const options = ref( new Array(10) .fill(null) .map((_, index) => ({ label: `Staff ${index + 1}`, value: index })), ); </script>
Props
属性 | 说明 | 类型 | 默认值 |
---|---|---|---|
v-model | 选中的值 | (string | number)[] | [] |
options | 选项 | TransferOption[] | [] |
twoWay | 开启双向模式 | boolean | false |
filterable | 开启过滤 | boolean | false |
filter | 过滤函数 | (text: string, option: TransferOption) => boolean | - |
height | 固定高度 | number | - |
TransferOption
属性 | 说明 | 类型 | require |
---|---|---|---|
value | 选项的值 | string | number | 必填 |
label | 选项的标签 | string | 必填 |
disabled | 是否禁用 | boolean | |
checkable | 是否显示 checkbox | boolean | |
children | 子选项(用于树形结构) | TransferOption[] |
Slots
名称 | 说明 | 参数 |
---|---|---|
label | 自定义标签内容 | { option: TransferOption } |
Events
事件名称 | 说明 | 回调参数 |
---|---|---|
change | 因交互引起 v-model 值变化时触发 | { nextValue: (string | number)[] } |