element-plus穿梭框transfer的调整

vue3的组件库element-plus内部包含一个穿梭框组组件

Transfer 穿梭框 | Element Plus

修改宽度和高度

这个组件没有提供修改高度和宽度的接口,默认的宽度和高度太小,内容稍微多一点就显示不出来了。

修改el-transfer height/width_el-transfer修改高度和宽度-CSDN博客

记录了修改穿梭框宽度的方法,但是有点语焉不详,这里补充一下。

在每一个单文件组件的<style>部分,插入以下代码

css 复制代码
.el-transfer {
  --el-transfer-panel-width: 450px;
  --el-transfer-panel-body-height: 400px;
}

就可以修改穿梭框的宽度和高度

数据的对应关系

穿梭框组件对应的数据是data,在定义组件时通过v-bind或者缩写:来指定数据,这个数据是ref的Array

默认情况下,data对应的数据应该是Array<TransferPropsAlias>类型,而TransferPropsAlias内部包含3项:key、label、disabled

默认情况下,穿梭框显示的是label。如果disabled定义为true,则不可勾选

穿梭框右侧对应的数据是v-model,在定义组件时指定,这个数据是ref的Array。其数据类型是Array<typeof key>,也就是data的key组成的数组。

穿梭框初始化后,data输入,v-model是一个空数组。此时穿梭框左侧列出data中的数据,右侧为空。当通过穿梭框把左侧的数据向右侧移动时,内部其实只是把左侧对应项的key复制到右侧v-model的Array<typeof key>中。左侧显示会减少,但是实际上data是不变的,想要修改data必须要等到其他事件发生,比如说定义的另外一个按钮被点击触发一个函数,该函数读取data和v-model并进行操作。

TransferPropsAlias类型太过简单,恐怕无法满足使用需求,那么可以使用props选项把TransferPropsAlias类型中的几项映射到其他变量名。

比如说有一个变量类型

javascript 复制代码
export interface CompanyUser {
    user_id: number;
    department: string;
    title: string;
    work_email: string;
    work_name: string;
}

在定义穿梭框时可以这样

javascript 复制代码
<el-transfer
    v-model="removedMembersRef"
    style="text-align: left; display: inline-block"
    :titles="['组内用户', '将要移除']"
    :button-texts="['不再移除', '准备移除']"
    :format="{
        noChecked: '${total}',
        hasChecked: '${checked}/${total}',
    }"
    :props="{
        key: 'user_id',
    }"
    v-bind:data="membersListRef"
    @change="handleChange"
>
    <template #default="{ option }">
        <span>{{ option.work_email }} - {{ option.work_name }}</span>
    </template>
    <template #left-footer>
        <el-button class="transfer-footer" size="small">Operation</el-button>
    </template>
    <template #right-footer>
        <el-button class="transfer-footer" size="small">Operation</el-button>
    </template>
</el-transfer>

data绑定的memberListRef的数据类型是ref<Array<CompanyUser>>(),可以看到CompanyUser类型内部没有key这项

在props里定义key映射到user_id上,这样v-model所绑定的removedMembersRef的数据类型就变成了Array<typeof user_id>也就是Array<number>

在显示的部分,通过v-slot:default插槽设定显示模板内容,但是穿梭框仅支持{option}这么一种写法,不可以采用其他写法。比如说改个名字采用{ slotProp }的写法,会提示slotProp is undefined

用了props以后,此时option的数据类型就成了CompanyUser,所以就可以使用option.work_email和option.work_name

而在v-slot:left-footer和v-slot:right-footer插槽里可以自定义一些其他东西,比如说按钮,并且在按钮关联回调函数,通过回调函数来操作data和v-model。当然其实也完全可以把这个函数放到其他位置,比如说在一个对话框内嵌一个穿梭框,然后把这个函数绑定到对话框的按钮上。

相关推荐
IT_陈寒9 小时前
Java线程池踩了个坑,任务居然默默消失了
前端·人工智能·后端
程序员爱钓鱼10 小时前
配置 GoLand 与 VS Code 开发环境
前端·后端·go
张人玉10 小时前
基于 Vue 3 + ECharts + Express + SQLite 构建的鞋类零售数据分析与毛利预测平台——基于深度学习的鞋类销售数据分析系统
vue.js·sqlite·echarts·express
程序员爱钓鱼10 小时前
Rust Vec 动态数组详解:创建、增删、遍历与排序
前端·后端·rust
LaughingZhu10 小时前
Product Hunt 每日热榜 | 2026-07-23
前端·神经网络·react.js·搜索引擎·前端框架
To_OC10 小时前
拼路径读文件总踩坑?我把 Node 的 path 和 fs 彻彻底底捋了一遍
javascript·后端·node.js
自然 醒10 小时前
记录We码开发者工具的一个bug
前端·javascript·bug
葡萄城技术团队10 小时前
HTML元素单元格:用自定义 CellType 扩展 SpreadJS 的显示能力
前端·javascript·html
不好听61310 小时前
Fragment:React 的 `<></>` 和原生的 DocumentFragment,同名不同命
前端·react.js·dom
不好听61311 小时前
useState 完全解析:初始化、异步更新、以及为什么传函数能解决闭包问题
前端·react.js