React MultiSelect не работает должным образом

Проблема в том, что когда значение MultiSelect не пусто, функция, которая вызывается для filterOptions реквизита MultiSelect, продолжает выполнять вызов Http внутри него.

import MultiSelect from "react-multi-select-component";
...


const [invoices,set_invoices] = useState([]);
const [selected, setSelected] = useState([]);

function test(options, filter) {
    if (!filter) {
        return options;
    }
    var data={'invoice_number':'22'}
    axios.post('http://localhost:4000/get_invoice_by_number',data).then(
        response => {
            /* Matching the array elements to be like {lable:'',value:''} */
            var temp_invoices=[];
            for(var i =0;i<response.data.length;i++){
                temp_invoices.push({
                    label:response.data[i].invoice_number,
                    value:response.data[i].invoice_number
                })
            }
            /* This is updating the list with response.data that is coming from the API */
            set_invoices(temp_invoices);
            console.log('FIRED')

        },error =>{
            console.log(error);
        }
    )
    return options;

}


<MultiSelect
    options={invoices}
    value={selected}
    labelledBy={"Select"}
    onChange={setSelected}
    filterOptions={test}
/>

В console.log отображается это, когда я просто ввожу одну букву

Вот что происходит, когда я набираю текст в поле ввода MultiSelect

Я попытался удалить set_invoices(temp_invoices); из test function и попытался набрать, он показал только FIRED два раза и только при наборе текста.

Я застрял на этом с нескольких часов и не понял проблемы. Буду признателен за любую оказанную помощь.


person Ali Al Amine    schedule 07.05.2020    source источник


Ответы (2)


Вы устанавливаете состояние set_invoices(temp_invoices); в своей функции test, что вызовет повторный рендеринг, а функция test выполняется снова (и снова...), что приводит к бесконечному циклу.

Кроме того, библиотека react-multi-select-component не поддерживает асинхронную фильтрацию. Это будет слишком много работы/хака, чтобы заставить его работать (копать исходный код, настраивать его и т. д.).

Вместо этого вы можете использовать react-select AsyncSelect.

person gdh    schedule 07.05.2020
comment
Спасибо, но я предпочитаю Ant Select, так как он более динамичный и имеет очень четкую документацию. - person Ali Al Amine; 08.05.2020

Я использовал Ant Select вместо MultiSelect, у которого очень понятная документация и с ним легко работать. Я настоятельно рекомендую это.

person Ali Al Amine    schedule 08.05.2020