У вас возникли проблемы, потому что вы пытались установить состояние на основе данных, которые были в замыкании . props.gamesProp
в пределах useEffect, который вы имели, никогда не будет обновляться, даже если родительские данные изменились.
Причина, по которой props.gamesProp
был нулевым в эффекте, заключается в том, что при каждом рендеринге ваш компонент по существу имеет новый экземпляр props, поэтому, когда запускается useEffect, версия props, которую видит внутренняя часть useEffect, соответствует тому, что существовало при этом рендере.
Любая функция внутри компонента, включая обработчики событий и эффекты, «видит ”Реквизит и состояние от рендера, в котором он был создан.
https://reactjs.org/docs/hooks-faq.html#why -am-i-vision-stale-props-or-state-inside-my-function
Если вам не нужно изменять gamesState внутри вашего компонента, я настоятельно рекомендую вам не дублировать реквизит в состояние.
Я бы также рекомендовал использовать useDispatch
и useSelector
вместо подключения для функциональных компонентов.
Вот некоторые модификации вашего компонента, основанные на том, что я вижу в нем в настоящее время, и что я ' мы только что описали:
import { useDispatch, useSelector } from 'react-redux';
const Games = (props) => {
const gamesData = useSelector((state) => state.gamesReducer.games);
const dispatch = useDispatch();
const [gameData, setGameData] = useState(null);
const [gameDate, setGameDate] = useState(new Date(2020, 2, 10));
const classes = GamesStyles();
// infinite render if placed in
// useEffect array
useEffect(() => {
const date = parseDate(gameDate);
try {
dispatch(actions.getGames(`${date}`));
} catch (error) {
console.log(error);
}
}, [gameDate, dispatch]);
// data has not been loaded yet
if (gamesData == null) {
return (
<div>
<Spinner />
</div>
);
} else {
console.log(gamesData);
return (
<div>
<p>Data has been loaded</p>
</div>
// this is where i would change gameDate
);
}
};
export default Games;
Если вам нужно получить свое состояние из реквизита, вот что говорит React Documentation на крючках:
https://reactjs.org/docs/hooks-faq.html#how -do- я орудие-getderivedstatefromprops