#reactjs #search #react-hooks #fetch
#reactjs #Поиск #реагирующие перехваты #выборка
Вопрос:
У меня есть поле ввода, при нажатии на которое отображается список выбранных данных. Теперь мне нужно иметь возможность выполнять поиск по данным на основе любой буквы, которую содержат данные.
Пример: у меня есть список разных цветов — когда я ввожу в поле ввода букву L — все цвета, в которых есть эта буква, фильтруются по -черному, желтому, синему и т.д….
const colorInformations = "secretURL";
const [colorData, setColorData] = useState([]);
useEffect(() => {
getColorInfo();
}, []);
const getColorInfo = async () => {
try {
const response = await fetch(colorInformations);
const jsonData = await response.json();
const { array1, array2 } = jsonData;
const combinedData = array1.map(({ data1 }, i) => ({
...data1,
...array2[i].data2
}));
setColorData(combinedData);
} catch (err) {
console.log(err)
}
};
Извлеченные данные:
{ colorData amp;amp; colorData.map(( data1, data2, index) =>
<li key={"index" index}>
<div className="col-6 text ">
<h5>{data1.name} </h5>
<p>{data2.color} </p>
</li>
)}
Для ввода я пытаюсь сделать это:
<input type="text" onChange={handleSearchChange} value={search} />
И функция handleSearchChange:
const [search, setSearch] = useState("");
const handleSearchChange = (e) => {
setSearch(e.target.value)
}
Здесь я застрял, мне нужно закончить:
- Фильтруйте данные на основе букв — при вводе L фильтруются все цвета с L в
- Когда я нажимаю на определенный цвет, он должен отображаться в форме ввода и его нужно запомнить в списке — поэтому, когда список снова открывается, выбранный цвет все еще активен
Я знаю, что должен использовать .функция filter () — я просто не уверен, как и где
Ответ №1:
1- добавьте новое состояние для filteredData.
const [filteredColorData, setFilteredColorData] = useState([]);
2- onMount установите выбранные данные в отфильтрованные данные вместе с фактическим источником данных.
const getColorInfo = async () => {
try {
const response = await fetch(colorInformations);
const jsonData = await response.json();
const { array1, array2 } = jsonData;
const combinedData = array1.map(({ data1 }, i) => ({
...data1,
...array2[i].data2
}));
setColorData(combinedData);
setFilteredColorData(combinedData); // set fetched Data.
} catch (err) {
console.log(err);
}
};
3- визуализация отфильтрованных данных, а не фактических данных.
{
filteredColorData amp;amp; filteredColorData.map(( data1, data2, index) =>
<li key={"index" index}>
<div className="col-6 text ">
<h5>{data1.name} </h5>
<p>{data2.suggestion} </p>
</div>
</li>
)
}
4- реализовать функциональность фильтра, которая фильтрует данные и устанавливает отфильтрованные данные,
а также повторно передает их каждому пользовательскому вводу.
useEffect(() => {
filterdata();
}, [search])
const filterdata = () => {
const filtered = colorData amp;amp; colorData.filter((data1) => {
return data1.name.toLowerCase().startsWith(search.toLowerCase())
})
setFilteredColorData(filtered);
}
также проверьте эту ссылку для вдохновения
в режиме реального времени рабочая демонстрация
Комментарии:
1. @Jane, тебе нужно использовать его в перехвате useEffect, как показано в приведенном выше коде.
2. Я вижу, это было мое неправильное чтение. Хотя у меня возникает ошибка: attributes.name.toLowerCase.startWith не является функцией. Я обновлю свой пост с вашим решением.
3. @Jane, возможно, у вас опечатка, StartsWith не startWith .
4. К сожалению, это не проблема. Но спасибо, что заметили!
5. теперь сообщение должно быть правильно обновлено. Проблема @samehanwar все та же, когда я пытаюсь ввести ввод, появляется ошибка.