Компонент Transfer предназначен для организации двустороннего переноса элементов между двумя списками. Он часто используется в сценариях, где требуется выбор нескольких элементов из общего набора и распределение их между «доступными» и «выбранными» категориями.
Компонент реализуется через тег <el-transfer> и
имеет следующие ключевые атрибуты:
<el-transfer
v-model="targetKeys"
:data="data"
:props="props"
filterable
:titles="['Доступно', 'Выбрано']"
:button-texts="['Добавить', 'Удалить']"
:render-content="renderFunc"
/>
v-model="targetKeys" – связывает компонент с массивом
ключей элементов, которые находятся в целевом списке.:data="data" – массив объектов с элементами, доступными
для переноса. Каждый объект должен содержать уникальный ключ.:props="props" – позволяет задать сопоставление полей
объекта для корректного отображения (key,
label, disabled).filterable – включает возможность поиска элементов в
списках.:titles – задаёт заголовки для исходного и целевого
списков.:button-texts – подписи для кнопок переноса.:render-content – функция для кастомного рендеринга
элементов.data() {
return {
data: [
{ key: 1, label: 'Элемент 1', disabled: false },
{ key: 2, label: 'Элемент 2', disabled: true },
{ key: 3, label: 'Элемент 3', disabled: false },
],
targetKeys: [3],
props: {
key: 'key',
label: 'label',
disabled: 'disabled',
},
};
}
key – уникальный идентификатор
элемента.label – текст, который будет
отображаться в списке.disabled – если true,
элемент нельзя переносить.Для вывода сложного содержимого вместо простого текста используется
атрибут render-content:
methods: {
renderFunc(h, option) {
return h('span', {}, [
`${option.label} (ID: ${option.key})`
]);
}
}
Включение фильтрации осуществляется через атрибут
filterable. По умолчанию поиск производится по полю
label, но можно задать кастомный поиск через событие
filter-method:
<el-transfer
v-model="targetKeys"
:data="data"
filterable
:filter-method="customFilter"
/>
methods: {
customFilter(query, item) {
return item.label.toLowerCase().includes(query.toLowerCase());
}
}
query – введённая пользователем строка.item – объект текущего элемента.true отображает элемент,
false – скрывает.Компонент поддерживает несколько событий для контроля действий пользователя:
change – вызывается при переносе
элементов между списками.methods: {
handleChange(newTargetKeys, direction, moveKeys) {
console.log(newTargetKeys, direction, moveKeys);
}
}
left-check-change и
right-check-change – реагируют на
выделение элементов в списках.methods: {
handleCheckChange(checkedKeys, direction) {
console.log(checkedKeys, direction);
}
}
left-arrow-click и
right-arrow-click – события нажатия кнопок
переноса.Можно полностью изменить подписи кнопок или использовать иконки:
<el-transfer
:button-texts="['Вправо', 'Влево']"
:render-content="renderFunc"
/>
Если требуется условно отключать кнопки, используется атрибут
disabled на элементе или настройка глобального
disabled для всего компонента.
size (medium, small,
mini).class и
list-class-name для кастомного оформления списков.data через
реактивные свойства Vue.change и filter-method.Эта конфигурация обеспечивает полный контроль над компонентом Transfer: от визуального отображения и фильтрации до событий и кастомной логики переноса элементов между списками.