<docs>
---
order: 10
title:
  zh-CN: 搜索用户
  en-US: Search and Select Users
---

## zh-CN

一个带有远程搜索,节流控制,请求时序控制,加载状态的多选示例。

## en-US

A complete multiple select sample with remote search, debounce fetch, ajax callback order flow, and loading state.

</docs>

<template>
  <a-select
    v-model:value="value"
    mode="multiple"
    label-in-value
    placeholder="Select users"
    style="width: 100%"
    :filter-option="false"
    :not-found-content="fetching ? undefined : null"
    :options="data"
    @search="fetchUser"
  >
    <template v-if="fetching" #notFoundContent>
      <a-spin size="small" />
    </template>
  </a-select>
</template>
<script>
import { defineComponent, reactive, toRefs, watch } from 'vue';
import { debounce } from 'lodash-es';

export default defineComponent({
  setup() {
    let lastFetchId = 0;

    const state = reactive({
      data: [],
      value: [],
      fetching: false,
    });

    const fetchUser = debounce(value => {
      console.log('fetching user', value);
      lastFetchId += 1;
      const fetchId = lastFetchId;
      state.data = [];
      state.fetching = true;
      fetch('https://randomuser.me/api/?results=5')
        .then(response => response.json())
        .then(body => {
          if (fetchId !== lastFetchId) {
            // for fetch callback order
            return;
          }
          const data = body.results.map(user => ({
            label: `${user.name.first} ${user.name.last}`,
            value: user.login.username,
          }));
          state.data = data;
          state.fetching = false;
        });
    }, 300);

    watch(state.value, () => {
      state.data = [];
      state.fetching = false;
    });

    return {
      ...toRefs(state),
      fetchUser,
    };
  },
});
</script>