#javascript #reactjs #use-effect #use-state
Вопрос:
Я новичок в том, чтобы реагировать. Я пытаюсь обновить родительское состояние из дочернего, но у меня ошибка в другом компоненте на том же уровне, что и у дочернего.
это мой кодекс.
RedirectPage.js (родитель)
const RedirectPage = (props) =gt; { const [status, setStatus] = useState("Loading"); const [weather, setWeather] = useState(null); const [location, setLocation] = useState(null) const [showLoader, setShowLoader] = useState(true) const [userId, setUserId] = useState(false) const [isPlaylistCreated, setIsPlaylistCreated] = useState(false) const headers = getParamValues(props.location.hash) const getWeather = () =gt;{ //fetch data.. //... //... .then(response =gt; { var res = response.json(); return res; }) .then(result =gt; { setWeather(result) setShowLoader(false) setStatus(null) setLocation(result.name) }); }) } const changeStateFromChild = (value) =gt; { setIsPlaylistCreated(value) } useEffect(() =gt; { getWeather() },[]); return ( lt;div className="containerRedirectPage"gt; {showLoader ? ( lt;div className="wrapperLogo"gt; lt;img src={loader}className="" alt="logo" /gt; lt;/divgt;) : ( lt;div className="wrapperColonne"gt; lt;div className="firstRow"gt; lt;WeatherCard weatherConditions={weather}/gt; lt;/divgt; {isPlaylistCreated ? ( lt;div className="secondRow"gt; lt;PlaylistCard /gt; lt;/divgt; ) : ( lt;PlaylistButton userId={userId} headers={headers} weatherInfo={weather} playlistCreated={changeStateFromChild} /gt; )} lt;/divgt; )} lt;/divgt; ) }; export default RedirectPage;
PlaylistButton.js:
export default function PlaylistButton({userId, headers, weatherInfo, playlistCreated}) { const buttonClicked = async () =gt; { // ...some code... playlistCreated(true) } return ( lt;div className="button-container-1"gt; lt;span className="mas"gt;CREA PLAYLISTlt;/spangt; lt;button onClick={buttonClicked} id='work' type="button" name="Hover"gt;CREA PLAYLISTlt;/buttongt; lt;/divgt; ) }
и это еще один компонент, из-за которого я получаю ошибку, когда нажимаю на кнопку.
WeatherCard.js:
const WeatherCard = ({weatherConditions}) =gt; { const [weather, setWeather] = useState(null); const [icon, setIcon] = useState(null); const getTheIcon = () =gt; { // code to get the right icon } setIcon(x) } useEffect(() =gt; { getTheIcon() },[]); return ( lt;div className="weatherCard"gt; lt;div className="headerCard"gt; lt;h2gt;{weatherConditions.name}lt;/h2gt; lt;h3gt;{Math.floor(weatherConditions.main.temp)}°Clt;/h3gt; lt;/divgt; lt;div className="bodyCard"gt; lt;h5gt;{weatherConditions.weather[0].description}lt;/h5gt; lt;img className="weatherIcon" src={icon} alt="aa" /gt; lt;/divgt; lt;/divgt; ) }; export default WeatherCard;
в первый раз, когда я загружаю страницу перенаправления, компонент WeatherCard работает правильно. Когда я нажимаю кнопку, я получаю эту ошибку: ошибка
Может кто-нибудь объяснить мне, почему ?
Ответ №1:
Каков эффект от настройки playlistCreated(true)
? Влияет ли это на объект погодных условий ? Если в какой-то момент погодные условия могут быть неопределенными, вам необходимо проверить их, прежде чем использовать их свойства (имя, main.temp и погода).
Обновление: В ошибке четко указано, что она не может прочитать имя из weather, потому что оно не определено. Вы должны проверить это перед использованием свойств объекта погоды.
if (!weatherConditions) { return lt;divgt;Loading...lt;/divgt; // or something appropriate. } return ( lt;div className="weatherCard"gt; lt;div className="headerCard"gt; lt;h2gt;{weatherConditions.name}lt;/h2gt; {weatherConditions.main amp;amp; lt;h3gt;{Math.floor(weatherConditions.main.temp)}°Clt;/h3gt;} lt;/divgt; lt;div className="bodyCard"gt; {weatherConditions.weather amp;amp; {weatherConditions.weather.length gt; 0 amp;amp; lt;h5gt;{weatherConditions.weather[0].description}lt;/h5gt;} .... )
Комментарии:
1. нет, playlistCreated(true) не влияет на объект погодных условий…
2. да @AntonioPantano, но при первой загрузке страницы все правильно, карта погоды загружается правильно. Ошибка возникает после нажатия кнопки, и ничего не изменилось с переменной погодой, переданной на карту погоды. Я не могу понять
3. @Filippo, Чтобы помочь вам в этом, вы должны предоставить больше кода. Трудно понять, что там происходит. Поскольку вы получаете погодные условия асинхронно, я не вижу, как при первом рендеринге данные не являются неопределенными.