ant-design-vue/components/mentions/demo/async.vue

74 lines
1.6 KiB
Vue

<docs>
---
order: 1
title:
zh-CN: 异步加载
en-US: Asynchronous loading
---
## zh-CN
匹配内容列表为异步返回时
## en-US
async.
</docs>
<template>
<a-mentions v-model:value="value" :options="options" :loading="loading" @search="onSearch">
<template #option="{ payload }">
<img :src="payload.avatar_url" :alt="payload.login" />
<span>{{ payload.login }}</span>
</template>
</a-mentions>
</template>
<script lang="ts" setup>
import { debounce } from 'lodash-es';
import { computed, ref } from 'vue';
import { MentionsProps } from '..';
const value = ref<string>('');
const loading = ref<boolean>(false);
const users = ref<{ login: string; avatar_url: string }[]>([]);
const search = ref<string>('');
const loadGithubUsers = debounce((key: string) => {
if (!key) {
users.value = [];
return;
}
fetch(`https://api.github.com/search/users?q=${key}`)
.then(res => res.json())
.then(({ items = [] }) => {
if (search.value !== key) return;
users.value = items.slice(0, 10);
loading.value = false;
});
}, 800);
const onSearch = (searchValue: string) => {
search.value = searchValue;
loading.value = !!searchValue;
console.log(!!searchValue);
users.value = [];
console.log('Search:', searchValue);
loadGithubUsers(searchValue);
};
const options = computed<MentionsProps['options']>(() =>
users.value.map(user => ({
key: user.login,
value: user.login,
class: 'antd-demo-dynamic-option',
payload: user,
})),
);
</script>
<style scoped>
.antd-demo-dynamic-option img {
width: 20px;
height: 20px;
margin-right: 8px;
}
</style>