ajax 请求更改状态后,反应组件不会重新加载
react component does not reload after ajax request changes state
如果有人提出并回答了这个问题,我深表歉意,但我已经搜索过但找不到答案。这是我第一次提出 Ajax 请求,所以我确定我做错了一些事情,我们将不胜感激任何帮助或最佳实践建议。
问题是我的 React 页面加载时所有组件都是空的。来自文档:
Calling setState() in this method (componentDidMount) will trigger an extra rendering
虽然在我展示的示例中,我正在调用一个调用 componentDidMount 的函数,但我期望具有相同的功能。而且,以防万一我通过将所有逻辑放入 componentDidMount 来测试它,并且我得到完全相同的行为。所以,我希望有一个暂时空白的屏幕,或者暂时显示硬编码状态,然后在通过 ajax 接收到状态时重新渲染。但是,它永远不会重新呈现。如果我通过按下按钮添加或删除项目来手动触发页面上的状态更改,我会立即看到来自 ajax 请求的所有数据。
状态硬编码时一切正常。
从 React Docs 和此处,我看到大多数人将 ajax 请求放在 componentDidMount 中,所以这就是我开始的地方。如果可以的话,我试图将所有请求保存在一个单独的文件中,但即使我删除了 loadEntries 函数和 getEntries 函数,并将所有处理放入 componentDidMount 中,我也会遇到同样的问题。如果它很重要,我们只是在谈论导入 20 个左右的对象,这些对象类似于那些硬编码到状态中的对象。
感谢您的帮助。如果我做了什么蠢事,请告诉我!
// My higher Order Component
import React, {Component} from 'react';
import Today from '../pages/Today';
export default class TodayContainer extends Component {
constructor(props) {
super(props);
this.loadEntries = this.loadEntries.bind(this);
this.state = {goalItems: [{entry_type: 1, date: "2017-12-20", id: 3, content: "other good stuff", completed: 1}],
targetItems: [{entry_type: 2, date: "2017-12-20", id: 3, content: "Fix my hat", completed: 1}],
successItems: [{entry_type: 3, date: "2017-12-20", id: 3, content: "Petted Cat"}],
quoteItem: {entry_type: 4, date: "2017-12-20", id: 1, content: "This is a quote.", author: "me"}};
}
componentDidMount() {
this.loadEntries();
}
loadEntries() {
let goalArray = [];
let targetArray = [];
let successArray = [];
let quote = {};
let scheduleArray = [];
Network.getEntries().then((entries) => {
for (let entry of entries.data) {
switch (entry.entry_type_id) {
case 1:
goalArray.push(entry);
break;
case 2:
targetArray.push(entry);
break;
case 3:
successArray.push(entry);
break;
case 4:
quote = entry;
break;
case 5:
scheduleArray.push(entry);
}
}
});
let stateInit = {
goalItems: goalArray,
targetItems: targetArray,
successItems: successArray,
quoteItem: quote,
scheduleItems: scheduleArray
};
this.setState(stateInit);
}
//My Network File.
import axios from 'axios';
export function getEntries(){
return axios.get('http://localhost:8000/api/entry');
}
我认为您只是想将 let stateInit... this.setState 代码移动到请求的 then 块中,以便它在请求完成后执行。
您的 setState 调用正在 Network.getEntries 的 Promise 解决之前执行。所以你必须在 then
中调用它
loadEntries() {
let goalArray = [];
let targetArray = [];
let successArray = [];
let quote = {};
let scheduleArray = [];
Network.getEntries().then((entries) => {
for (let entry of entries.data) {
switch (entry.entry_type_id) {
case 1:
goalArray.push(entry);
break;
case 2:
targetArray.push(entry);
break;
case 3:
successArray.push(entry);
break;
case 4:
quote = entry;
break;
case 5:
scheduleArray.push(entry);
}
}
let stateInit = {
goalItems: goalArray,
targetItems: targetArray,
successItems: successArray,
quoteItem: quote,
scheduleItems: scheduleArray
};
this.setState(stateInit);
});
}
如果有人提出并回答了这个问题,我深表歉意,但我已经搜索过但找不到答案。这是我第一次提出 Ajax 请求,所以我确定我做错了一些事情,我们将不胜感激任何帮助或最佳实践建议。
问题是我的 React 页面加载时所有组件都是空的。来自文档:
Calling setState() in this method (componentDidMount) will trigger an extra rendering
虽然在我展示的示例中,我正在调用一个调用 componentDidMount 的函数,但我期望具有相同的功能。而且,以防万一我通过将所有逻辑放入 componentDidMount 来测试它,并且我得到完全相同的行为。所以,我希望有一个暂时空白的屏幕,或者暂时显示硬编码状态,然后在通过 ajax 接收到状态时重新渲染。但是,它永远不会重新呈现。如果我通过按下按钮添加或删除项目来手动触发页面上的状态更改,我会立即看到来自 ajax 请求的所有数据。
状态硬编码时一切正常。
从 React Docs 和此处,我看到大多数人将 ajax 请求放在 componentDidMount 中,所以这就是我开始的地方。如果可以的话,我试图将所有请求保存在一个单独的文件中,但即使我删除了 loadEntries 函数和 getEntries 函数,并将所有处理放入 componentDidMount 中,我也会遇到同样的问题。如果它很重要,我们只是在谈论导入 20 个左右的对象,这些对象类似于那些硬编码到状态中的对象。
感谢您的帮助。如果我做了什么蠢事,请告诉我!
// My higher Order Component
import React, {Component} from 'react';
import Today from '../pages/Today';
export default class TodayContainer extends Component {
constructor(props) {
super(props);
this.loadEntries = this.loadEntries.bind(this);
this.state = {goalItems: [{entry_type: 1, date: "2017-12-20", id: 3, content: "other good stuff", completed: 1}],
targetItems: [{entry_type: 2, date: "2017-12-20", id: 3, content: "Fix my hat", completed: 1}],
successItems: [{entry_type: 3, date: "2017-12-20", id: 3, content: "Petted Cat"}],
quoteItem: {entry_type: 4, date: "2017-12-20", id: 1, content: "This is a quote.", author: "me"}};
}
componentDidMount() {
this.loadEntries();
}
loadEntries() {
let goalArray = [];
let targetArray = [];
let successArray = [];
let quote = {};
let scheduleArray = [];
Network.getEntries().then((entries) => {
for (let entry of entries.data) {
switch (entry.entry_type_id) {
case 1:
goalArray.push(entry);
break;
case 2:
targetArray.push(entry);
break;
case 3:
successArray.push(entry);
break;
case 4:
quote = entry;
break;
case 5:
scheduleArray.push(entry);
}
}
});
let stateInit = {
goalItems: goalArray,
targetItems: targetArray,
successItems: successArray,
quoteItem: quote,
scheduleItems: scheduleArray
};
this.setState(stateInit);
}
//My Network File.
import axios from 'axios';
export function getEntries(){
return axios.get('http://localhost:8000/api/entry');
}
我认为您只是想将 let stateInit... this.setState 代码移动到请求的 then 块中,以便它在请求完成后执行。
您的 setState 调用正在 Network.getEntries 的 Promise 解决之前执行。所以你必须在 then
中调用它loadEntries() {
let goalArray = [];
let targetArray = [];
let successArray = [];
let quote = {};
let scheduleArray = [];
Network.getEntries().then((entries) => {
for (let entry of entries.data) {
switch (entry.entry_type_id) {
case 1:
goalArray.push(entry);
break;
case 2:
targetArray.push(entry);
break;
case 3:
successArray.push(entry);
break;
case 4:
quote = entry;
break;
case 5:
scheduleArray.push(entry);
}
}
let stateInit = {
goalItems: goalArray,
targetItems: targetArray,
successItems: successArray,
quoteItem: quote,
scheduleItems: scheduleArray
};
this.setState(stateInit);
});
}