84 lines
1.7 KiB
Vue
84 lines
1.7 KiB
Vue
<docs>
|
||
---
|
||
order: 2
|
||
title:
|
||
zh-CN: 带搜索框
|
||
en-US: Search
|
||
---
|
||
|
||
## zh-CN
|
||
|
||
带搜索框的穿梭框,可以自定义搜索函数。
|
||
|
||
## en-US
|
||
|
||
Transfer with a search box.
|
||
|
||
</docs>
|
||
|
||
<template>
|
||
<a-transfer
|
||
v-model:target-keys="targetKeys"
|
||
:data-source="mockData"
|
||
show-search
|
||
:filter-option="filterOption"
|
||
:render="item => item.title"
|
||
@change="handleChange"
|
||
@search="handleSearch"
|
||
/>
|
||
</template>
|
||
<script lang="ts">
|
||
import { defineComponent, onMounted, ref } from 'vue';
|
||
interface MockData {
|
||
key: string;
|
||
title: string;
|
||
description: string;
|
||
chosen: boolean;
|
||
}
|
||
export default defineComponent({
|
||
setup() {
|
||
const mockData = ref<MockData[]>([]);
|
||
|
||
const targetKeys = ref<string[]>([]);
|
||
onMounted(() => {
|
||
getMock();
|
||
});
|
||
const getMock = () => {
|
||
const keys = [];
|
||
const mData = [];
|
||
for (let i = 0; i < 20; i++) {
|
||
const data = {
|
||
key: i.toString(),
|
||
title: `content${i + 1}`,
|
||
description: `description of content${i + 1}`,
|
||
chosen: Math.random() * 2 > 1,
|
||
};
|
||
if (data.chosen) {
|
||
keys.push(data.key);
|
||
}
|
||
mData.push(data);
|
||
}
|
||
mockData.value = mData;
|
||
targetKeys.value = keys;
|
||
};
|
||
const filterOption = (inputValue: string, option: MockData) => {
|
||
return option.description.indexOf(inputValue) > -1;
|
||
};
|
||
const handleChange = (keys: string[], direction: string, moveKeys: string[]) => {
|
||
console.log(keys, direction, moveKeys);
|
||
};
|
||
|
||
const handleSearch = (dir: string, value: string) => {
|
||
console.log('search:', dir, value);
|
||
};
|
||
return {
|
||
mockData,
|
||
targetKeys,
|
||
filterOption,
|
||
handleChange,
|
||
handleSearch,
|
||
};
|
||
},
|
||
});
|
||
</script>
|