我console.log(notes)
时具有json格式:
{
"document_tone": {
"tone_categories": [
{
"tones": [
{
"score": 0.027962,
"tone_id": "anger",
"tone_name": "Colère"
},
{
"score": 0.114214,
"tone_id": "sadness",
"tone_name": "Tristesse"
}
],
"category_id": "emotion_tone",
"category_name": "Ton émotionnel"
},
{
"tones": [
{
"score": 0.028517,
"tone_id": "analytical",
"tone_name": "Analytique"
},
{
"score": 0,
"tone_id": "tentative",
"tone_name": "Hésitant"
}
],
"category_id": "language_tone",
"category_name": "Ton de langage"
},
{
"tones": [
{
"score": 0.289319,
"tone_id": "openness_big5",
"tone_name": "Ouverture"
},
{
"score": 0.410613,
"tone_id": "conscientiousness_big5",
"tone_name": "Tempérament consciencieux"
},
{
"score": 0.956493,
"tone_id": "emotional_range_big5",
"tone_name": "Portée émotionnelle"
}
],
"category_id": "social_tone",
"category_name": "Ton social"
}
]
},
"idMedia": 25840
}
这是console.log(notes)的图片,我不知道为什么除了预期的结果之外,我还会得到一个空数组
但是当我尝试映射tone_categories
时,出现此错误:
TypeError: Cannot read property 'map' of undefined
这是我到目前为止构建的代码:
import React, { Component } from 'react';
import logo from './logo.svg';
import './App.css';
class App extends Component {
constructor(props) {
super(props);
this.state = {
notes: [],
};
}
componentWillMount() {
fetch('http://localhost:3000/api/users/analyzeMP3?access_token=GVsKNHWnGWmSZmYQhUD03FhTJ5v80BjnP1RUklbR3pbwEnIZyaq9LmZaF2moFbI6', {
method: 'post',
headers: new Headers({
'Authorization': 'Bearer',
'Content-Type': 'application/x-www-form-urlencoded'
}),
})
.then(response => response.text())
.then(JSON.parse)
.then(notes => this.setState({ notes }));
}
render() {
const { notes } = this.state;
console.log('notes',notes)
return (
<div className="App">
{notes !== undefined && notes !== "" && notes !== [] ? notes.document_tone.map((tone_categories, idx) => {
{console.log('notes',notes.document_tone[tone_categories].category_name)}
}) : null}
<header className="App-header">
<img src={logo} className="App-logo" alt="logo" />
<p>
Edit <code>src/App.js</code> and save to reload.
</p>
<a
className="App-link"
href="https://reactjs.org"
target="_blank"
rel="noopener noreferrer"
>
Learn React
</a>
</header>
</div>
);
}
}
export default App;
答案 0 :(得分:2)
您的初始状态为notes: []
,因此在第一次渲染期间该数组将为空,如果您尝试从一个空数组访问某个项目,则会收到错误消息。
在这种情况下,更好的方法是具有加载状态并推迟渲染,直到获取数据:
class App extends Component {
constructor(props) {
super(props);
this.state = {
notes: [],
loading: true // Set the loading to true initially
};
}
componentDidMount() {
fetch(
"http://localhost:3000/api/users/analyzeMP3?access_token=GVsKNHWnGWmSZmYQhUD03FhTJ5v80BjnP1RUklbR3pbwEnIZyaq9LmZaF2moFbI6",
{
method: "post",
headers: new Headers({
Authorization: "Bearer",
"Content-Type": "application/x-www-form-urlencoded"
})
}
)
.then(response => response.text())
.then(JSON.parse)
.then(notes => this.setState({ notes, loading: false })); // reset the loading when data is ready
}
render() {
const { notes, loading } = this.state;
console.log("notes", notes);
return loading ? (
<p>Loading...</p> // Render the loader if data isn't ready yet
) : (
<div className="App">//...</div>
);
}
}
答案 1 :(得分:1)
问题在于此条件notes !== []
始终返回true。如果需要检查数组是否为空,可以使用array.length === 0
。还应使用componentDidMount而不是componentWillMount,因为不赞成componentWillMount。
您可以做类似的事情
return (
<div className="App">
{
notes && notes.length > 0 ?
notes.document_tone.map((tone_categories, idx) => {
return notes.document_tone[tone_categories].category_name;
}) : null
}
</div>
);
答案 2 :(得分:0)
这是因为最初notes
为空数组且没有document_tone
键。因此,此行将引发错误notes.document_tone.map
添加条件并检查notes
是否具有document_tone
。
<div className="App">
{
notes !== undefined && notes !== "" && notes !== [] && notes.document_tone.length >0 ?
notes.document_tone.map((tone_categories, idx) => {
{console.log('notes',notes.document_tone[tone_categories].category_name)}
}) :
null}
答案 3 :(得分:0)
启动应用程序后,构造函数将运行,并使用notes = []设置状态,然后将出现render()并将其打印在控制台中。
然后,在willComponentMount()之后,notes具有一个新值并触发一个新的render()。