Как сделать запрос API автоматически в React?

Я пытаюсь создать настраиваемую домашнюю страницу для своего браузера. Я реализовал API для отображения погоды, но работает только при нажатии клавиши ввода. Я хочу отображать данные автоматически при загрузке страницы, не нажимая клавишу ввода, автоматически показывая погоду в Бристоле, и когда я ввожу другое местоположение, API сможет запрашивать и отображать. Я пробовал много способов, таких как (удаление крючка, изменение начального состояния крючка, но ничего не работает). Это мой код:

    const [query, setQuery] = useState('Bristol');
    const [weather, setWeather] = useState({});

const search = async () => {
    fetch(`${api.base}weather?q=${query}&units=metric&APPID=${api.key}`)
    .then(res => res.json())
    .then(result => {
        setWeather(result);
        setQuery('')
        console.info(result)
    });
}
    return(
        <div className = "app">
            <main>
                <div className = "search-box">
                    <input
                        type = "text"
                        className = "search-bar"
                        placeholder = "Search..."
                        onChange = {e => setQuery(e.target.value)}
                        value = {query}
                        onKeyPress = {search}
                    />
                </div>
                {(typeof weather.main != "undefined") ? (
                    <div>
                    <div className = "location-box">
                        <div className = "location">{weather.name}</div>
                        <div className = "date">{dateBuilder(new Date())}</div>
                    </div>
                        <div className = "weather-box">
                            <div className = "temp">
                                {Math.round(weather.main.temp)}
                            </div>
                            <div className = "weather">
                                {weather.weather[0].main}
                            </div>
                        </div>
                    </div>
                ) : ('')}
            </main>
        </div>
    )
} 

Я новичок в ReactJS, и это немного сбивает с толку, потому что здесь я использую один и тот же файл для кода и для рендеринга, я делал это раньше, но я использовал простой JavaScript с экспрессом и т. д. и я визуализировал в HTML.

вам может понадобиться пересмотреть хуки ReactJS reactjs.org/docs/hooks-overview.html.

Md. Abu Sayed 23.12.2020 14:11

Отвечает ли это на ваш вопрос? Как вызвать функцию загрузки с React useEffect только один раз

Nisharg Shah 23.12.2020 14:13

@NishargShah Почти готово, загружается, но автоматически очищается менее чем за 1 секунду.

Gabriel Savian 23.12.2020 14:18
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
3
711
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий
useEffect( () => search(), [])  

Я предполагаю, что подход в моем ответе более идиоматичен, поскольку он автоматически повторно выполнит поиск при изменении запроса. Также он устраняет императивный обработчик событий onKeyPress = {search}

ingmak 23.12.2020 14:23

вы можете использовать useEffect и передать поисковый запрос в таблицу зависимостей, поэтому каждый раз, когда переменная изменяется, она будет выполнять re_render с новым результатом.

T.arar 24.12.2020 12:51

Попробуйте обернуть вызов fetch в useEffect:

  useEffect(() => {
    fetch(`${api.base}weather?q=${query}&units=metric&APPID=${api.key}`)
      .then((res) => res.json())
      .then((result) => {
        setWeather(result);
        console.info(result);
      });
  }, [query]);

Второй аргумент — это так называемый массив зависимостей. Всякий раз, когда его содержимое изменяется, эффект будет запускаться повторно, см. https://reactjs.org/docs/hooks-effect.html.

Также удалите onKeyPress = {search}, так как он избыточен с onChange = {e => setQuery(e.target.value)}.

Дополнительные ресурсы:

Другие вопросы по теме