Как я могу отправить запрос в API одним нажатием моей кнопки в React hooks?

#reactjs

#reactjs

Вопрос:

Итак, в настоящее время у меня есть этот код с useEffect(), который каждый раз отображает данные из API. Я обновляю, но я пытаюсь отобразить эти данные только при нажатии на мою кнопку. Я не слишком уверен, куда идти с моим кодом.

       import React, { useState, useEffect } from 'react';
      import './App.css';
      import axios from 'axios';

      function App() {
        const [image, setImage] = useState(false);
   
      // I tried to put a onclick function, but not sure what to add here
        const handleChange = ()
      => {
      setImage(true)
      }
      

      // this code displays my data on refresh
      useEffect(() => {
        axios
          .get(
            'https://api.com'
          )
          .then(res => {
             setImage ?
            setImage(res.data.faces[0].urls[4][512]) : console.log('nothing')
          })
          .catch(err => {
            console.log(err.message);
          });
      }, []);

        return (
          <div className='App'>
            <h1>Photo Generator</h1>
            <img src={image} />
            <button onClick={handleChange}>Show new Image</button>
          </div>
        );
      }
  

Ответ №1:

Я обновил ваш код. Попробуйте этот код, дайте мне знать, если он работает для вас. 🙂

 import React, { useState } from "react";
import "./App.css";
import axios from "axios";

function App() {
  const [image, setImage] = useState(false);

  // I tried to put a onclick function, but not sure what to add here
  const handleChange = () => {
    axios
      .get("https://api.com")
      .then(res => {
        const uri = res.data.faces[0].urls[4][512];
        if (uri) {
          setImage(uri);
        } else {
          console.log("nothing");
        }
      })
      .catch(err => {
        console.log(err.message);
      });
  };

  return (
    <div className="App">
      <h1>Photo Generator</h1>
      {image amp;amp; <img src={image} alt="yourImage" />}
      <button type="button" onClick={handleChange}>
        Show new Image
      </button>
    </div>
  );
}
  

В этом случае вам не нужно использовать useEffect Hook.
также не нужно проверять setImage внутри функции обратного вызова API.

Комментарии:

1. похоже, это работает. Вы знаете, как я могу добавить дополнительные данные из API для отображения на моем экране? например, этот код показывает пол res.data.faces[0].meta.gender[0] так как же мне показать это под моим изображением?

Ответ №2:

Вы могли бы сделать это следующим образом

 import React, {useState, useEffect} from 'react';
import './App.css';
import axios from 'axios';

function App() {
  const [image, setImage] = useState('');
  const [displayImage, setDisplayImage] = useState('none');

  const handleChange = () => {
    setDisplayImage('flex');
  };

  useEffect(() => {
    axios
      .get('https://api.com')
      .then((res) => {
        setImage
          ? setImage(res.data.faces[0].urls[4][512])
          : console.log('nothing');
      })
      .catch((err) => {
        console.log(err.message);
      });
  }, []);

  return (
    <div className="App">
      <h1>Photo Generator</h1>
      <div style={{display: displayImage}}>
        <img style src={image} />
      </div>

      <button onClick={() => handleChange()}>Show new Image</button>
    </div>
  );
}


  

Вы также могли бы сделать

 <button onClick={() => setDisplayImage('flex')}>Show new Image</button>
  

Комментарии:

1. почему вы удалили крючок useEffect?

2. Я скорректировал ответ. Сейчас все должно быть хорошо. @дизайнxd10

3. вы только что в точности скопировали мой код? нет ничего, что могло бы решить мою проблему?

4. Я пытаюсь получить изображение, чтобы оно говорило «true». ошибка для не булевского атрибута src. Итак, как бы мне обновить состояние для не логического (изображения)? Я попытался передать res.data.faces[0].urls[4][512], но он говорит, что данные не определены, которые будут поступать из моего API, но я могу только добавить это в свой useEffect hook

5. @designxd10 мой плохой, я неправильно понял это. Проверьте это сейчас. Теперь он вызовет API при нажатии кнопки, а затем установит состояние, подобное вашему, в вашем эффекте использования.