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。当然其实也完全可以把这个函数放到其他位置,比如说在一个对话框内嵌一个穿梭框,然后把这个函数绑定到对话框的按钮上。

相关推荐
恋猫de小郭36 分钟前
Flutter Zero 是什么?它的出现有什么意义?为什么你需要了解下?
android·前端·flutter
崔庆才丨静觅7 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby60618 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了8 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅8 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅8 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅9 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment9 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅9 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊9 小时前
jwt介绍
前端