mirror of
https://gitee.com/ant-design/ant-design.git
synced 2024-12-14 08:51:26 +08:00
51 lines
1.3 KiB
TypeScript
51 lines
1.3 KiB
TypeScript
|
import React, { useCallback, useRef, useState } from 'react';
|
||
|
import { Mentions } from 'antd';
|
||
|
import debounce from 'lodash/debounce';
|
||
|
|
||
|
const { Option } = Mentions;
|
||
|
const App: React.FC = () => {
|
||
|
const [loading, setLoading] = useState(false);
|
||
|
const [users, setUsers] = useState<{ login: string; avatar_url: string }[]>([]);
|
||
|
const ref = useRef<string>();
|
||
|
|
||
|
const loadGithubUsers = (key: string) => {
|
||
|
if (!key) {
|
||
|
setUsers([]);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
fetch(`https://api.github.com/search/users?q=${key}`)
|
||
|
.then(res => res.json())
|
||
|
.then(({ items = [] }) => {
|
||
|
if (ref.current !== key) return;
|
||
|
|
||
|
setLoading(false);
|
||
|
setUsers(items.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 (
|
||
|
<Mentions style={{ width: '100%' }} loading={loading} onSearch={onSearch}>
|
||
|
{users.map(({ login, avatar_url: avatar }) => (
|
||
|
<Option key={login} value={login} className="antd-demo-dynamic-option">
|
||
|
<img src={avatar} alt={login} />
|
||
|
<span>{login}</span>
|
||
|
</Option>
|
||
|
))}
|
||
|
</Mentions>
|
||
|
);
|
||
|
};
|
||
|
|
||
|
export default App;
|