У меня есть компонент поиска. При нажатии клавиши ввода введите перенаправление на страницу результатов. Но я не могу получить отфильтрованные результаты поиска. Как я могу получить отфильтрованный json? Вот код, может кто поможет?
@NileshPatel нет, я хочу перенаправить, но я хочу получить отфильтрованные результаты на странице результатов
Поскольку между композициями нет родительско-дочерних отношений, вы фильтруете данные и затем перемещаетесь, вам нужно использовать контекст или редукцию, чтобы сохранить запрошенные вами идентификаторы игровых объектов, получить их на SearchResult
comp, а затем отфильтровать данные.
@kboul как я могу это сделать?
Вот демонстрация того, как работает Песочница. Конечно, вам потребуется рефакторинг кода.
Идея заключается в том, что вам нужно передать искомое слово в параметре запроса URL-адреса при нажатии клавиши:
history.push(`/SearchResult/?search=${search}`);
На этой странице вам нужно получить параметр из URL и с помощью useLocation
:
import { useLocation } from "react-router-dom";
И проанализируйте результаты с помощью URLSearchParams:
const search = new URLSearchParams(location.search).get("query");
Пожалуйста, ознакомьтесь с более подробной информацией в приведенном примере.
спасибо ваш ответ. Я не мог полностью понять, в route.js вы импортируете строку запроса. Но как я могу получить это?
Я больше не использую Routere.js. Если вы проверите код, вы увидите, что он нигде не используется в коде.
Сначала добавьте это к своим маршрутам. Потому что вы указали только SearchResult
маршрут, а не SearchResultPage
, несмотря на то, что они используют один и тот же комп.
{
path: `/SearchResultPage`,
component: SearchResult
}
Контекст настройки:
export const Context = createContext();
и провайдер:
const Provider = ({ children }) => {
const [gameIds, setGameIds] = useState([]);
const provider = useMemo(() => ({ gameIds, setGameIds }), [
gameIds,
setGameIds
]);
return (
<Context.Provider value = {{ ...provider }}>{children}</Context.Provider>
);
};
чтобы иметь возможность сохранять переменные глобально.
сохраните идентификаторы в массив в поиске:
const { setGameIds } = useContext(Context);
...
setGames(gameData);
setSearch(e.target.value);
setGameIds(gameData.map(({ id }) => id));
получить их на SearchResult
const { gameIds } = useContext(Context);
...
data.filter(({ id }) => gameIds.includes(id))
Большое спасибо! Ну а когда нет результата, можно показать другой div?
Да. Используйте тернарный оператор f.i gameIds.length === 0 ? 'show a message' : what you already doing
... или if, еще что вам больше подходит.
Можно еще вопрос по этому компоненту?
удалите обработчик нажатия клавиши, если вы не хотите перенаправлять на нажатие клавиши