diff --git a/components/mentions/demo/async.md b/components/mentions/demo/async.md index da9d1ffefe3f..33bf9f02bd51 100644 --- a/components/mentions/demo/async.md +++ b/components/mentions/demo/async.md @@ -6,6 +6,66 @@ async +```tsx +import { Mentions } from 'antd'; +import debounce from 'lodash/debounce'; +import React, { useCallback, useRef, useState } from 'react'; + +const App: React.FC = () => { + const [loading, setLoading] = useState(false); + const [users, setUsers] = useState<{ login: string; avatar_url: string }[]>([]); + const ref = useRef(); + + const loadGithubUsers = (key: string) => { + if (!key) { + setUsers([]); + return; + } + + fetch(`https://api.github.com/search/users?q=${key}`) + .then(res => res.json()) + .then(({ options = [] }) => { + if (ref.current !== key) return; + + setLoading(false); + setUsers(options.slice(0, 10)); + }); + }; + + const debounceLoadGithubUsers = useCallback(debounce(loadGithubUsers, 800), []); + + const onSearch = (search: string) => { + console.log('Search:', search); + ref.current = search; + setLoading(!!search); + setUsers([]); + + debounceLoadGithubUsers(search); + }; + + return ( + ({ + key: login, + value: login, + className: 'antd-demo-dynamic-option', + label: ( + <> + {login} + {login} + + ), + }))} + /> + ); +}; + +export default App; +``` +