#json #reactjs #axios
#json #reactjs #аксиос
Вопрос:
Я не понимаю, как использовать данные JSON в React. Мой код:
function App() {
const [image, setImage] = useState();
const getImage = () => {
axios.get('http://localhost:5000/api')
.then(function (res) {
setImage(res.data);
})
}
useEffect(()=>{
getImage()
}, [])`
Ответная реакция:
{
"title": "this is a title",
"description": "",
"tags": "",
"isSorted": false,
"passed": false
}
Сообщение об ошибке:
Ошибка: объекты недопустимы как дочерние объекты React (найдено: объект с ключами {заголовок, описание, теги, сортировка, передача}). Если вы хотели отобразить коллекцию дочерних элементов, вместо этого используйте массив.
Комментарии:
1. добавьте console.log(res) в свой . затем выполните обратный вызов функции и опубликуйте ее здесь. Скорее всего, вы пытаетесь присвоить своему изображению объект вместо строки.
2. вероятно, у вас есть проблема в вашей логике рендеринга… Вы пытаетесь напрямую отображать данные JSON
3. Я понимаю, что я передаю объект. Что я должен делать с этим объектом json?
4. Я передаю его государству с помощью setImage(). Не разрешена ли передача объекта в состояние?
5. Там нет JSON.
res
Переданноеthen
функции выключениеaxios
вызова является объектом. JSON — это текстовый формат. Вот почему вы получаете сообщение об ошибке о том, что объекты не являются допустимыми дочерними элементами React, а не об ошибке о том, что текст не является допустимым дочерним элементом React.
Ответ №1:
// Get a hook function
const {useState, useEffect} = React;
const App = () => {
const [images, setImages] = useState(0);
useEffect(() => {
setTimeout(() => {
setImages({title: 'Foo', description: 'Bar...'});
}, 1000);
}, []);
return images ? <p>{images.title}</p> : <p>Loading images...</p>;
};
// Render it
ReactDOM.render(
<App />,
document.getElementById("react")
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.4/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.4/umd/react-dom.production.min.js"></script>
<div id="react"></div>
Я думаю, проблема в том, что вы пытаетесь отобразить объект вместо того, чтобы отображать каждое из полей. Поскольку я не вижу вашей полной App
реализации компонента, я дам вам лучший ответ, который я могу.
function Image(props) {
return (
<>
<h1>{props.title}</h1>
<p>{props.descriptio</p>
</>
);
}
function App() {
const [image, setImage] = useState();
const getImage = () => {
axios.get('http://localhost:5000/api')
.then(function (res) {
setImage(res.data);
})
}
useEffect(()=>{
getImage()
}, [])
// This is assuming how your App component SHOULD look
return (<Image image={image} />);
}
Вероятно, вы получаете эту ошибку, потому что вы не можете отобразить весь объект целиком, но вместо этого вам нужно отобразить каждое поле.
Однако ваша логика выборки выглядит правильной!
Комментарии:
1. Я должен был включить это, извините.
return ( <div className="App"> <header className="App-header"> <p>{image}</p> </header> </div>
2. Если я попробую что-то вроде {image.title), он скажет мне, что заголовок не определен.
3. Это связано с тем, что во время первоначального рендеринга ваши данные еще недоступны, вы извлекаете данные асинхронно из-за useEffect() .
4. Что вам нужно сделать, это добавить IF, чтобы увидеть, доступны ли данные. Дайте мне секунду, я создаю для вас рабочий пример, который вы сможете реализовать 🙂
5. Итак, что мне делать? Я просто хочу получить значения объекта в элементе <p> .