#reactjs #react-redux #parent-child #rerender
Вопрос:
У меня есть родительский компонент, который использует dispatch для обновления хранилища в redux, чем я беру данные хранилища с помощью UseSelector и передаю их дочернему компоненту.
в дочернем компоненте при первом отображении данные не определены, а при втором отображении данные исправлены, но дочерний компонент не выполняет повторную визуализацию и не отображает данные.
попробовал несколько решений из других сообщений StackOverflow и из Google и не могу понять
заранее спасибо.
это родители:
function FullWeather() {
const dispatch = useDispatch()
const sevenDaysForecast = useSelector(state => state.sevenDaysForecast);
const {weather, loading, error} = sevenDaysForecast;
useEffect(() => {
dispatch(weekForecast());
}, [dispatch]);
return (
<div style={{borderRadius: '25px', backgroundImage: 'url(' mountainsBackground ')', backgroundSize: 'cover'}}>
<CurrentWeather/>
<SevenDaysWeather data={weather} />
</div>
)
};
компонент «мой ребенок»:
const SevenDaysWeather = ({data}) => {
console.log(data); //=> log correct data on second render
return (
<div className="weather-table">
<h5 className="sevenDays-Heading">
Next 7 Days...
</h5>
<div className="d-flex justify-content-between sevenDays-Row">
{data?.map( (dayWeather, index) => (
<div className="eachDay-div" key={index}>
<p className="sevenDays-p sevenDays-day" >{dayWeather.day}</p>
<img className="sevenDays-img" src={dayWeather.icon} alt=''/>
<p className="sevenDays-p sevenDays-temp" >{dayWeather.temp}°</p>
</div>
))}
</div>
</div>
);
};
мой редуктор:
export const sevenDayWeatherReducer = (state={}, action) => {
switch (action.type) {
case SEVEN_DAYS_WEATHER_REQUEST:
return {loading: true};
case SEVEN_DAYS_WEATHER_SUCCESS:
return {loading: false, weather: action.payload};
case SEVEN_DAYS_WEATHER_FAIL:
return {loading: false, error: action.payload};
default:
return state;
}
};
my action:
export const weekForecast = () => async (dispatch) => {
try {
dispatch({ type: SEVEN_DAYS_WEATHER_REQUEST });
const weekDays =['SUN', 'MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT'];
let sevenDayWeatherData = [];
geolocation.getCurrentPosition(async (err, position) => {
await axios.post('/weather', {lon: position.coords.longitude, lat: position.coords.latitude, type: SEVEN_DAYS_WEATHER})
.then(response => {
const sevenDaysWeather = response.data.daily;
for(var i = 1; i < sevenDaysWeather.length; i )
{
const date = new Date(sevenDaysWeather[i].dt * 1000)
const forecast = {
day: weekDays[date.getDay()],
temp: beautifulTemp(sevenDaysWeather[i].temp.day),
icon: "http://openweathermap.org/img/wn/" sevenDaysWeather[i].weather[0].icon "@2x.png"
}
sevenDayWeatherData.push(forecast)
}
})
.catch(e => console.log(e))
});
dispatch({ type: SEVEN_DAYS_WEATHER_SUCCESS, payload: sevenDayWeatherData });
} catch (err) {
}
};