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

相关推荐
WooaiJava43 分钟前
AI 智能助手项目面试技术要点总结(前端部分)
javascript·大模型·html5
LYFlied1 小时前
从 Vue 到 React,再到 React Native:资深前端开发者的平滑过渡指南
vue.js·react native·react.js
爱喝白开水a1 小时前
前端AI自动化测试:brower-use调研让大模型帮你做网页交互与测试
前端·人工智能·大模型·prompt·交互·agent·rag
Never_Satisfied1 小时前
在JavaScript / HTML中,关于querySelectorAll方法
开发语言·javascript·html
董世昌411 小时前
深度解析ES6 Set与Map:相同点、核心差异及实战选型
前端·javascript·es6
B站_计算机毕业设计之家1 小时前
豆瓣电影数据采集分析推荐系统 | Python Vue Flask框架 LSTM Echarts多技术融合开发 毕业设计源码 计算机
vue.js·python·机器学习·flask·echarts·lstm·推荐算法
WeiXiao_Hyy2 小时前
成为 Top 1% 的工程师
java·开发语言·javascript·经验分享·后端
吃杠碰小鸡2 小时前
高中数学-数列-导数证明
前端·数学·算法
kingwebo'sZone2 小时前
C#使用Aspose.Words把 word转成图片
前端·c#·word
xjt_09013 小时前
基于 Vue 3 构建企业级 Web Components 组件库
前端·javascript·vue.js