Итак, проблема в вашем коде была простой, initialState не был заполнен в reducer, потому что displayid изначально был undefined, а затем был установлен на ditto
Причина такого поведения заключается в том, что в Veritcal
компонент, вы setDisplayId
, и этот эффект запускается при начальной визуализации, и к тому времени undefined displayId уже используется компонентом Horizontal
Теперь с вашим кодом были и другие проблемы. Вы обновляли sessionStorage с помощью response.data.payload
, но не было ключа payload
в response.data
Также Movement
компонент отображается на state.data
, но это объект. Вместо этого вам нужно сопоставить state.data.abilities
Измененные фрагменты кода ниже
Движение. js
const Movement = ({ states }) => {
console.log(states);
return (
<div>
{states.data &&
states.data.abilities.map(ability => <div>{ability.ability.name}</div>)}
</div>
);
};
export default Movement;
По горизонтали. js
console.log(displayid);
const initialState = {
// data: displayid? JSON.parse(sessionStorage.getItem(displayid)): [],
// isFetching: displayid && sessionStorage.getItem(displayid) ? true : false,
// hasError: false
};
const [states, dispatch] = useReducer(reducer, initialState);
// console.log(states);
useEffect(() => {
if (displayid && !sessionStorage.getItem(displayid)) {
console.log(displayid);
axios
.get(`https://pokeapi.co/api/v2/pokemon/${displayid}/`)
.then(response => {
console.log(response);
console.log(response.data);
dispatch({
type: "First",
payload: response.data
});
console.log(response.data);
sessionStorage.setItem(displayid, JSON.stringify(response.data));
})
.catch(error => {
console.log(error);
dispatch({
type: "Second"
});
});
} else if (displayid && sessionStorage.getItem(displayid)) {
// populate data from localStorage
const localData = {
data: JSON.parse(sessionStorage.getItem(displayid)) || [],
isFetching: sessionStorage.getItem(displayid) ? true : false,
hasError: false
};
dispatch({ type: "POPULATE", payload: localData });
}
}, [displayid]);
Рабочая демонстрация