Transfer 穿梭框

双栏多选选择器,直观展示已选与未选,支持搜索、分组、拖拽。

何时使用

  • 需要在两栏之间移动数据、批量选择时。

基础用法

数据项需传入 labelvaluekey

<script setup lang="ts">
import { ref } from "vue";
import { Transfer } from "@reglow/reui";

const value = ref([]);
const data = Array.from({ length: 20 }, (_, i) => ({
  label: `选项 ${i}`,
  value: i,
  key: `key-${i}`,
}));
</script>

<template>
  <Transfer
    v-model="value"
    :data-source="data"
    :height="400"
    filter
    @change="(val, items) => console.log(val, items)"
  />
</template>
待选项 (20)
选项 1
选项 2
选项 3
选项 4
选项 5
选项 6
选项 7
选项 8
选项 9
选项 10
选项 11
选项 12
选项 13
选项 14
选项 15
选项 16
选项 17
选项 18
选项 19
选项 20
已选项 (3)
选项 1
选项 2
选项 3

分组模式

设置 typegroupList,数据源使用分组结构。

<script setup lang="ts">
import { ref } from "vue";

const value = ref([]);
const data = [
  {
    title: "类别 A",
    children: [
      { label: "A-1", value: 1, key: "1" },
      { label: "A-2", value: 2, key: "2" },
      { label: "A-3", value: 3, key: "3" },
    ],
  },
  {
    title: "类别 B",
    children: [
      { label: "B-1", value: 4, key: "4" },
      { label: "B-2", value: 5, key: "5" },
      { label: "B-3(禁用)", value: 6, key: "6", disabled: true },
    ],
  },
];
</script>

<template>
  <Transfer v-model="value" :data-source="data" type="groupList" :height="400" />
</template>

可搜索

设置 filter 开启搜索功能。

<template>
  <Transfer
    v-model="value"
    :data-source="data"
    filter
    :height="400"
  />
</template>

拖拽排序

设置 draggable 开启右侧已选项的拖拽排序功能。

<template>
  <Transfer
    v-model="value"
    :data-source="data"
    draggable
    :height="400"
  />
</template>

左侧分页

设置 pagination 开启左侧分页功能。

<script setup lang="ts">
const data = Array.from({ length: 100 }, (_, i) => ({
  label: `选项 ${i}`,
  value: i,
  key: `key-${i}`,
}));
</script>

<template>
  <Transfer
    v-model="value"
    :data-source="data"
    :pagination="{ pageSize: 10 }"
    :height="400"
  />
</template>

受控页码

通过 currentPageonPageChange 受控管理页码。

<script setup lang="ts">
import { ref } from "vue";

const currentPage = ref(1);
</script>

<template>
  <Transfer
    v-model="value"
    :data-source="data"
    :pagination="{
      pageSize: 10,
      currentPage: currentPage,
      onPageChange: (p) => currentPage = p,
    }"
    :height="400"
  />
</template>

禁用

设置 disabled 禁用整个组件。

<template>
  <Transfer
    v-model="value"
    :data-source="data"
    disabled
    :height="400"
  />
</template>

默认值

使用 default-value 设置非受控默认选中值。

<script setup lang="ts">
const data = Array.from({ length: 20 }, (_, i) => ({
  label: `选项 ${i}`,
  value: i,
  key: `key-${i}`,
}));
</script>

<template>
  <Transfer
    :data-source="data"
    :default-value="[2, 4]"
    :height="400"
    @change="(val) => console.log(val)"
  />
</template>

自定义标题

通过 title-text 自定义左右两侧标题。

<template>
  <Transfer
    v-model="value"
    :data-source="data"
    :title-text="['待选列表', '已选列表']"
    :height="400"
  />
</template>

禁用单个选项

在数据项中设置 disabled: true 可禁用单个选项。

<script setup lang="ts">
import { ref } from "vue";

const value = ref([]);
const data = [
  { label: "选项1", value: 1, key: "1" },
  { label: "选项2(禁用)", value: 2, key: "2", disabled: true },
  { label: "选项3", value: 3, key: "3" },
];
</script>

<template>
  <Transfer v-model="value" :data-source="data" :height="300" />
</template>

导入

import { Transfer } from "@reglow/reui";
import type { TransferItem, TransferGroupItem } from "@reglow/reui";

Props

属性类型默认值说明
modelValue(string | number)[][]选中值(v-model)
dataSourceTransferItem[] | TransferGroupItem[][]数据源
defaultValue(string | number)[][]默认选中值
type"list" | "groupList""list"列表 / 分组模式
disabledbooleanfalse是否禁用
filterbooleanfalse可搜索
searchPlaceholderstring搜索搜索占位文字
filterPropstringlabel搜索匹配属性
titleText[string, string]["源", "目标"]左右标题
draggablebooleanfalse可拖拽排序
paginationTransferPagination | booleanfalse分页配置
showAllSelectbooleantrue显示全选按钮
showClearbooleantrue显示清空按钮
emptyText[string, string]["暂无数据", "暂无数据"]空数据文案
heightnumber | string400高度
classstring-附加类名

Events

事件说明回调参数
change选中变化(value, items)
search搜索(direction, value)
pageChange页码变化(page)

类型

TransferItem

属性类型默认值说明
labelstring-标签
valuestring | number-
keystringvalue唯一标识
disabledbooleanfalse是否禁用

TransferGroupItem

属性类型说明
titlestring分组标题
childrenTransferItem[]子项

TransferPagination

属性类型默认值说明
pageSizenumber10每页条数
currentPagenumber-当前页码(受控)
defaultCurrentPagenumber1默认页码
onPageChange(page: number) => void-页码变化回调

国际化

搜索占位、标题、空状态、全选/取消全选等文案默认跟随全局语言(zh-CN / zh-TW / en-US),传 prop 可覆盖。