Transfer 穿梭框
Transfer 是一个用于在两个列表之间移动数据的穿梭框组件,支持数据筛选、自定义渲染、多选操作等功能。
引入
html
<script type="module">
import "./node_modules/easy-component-ui/dist/components/ea-transfer.js";
</script>js
import "easy-component-ui/ea-transfer";自定义样式
移步到 CSS Part。
基础用法
最基本的穿梭框用法,包含左右两个面板和移动按钮。
查看代码
html
<div class="demo">
<ea-transfer id="basicTransfer"></ea-transfer>
</div>js
const basicExample = {
transfer: document.querySelector("#basicTransfer"),
generateData: () => {
const data = [];
for (let i = 1; i <= 15; i++) {
data.push({
key: i,
label: `Option ${i}`,
disabled: i % 4 === 0,
});
}
return data;
},
init() {
const data = this.generateData();
this.transfer.data = data;
},
};
basicExample.init();可搜索过滤
通过设置 filterable 属性启用搜索功能,可以快速筛选数据。
查看代码
html
<div class="demo">
<ea-transfer id="filterableTransfer" filterable></ea-transfer>
</div>js
const filterableExample = {
transfer: document.querySelector("#filterableTransfer"),
generateData: () => {
const data = [];
for (let i = 1; i <= 15; i++) {
data.push({
key: i,
label: `Option ${i}`,
disabled: i % 4 === 0,
});
}
return data;
},
init() {
const data = this.generateData();
this.transfer.data = data;
},
};
filterableExample.init();自定义用法
支持自定义面板标题、按钮文本、空状态内容等。
Customize data items using render-content
查看代码
html
<div class="demo">
<p style="text-align: center; margin: 0 0 20px">
Customize data items using render-content
</p>
<div style="text-align: center">
<ea-transfer
id="customTransfer"
style="text-align: left; display: inline-block"
filterable
>
<div slot="left-footer">
<ea-button size="small" style="margin-left: 15px; padding: 6px 5px">
Operation
</ea-button>
</div>
<div slot="right-footer">
<ea-button size="small" style="margin-left: 15px;padding: 6px 5px">
Operation
</ea-button>
</div>
</ea-transfer>
</div>
</div>js
const customExample = {
transfer: document.querySelector("#customTransfer"),
generateData: () => {
const data = [];
for (let i = 1; i <= 15; i++) {
data.push({
key: i,
label: `Option ${i}`,
disabled: i % 4 === 0,
});
}
return data;
},
init() {
const data = this.generateData();
this.transfer.titles = ["Source", "Target"];
this.transfer.buttonTexts = ["To right", "To left"];
this.transfer.data = data;
this.transfer.value = [1, 2, 3];
this.transfer.addEventListener("change", event => {
console.log("Selection changed:", event.detail.value);
});
this.transfer.addEventListener("ea-left-check-change", event => {
console.log("Left check changed:", event.detail);
});
this.transfer.addEventListener("ea-right-check-change", event => {
console.log("Right check changed:", event.detail);
});
},
};
customExample.init();自定义空内容
可以为左右面板分别自定义空状态显示内容。
Customize empty content for both panels
📭
No data
📭
No data
查看代码
html
<div class="demo">
<p style="text-align: center; margin: 0 0 20px">
Customize empty content for both panels
</p>
<div style="text-align: center">
<ea-transfer id="emptyTransfer">
<div slot="left-empty">
<div style="text-align: center; padding: 20px; color: #909399">
<div style="font-size: 60px; margin-bottom: 10px">📭</div>
<div>No data</div>
</div>
</div>
<div slot="right-empty">
<div style="text-align: center; padding: 20px; color: #909399">
<div style="font-size: 60px; margin-bottom: 10px">📭</div>
<div>No data</div>
</div>
</div>
</ea-transfer>
</div>
</div>js
const emptyExample = {
transfer: document.querySelector("#emptyTransfer"),
generateData: () => {
const data = [];
for (let i = 1; i <= 15; i++) {
data.push({
key: i,
label: `Option ${i}`,
disabled: i % 4 === 0,
});
}
return data;
},
init() {
this.transfer.data = this.generateData();
this.transfer.addEventListener("change", event => {
console.log("Selection changed:", event.detail.value);
});
},
};
emptyExample.init();Transfer API
Transfer Attributes
| 参数 | 说明 | 类型 | 可选值 | 默认值 |
|---|---|---|---|---|
| disabled | 是否禁用 | Boolean | — | false |
| filterable | 是否可搜索 | Boolean | — | false |
| filter-placeholder | 搜索框占位符 | String | — | "请输入搜索内容" |
| data | 数据源 | dataProps[] | — | [] |
| value | 已选中的数据项 | Array | — | [] |
| dataProps | 数据字段映射配置 | Object | — | { key: "key", label: "label", disabled: "disabled" } |
| titles | 面板标题 | Array | — | [] |
| buttonTexts | 按钮文本 | Array | — | [] |
| filterMethod | 自定义筛选方法 | Function | — | null |
| leftDefaultChecked | 左侧默认选中项 | Array | — | [] |
| rightDefaultChecked | 右侧默认选中项 | Array | — | [] |
Transfer Methods
| 方法名 | 说明 | 参数 |
|---|---|---|
| clearQuery | 清空搜索关键词 | which: 'left' | 'right' |
Transfer Events
| 事件名 | 说明 | 回调参数(event.detail) |
|---|---|---|
| change | 选中项变化时触发 | { value: any[] } |
| ea-left-check-change | 左侧面板选中项变化时触发 | { value: any[], movedKeys?: any[] } |
| ea-right-check-change | 右侧面板选中项变化时触发 | { value: any[], movedKeys?: any[] } |
Transfer CSS Part
用法可参考 MDN ::part()伪类
| 名称 | 说明 |
|---|---|
| container | 组件容器 |
| panel | 面板容器 |
| source-panel | 左侧面板 |
| target-panel | 右侧面板 |
| buttons | 按钮区域 |
| button | 移动按钮 |
| move-to-right-btn | 向右移动按钮 |
| move-to-left-btn | 向左移动按钮 |
Transfer Slots
| 名称 | 说明 |
|---|---|
| left-empty | 左侧面板空状态内容 |
| right-empty | 右侧面板空状态内容 |
| left-footer | 左侧面板底部内容 |
| right-footer | 右侧面板底部内容 |
Transfer CSS Custom Properties
| 属性名 | 说明 | 默认值 |
|---|---|---|
| --ea-transfer-width | 面板宽度 | 200px |
| --ea-transfer-height | 面板高度 | 300px |
| --ea-transfer-border-color | 边框颜色 | var(--grey-200) |
| --ea-transfer-border-radius | 边框圆角 | var(--border-radius-sm) |
| --ea-transfer-bg-color | 背景颜色 | var(--color-white) |
| --ea-transfer-button-bg-color | 按钮背景颜色 | var(--blue-500) |
| --ea-transfer-button-disabled-bg-color | 按钮禁用背景颜色 | var(--grey-200) |
| --ea-transfer-button-hover-bg-color | 按钮悬停背景颜色 | var(--blue-400) |
| --ea-transfer-transition | 过渡动画时长 | var(--transition-fast) |
| --ea-transfer-font-size | 字体大小 | var(--font-size-md) |
TransferPanel API
TransferPanel CSS Part
| 名称 | 说明 |
|---|---|
| container | 面板容器 |
| header | 面板头部 |
| checkbox | 全选复选框 |
| title | 标题 |
| count | 计数显示 |
| body | 面板主体 |
| filter-wrapper | 搜索框容器 |
| filter | 搜索框 |
| empty | 空状态区域 |
| list | 列表容器 |
| item-checkbox | 列表项复选框 |
| item-label | 列表项标签 |
| footer | 面板底部 |
TransferPanel Slots
| 名称 | 说明 |
|---|---|
| empty | 空状态内容 |
| footer | 面板底部内容 |
TransferPanel CSS Custom Properties
| 属性名 | 说明 | 默认值 |
|---|---|---|
| --ea-transfer-panel-width | 面板宽度 | 200px |
| --ea-transfer-panel-height | 面板高度 | 300px |
| --ea-transfer-panel-border-color | 边框颜色 | var(--grey-300) |
| --ea-transfer-panel-background-color | 背景颜色 | var(--white) |
| --ea-transfer-panel-header-height | 头部高度 | 40px |
| --ea-transfer-panel-header-background | 头部背景颜色 | var(--grey-100) |
| --ea-transfer-panel-item-height | 列表项高度 | 32px |
| --ea-transfer-panel-item-hover-background | 列表项悬停背景颜色 | var(--grey-100) |
| --ea-transfer-panel-item-selected-background | 列表项选中背景颜色 | var(--blue-100) |
| --ea-transfer-panel-item-selected-color | 列表项选中文字颜色 | var(--blue-600) |
| --ea-transfer-panel-item-disabled-color | 列表项禁用文字颜色 | var(--grey-400) |
| --ea-transfer-panel-filter-height | 搜索框高度 | 40px |
| --ea-transfer-panel-footer-height | 底部高度 | 40px |
| --ea-transfer-panel-footer-background | 底部背景颜色 | var(--white) |
| --ea-transfer-panel-footer-border-color | 底部边框颜色 | var(--grey-300) |