Skip to content

Transfer 穿梭框

规则

基础示例

js
const rule = {
    type:"aTransfer",
    title:"穿梭框",
    field:"transfer",
    modelField:"selectedKeys",
    value:[],
    props:{
        titles:['Source', 'Target'],
        render: (item) => item.label,
        dataSource:[{
            value: 'beijing',
            label: '北京',
            children: [
                {
                    value: 'gugong',
                    label: '故宫'
                },
                {
                    value: 'tiantan',
                    label: '天坛'
                },
                {
                    value: 'wangfujing',
                    label: '王府井'
                }
            ]
        }, {
            value: 'jiangsu',
            label: '江苏',
            children: [
                {
                    value: 'nanjing',
                    label: '南京',
                    children: [
                        {
                            value: 'fuzimiao',
                            label: '夫子庙',
                        }
                    ]
                },
                {
                    value: 'suzhou',
                    label: '苏州',
                    children: [
                        {
                            value: 'zhuozhengyuan',
                            label: '拙政园',
                        },
                        {
                            value: 'shizilin',
                            label: '狮子林',
                        }
                    ]
                }
            ]
        }]
    }
}

Props 配置示例

可搜索

js
const rule = {
    type:"aTransfer",
    title:"用户选择",
    field:"users",
    modelField:"selectedKeys",
    value:[],
    props:{
        titles:['待选用户', '已选用户'],
        dataSource:[
            {value: '1', label: '张三'},
            {value: '2', label: '李四'},
            {value: '3', label: '王五'},
        ],
        showSearch: true,
        render: (item) => item.label,
    },
}

自定义标题和按钮

js
const rule = {
    type:"aTransfer",
    title:"权限分配",
    field:"permissions",
    modelField:"selectedKeys",
    value:[],
    props:{
        titles:['待选权限', '已选权限'],
        operations: ['添加', '移除'],
        dataSource:[
            {value: 'view', label: '查看'},
            {value: 'edit', label: '编辑'},
            {value: 'delete', label: '删除'},
        ],
        render: (item) => item.label,
    },
}

Events 事件示例

监听选择变化

js
const rule = {
    type:"aTransfer",
    title:"用户选择",
    field:"users",
    modelField:"selectedKeys",
    value:[],
    props:{
        dataSource:[
            {value: '1', label: '张三'},
            {value: '2', label: '李四'},
        ],
        render: (item) => item.label,
    },
    on: {
        change: (targetKeys, direction, moveKeys) => {
            console.log('右侧列表变化:', targetKeys);
            console.log('移动方向:', direction);
            console.log('移动的key:', moveKeys);
        },
        search: (direction, value) => {
            console.log('搜索:', direction, value);
        },
    },
}

选择后统计数量

js
const rule = [
    {
        type:"aTransfer",
        title:"用户选择",
        field:"users",
        modelField:"selectedKeys",
        value:[],
        props:{
            dataSource:[
                {value: '1', label: '张三'},
                {value: '2', label: '李四'},
                {value: '3', label: '王五'},
            ],
            render: (item) => item.label,
        },
        inject: true,
        on: {
            change: ($inject, targetKeys) => {
                // 自动更新已选数量
                $inject.api.setValue('selectedCount', targetKeys.length);
            },
        },
    },
    {
        type:"input-number",
        field:"selectedCount",
        title:"已选数量",
        props: {
            disabled: true,
        },
    },
]

完整配置项:Ant-design-vue_Transfer

Props

参数说明类型默认值
dataSource数据源,其中的数据将会被渲染到左边一栏中,targetKeys 中指定的除外。[{key: string.isRequired,title: string.isRequired,description: string,disabled: bool}][][]
disabled是否禁用booleanfalse
filterOption接收 inputValue option 两个参数,当 option 符合筛选条件时,应返回 true,反之则返回 false(inputValue, option): boolean
footer可以设置为一个 作用域插槽slot="footer" slot-scope="props"
listStyle两个穿梭框的自定义样式CSSProperties
locale各种语言object{ itemUnit: '项', itemsUnit: '项', notFoundContent: '列表为空', searchPlaceholder: '请输入搜索内容' }
oneWay展示为单向样式booleanfalse
operations操作文案集合,顺序从上至下string[]['>', '<']
operationStyle操作栏的自定义样式CSSProperties-
pagination使用分页样式,自定义渲染列表下无效boolean | { pageSize: number, simple: boolean, showSizeChanger?: boolean, showLessItems?: boolean }flase
render每行数据渲染函数,该函数的入参为 dataSource 中的项,返回值为 element。或者返回一个普通对象,其中 label 字段为 element,value 字段为 titleFunction(record)| slot
selectAllLabels自定义顶部多选框标题的集合VueNode | ((info: { selectedCount: number; totalCount: number }) => VueNode)-
selectedKeys(v-model)设置哪些项应该被选中string[][]
showSearch是否显示搜索框booleanfalse
showSelectAll是否展示全选勾选框booleantrue
status设置校验状态'error' | 'warning'-
targetKeys(v-model)显示在右侧框数据的 key 集合string[][]
titles标题集合,顺序从左至右string[]['', '']

Events

事件名称说明回调参数
change选项在两栏之间转移时的回调函数(targetKeys, direction, moveKeys): void
scroll选项列表滚动时的回调函数(direction, event): void
search搜索框内容时改变时的回调函数(direction: 'left'|'right', value: string): void
selectChange选中项发生改变时的回调函数(sourceSelectedKeys, targetSelectedKeys): void

Render Props

Transfer 支持接收 children 自定义渲染列表,并返回以下参数:

json
{
  "direction": String,
  "disabled": Boolean,
  "filteredItems": Array,
  "selectedKeys": Array,
  "onItemSelect": Function,
  "onItemSelectAll": Function
}
参数说明类型
direction渲染列表的方向'left' | 'right'
disabled是否禁用列表boolean
filteredItems过滤后的数据TransferItem[]
itemSelect勾选条目(key: string, selected: boolean)
itemSelectAll勾选一组条目(keys: string[], selected: boolean)
selectedKeys选中的条目string[]

FormCreate 是一个开源项目,基于 MIT 许可证发布,欢迎个人和企业用户免费使用