#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 при нажатии кнопки, а затем установит состояние, подобное вашему, в вашем эффекте использования.