#reactjs
#reactjs
Вопрос:
У меня есть файл JSON ниже. Внутри этого JSON есть массив (ответы). Я хочу нанести их на карту и визуализировать.
{
"qID": "177",
"myQuestion": true,
"qContent": "testing",
"answers": [{
"anonymous": true,
"aID": "184",
"aContent": "test",
"aDate": "Mon, 14 Sep 20 06:47:38 0000",
"myAnswer": false,
"authorName": "abc",
"aFeaturedImg": "../uploads/407378vk053.jpg",
"authorImg": "https://lh3.googleusercontent.com/a-/AOh14GjhhO-11Wktws9-FXBZoWk3vT8tRM2Sy7IQ4cnpw=s96-c"
},
{
"anonymous": true,
"aID": "184",
"aContent": "test",
"aDate": "Mon, 14 Sep 20 06:47:38 0000",
"myAnswer": false,
"authorName": "abc",
"aFeaturedImg": "../uploads/407378vk053.jpg",
"authorImg": "https://lh3.googleusercontent.com/a-/AOh14GjhhO-11Wktws9-FXBZoWk3Cv8tRM2Sy7IQ4cnpw=s96-c"
}
]
}
мой код реакции выглядит следующим образом. Я хочу использовать состояние
функциональный вопрос ({ совпадение }) {
useEffect(() => {
fetchItem();
}, []);
const requestOptions = {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ qID: match.params.id })
};
const [item, setItem] = useState([]);
const fetchItem = async () => {
const data = await fetch('https://example.com/api/getAnswer.php' , requestOptions);
const item = await data.json();
setItem(item);
};
return (
<Container maxWidth="sm">
{item.answers.map(answer => (
<Card key={answer.qID}>{answer.qContent}</Card>
))}
</Container>
);
}
экспортируйте вопрос по умолчанию; Но это не сработает. Это выдает следующую ошибку
TypeError: Cannot read property 'map' of undefined
Комментарии:
1. что вы получаете за
console.log(item.answers)
непосредственно перед рендерингом? и поступают ли эти данные json из ajax? тогда как выглядит вашеitem
состояние?
Ответ №1:
Если вы не уверены, что answers
ключ ваших данных будет рассматриваться в виде массива, вы можете сформировать javascript для рассмотрения его таким образом, передав его через Array.from
let data = {
"qID": "177",
"myQuestion": true,
"qContent": "testing",
"answers": [{
"anonymous": true,
"aID": "184",
"aContent": "test",
"aDate": "Mon, 14 Sep 20 06:47:38 0000",
"myAnswer": false,
"authorName": "abc",
"aFeaturedImg": "../uploads/407378vk053.jpg",
"authorImg": "https://lh3.googleusercontent.com/a-/AOh14GjhhO-11Wktws9-FXBZoWk3vT8tRM2Sy7IQ4cnpw=s96-c"
},
{
"anonymous": true,
"aID": "184",
"aContent": "test",
"aDate": "Mon, 14 Sep 20 06:47:38 0000",
"myAnswer": false,
"authorName": "abc",
"aFeaturedImg": "../uploads/407378vk053.jpg",
"authorImg": "https://lh3.googleusercontent.com/a-/AOh14GjhhO-11Wktws9-FXBZoWk3Cv8tRM2Sy7IQ4cnpw=s96-c"
}
]
}
class App extends React.Component {
render(){
let answers = Array.from(data.answers)
return (<div>
{answers.map(ans => {
return <p>{ans.aContent}</p>
})}
</div>)
}
}
ReactDOM.render(<App />, document.getElementById('root'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id="root"></div>
Поскольку item
состояние может быть пустым массивом до того, как вы получите данные из API, вы можете проверить его доступность перед выполнением map подобным образом
return (
<Container maxWidth="sm">
{item.answers amp;amp; item.answers.map(answer => (
<Card key={answer.qID}>{answer.qContent}</Card>
))}
</Container>
);
{item.answers amp;amp; item.answers.map(answer => (...))}
это похоже на проверку item.answers
выхода перед выполнением map
над массивом ответов
Комментарии:
1. Большое вам спасибо за быстрый ответ. Я хочу реализовать это с помощью state. Я изменил свой вопрос. вы можете мне помочь?
2. Вы хотите, чтобы ответ был сохранен в состоянии вашего компонента и отображал
answers
массив, который хранится в состоянии вашего компонента3. Привет. Я попробовал следующее. Но все равно выдает ошибку. [код]const fetchItem = async () => { const data = ожидание выборки(‘ sith.lk/api/getAnswer.php ‘ , RequestOptions); const item = await data.json(); setItem(элемент); const answers = Array.from(элемент.ответы); setAnswers(ответы); }; return ( <Максимальная ширина контейнера=»sm»> {ответы.карта(ответ => ( <Ключ карты={ответ.qID}>{ответ. qContent}</Card> ))} </Container> );
4. Данные, которые вы предоставляете в вопросе, — это способ получения ответа от вызова API
Ответ №2:
вам нужно проверить, содержит ли «элемент» допустимое значение
{item amp;amp; item.answers.map(answer => (
<Card key={answer.aID}>{answer.aContent}</Card>
))}
Комментарии:
1. Привет. Спасибо за ваш ответ. Но это не работает.
2. попробуйте подключить элемент в useEffect useEffect(() => { fetchItem(); }, [элемент]);
3. вы также пытались consol.log (item) внутри fetchItem? чтобы убедиться, что у вас есть правильные данные
Ответ №3:
Вам нужно разобрать ваш JSON в объект javascript, попробуйте сделать это
let parsed_object = JSON.parse(item);
И затем вы можете использовать map
на parsed_object
.