Если вы не хотите выполнять выборку данных с помощью вашего компонента QuestionSearchContainer, вы можете сделать компонент более высокого порядка, чтобы обернуть его тем, что делает выборку ваших данных за вас.
Вы можете легко изменить это HO C, чтобы возвращать обернутый компонент только после завершения загрузки данных. В этой части загрузки предполагается, что fetchData является создателем действия redux thunk . useParams - это хук, экспортированный из реакции-маршрутизатора-dom, который дает вам доступ к параметрам соответствия. useDispatch - это хук, экспортированный из response-redux, который дает вам доступ к функции отправки вашего магазина.
import { useParams } from 'react-router-dom';
import { useDispatch } from 'react-redux';
import { useEffect, useState } from 'react';
const withFetchData = (Component) => ({ children, ...props }) => {
const { query } = useParams();
const [loading, setLoading] = useState(true);
const dispatch = useDispatch();
useEffect(() => {
// Assuming fetchData is a a redux thunk action creator
setLoading(true);
dispatch(fetchData(query)).then(() => {
setLoading(false);
});
}, [query]);
if(loading){
return 'loading...'
}
return <Component {...props} />;
};
const QuestionSearchContainerWithFetchData = withFetchData(
QuestionSearchContainer
);
const Parent = () => {
return (
<Route
path="/search/:query"
component={QuestionSearchContainerWithFetchData}
/>
);
};
Другой вариант - создать специальный маршрут, который будет выполнять то, что вы хотите. Например, эта функция OnChangeRoute будет вызывать обратный вызов onChangeParams
с текущими параметрами каждый раз, когда параметры изменяются. В этом есть загрузочная опора, которую вы должны передать, так как самому компоненту плевать на то, что вы делаете с параметрами.
import { useEffect, useRef } from "react";
function InnerOnChangeRoute({ loading, onParamsChange, Component, ...rest }) {
const onChangeRef = useRef(onParamsChange);
useEffect(()=>{
onChangeRef.current=onParamsChange;
},[onParamsChange])
useEffect(() => {
onChangeRef.current(rest.match.params);
}, [rest.match.params]);
if(loading){
return 'loading....'
}
return <Component {...rest} />;
}
// A wrapper for <Route> that redirects to the login
// screen if you're not yet authenticated.
function OnChangeRoute({ Component, onParamsChange, loading, ...rest }) {
return (
<Route
{...rest}
render={(data) => (
<InnerOnChangeRoute
Component={Component}
onParamsChange={onParamsChange}
loading={loading}
{...data}
/>
)}
/>
);
}
В общем, для приставки вы должны использовать диспетчеризацию (или mapDispatchToProps в соединителе HO C), чтобы запустить действие, обновляющее хранилище с вашими данными.
Вот несколько ссылок, которые, как мы надеемся, помогут вам получить контроль над избыточностью.
https://redux.js.org/advanced/async-actions
https://redux-toolkit.js.org/usage/usage-guide#asynchronous -логий c -и выборки данных
https://github.com/reduxjs/redux-thunk