使用ant Select,我编写了一个组件,它有两种模式. 首先:它接受选项,即 Select 数据.并显示它(此部件工作正常). 第二:它接受一个SELECT_url,组件本身发送从服务器获取数据的请求.一切正常,除了我搜索字符时,有时列表弹出窗口不显示!这是出乎意料的.我确信数据到达了setOptions,甚至_Options也有数据,但它没有显示出来.但是,当我搜索数字时,它工作得很好!

我是新手,我以前用过Vuejs.有没有可能我没有正确使用react ?

一切正常,除了我搜索字符时,有时列表弹出窗口不显示!这是出乎意料的.我确信数据到达了setOptions,甚至_Options也有数据,但它没有显示出来.但是,当我搜索数字时,它工作得很好!

以下是我的孔组件:

import React, {useEffect, useState} from "react";
import {Select, Spin} from "antd";
import {SelectOption} from "../../@types/app";

interface CustomSelectProps {
    options?: SelectOption[],
    placeholder?: string,
    select_url?: string
}

const CustomSelect: React.FC<CustomSelectProps> = (
    {
        options,
        placeholder = "انتخاب کنید",
        select_url
    }
) => {
    const [_options, setOptions] = useState<undefined | SelectOption[]>(options);
    const [nextPageUrl, setNextPageUrl] = useState<string | null>(null);
    const [loading, setLoading] = useState<boolean>(false);

    useEffect(() => {
        if (select_url) {
            search()
        } else if (options && !select_url) {
            setOptions(options);
        } else {
            // todo: notify user, that this component needs at least one of options || select_url.
            console.log("specify data. SELECT");
        }
    }, []);

    const search = async (input: string = '') => {
        if (!select_url) return;

        setLoading(true);
        setOptions(() => []);

        const url = `${select_url}?search=${input}&page=1`;

        try {
            const response = await fetch(url);
            if (!response.ok) {
                return new Error(`Network response was not ok (${response.status})`);
            }
            const data = await response.json();
            setNextPageUrl(data.next);
            setOptions(prevOptions => [...prevOptions, ...data.data]);
        } catch (error) {
            console.error('Error fetching data:', error);
        } finally {
            setLoading(false);
        }
    };

    const handlePopupScroll = async (e: React.UIEvent<HTMLDivElement>) => {
        if (!select_url) return;

        const popupContainer = e.currentTarget;
        const isAtEndOfScroll = popupContainer.scrollTop + popupContainer.clientHeight === popupContainer.scrollHeight;

        if (isAtEndOfScroll && nextPageUrl && !loading) {
            try {
                const res = await (await fetch(nextPageUrl)).json();
                setNextPageUrl(res.next);
                const {data} = res;
                setOptions((prevState) => {
                    return [...prevState, ...data];
                });
            } catch (e) {
                console.log(e);
            } finally {
                setLoading(false);
            }
        }
    }

    // filter options based on user input in client mode.
    const handleFilterOption = (input: string, option?: SelectOption) => (option?.label ?? '').toLowerCase().includes(input.toLowerCase());

    return (
        <Select
            options={_options}
            placeholder={placeholder}
            showSearch={true}
            filterOption={select_url ? undefined : handleFilterOption}
            onSearch={search}
            notFoundContent={loading ? <Spin size="small"/> : null}
            virtual={true}
            onPopupScroll={handlePopupScroll}
        >
        </Select>
    );
}

export default CustomSelect;

以下是数据的来源:

[
   { label: "test", value: "value", key: "1" },
]  

推荐答案

您应该使用optionFilterProp来 Select select组件的搜索位置,并根据您键入的内容进行筛选.

正如docs中所说的:

optionFilterProp-如果filterOption为真,则选项的哪个适当值将用于筛选器.如果设置为options,则应设置为label

希望这能有所帮助:)

Reactjs相关问答推荐

如何防止使用useCallback和memo重新渲染

CreateBrowserRouter将props 传递给父组件以验证权限

在react.js的条形图中获取错误&unfined是不可迭代的

为什么我的react虚拟化列表不显示滚动条,除非我确保高度低于rowCount*rowHeight?

每次单击按钮时,Reaction组件都会重新生成

使用Next.js和Next-intl重写区域设置

我在Route组件上使用元素属性,这样就不需要ID了吗?

React-apexcharts 中的 Y 轴刻度不会动态更新符号

无法使用 Suspense 和 Await 获取数据

React-chartjs-2:红色和绿色之间的差距

显示我是否加入聊天应用程序时出现问题

ReactJS on AWS Amplify与EC2上的Spring boot服务之间的混合内容错误

如何测试使用 React.createportal 呈现的组件?

如何初始化 redux 全局存储 preloadedState

Redux Toolkit 配置,是否适用于全栈应用程序?

状态链接未传递到路由页面

如何在 React 中使用 debounce hooks

React如何在用户登录后等待当前用户数据被获取

我在使用 Elements of stripe 时使用 React router v6

警告:您在没有 `onChange` 处理程序的情况下为表单字段提供了 `value` 属性