【发布时间】:2019-08-10 15:24:57
【问题描述】:
我有一个按钮设置为:
- 对 GET 数据进行 API 调用,并从 数据;
- 返回这些标题;
- 用这些标题更新我的组件的“文本”状态
- 在 div 中显示这些标题
似乎所有这些事情都在发生;但也许不是为了?我可以看出 this.state.text 按预期更新了标题,但是 DOM 没有收到更新的状态。我以可以在样板 React 应用程序的“index.js”文件中运行的格式附加了代码。
我尝试过弄乱操作顺序,将 getAllPosts() 函数输出为数组,以及无数的数组操作。
import React from 'react';
import ReactDOM from 'react-dom';
class AllPosts extends React.Component {
constructor(props) {
super(props);
this.state = {text: 'poop'};
}
getAllPosts(){
var request = new XMLHttpRequest();
var titles=[];
request.open('GET', 'http://jsonplaceholder.typicode.com/posts', true)
request.onload = function () {
var data = JSON.parse(this.response);
if (request.status >= 200 && request.status < 400) {
data.forEach(post => {
titles.push(post.title);
})
} else {
console.log('error getting title list. Please try again.');
}
}
request.send();
console.log(titles);
return titles;
}
onClickButton = () => {
var allTitles = this.getAllPosts();
this.setState({text: allTitles});
console.log(this.state.text);
console.log(this.allTitles);
}
render() {
return (
<div>
<button
onClick={this.onClickButton}>
Get All Posts
</button>
<div>{this.state.text}</div>
</div>
);
}
}
function App() {
return (
<div className="App">
<header className="App-header">
<AllPosts />
</header>
</div>
);
}
export default App;
ReactDOM.render(<App />, document.getElementById('root'));
(打开控制台) 预期结果是 div 文本在点击时发生变化,从“便便”变为标题列表。发生的事情是数据“未定义”并且文本被空白。再次单击该按钮时,当我要求它记录 this.state.text 时,标题列表将填充到控制台中,因此它显然已进入状态。但是状态不会在页面上更新。
【问题讨论】:
-
this.setState({text: allTitles});运行时,状态尚未设置。使用回调或使用 async/await (Promises)。 -
您不使用
fetch而不是XMLHttpRequest有什么原因吗?我在这里回答了一个类似的问题 - stackoverflow.com/a/57442074/5862900
标签: javascript reactjs react-native jsx