我無法渲染具有來自狀態的數據的組件。我從Parse Server提取數據,然後使用該數據更新狀態。但是,在數據可用之前,我使用數據的組件(下面代碼中的<MenuItem />
)正在渲染。使用Parse Server返回的數據更新狀態後,無法獲取React組件重新呈現
我想在這裏介紹的方法: How to wait for AJAX response and only after that render the component?
但我無法獲取組件識別正在更新的狀態,然後重新呈現。
任何想法?代碼全文如下。還附上了一張屏幕截圖,顯示成功的控制檯日誌和狀態數據的存在情況。
(應當指出的是,我是新來的反應,以便大量的代碼很可能不是最優的。)
import React from "react";
import Parse from 'parse';
import MenuItem from './MenuItem';
class MenuItems extends React.Component {
constructor() {
super();
this.loadMenuItems = this.loadMenuItems.bind(this);
this.state = {
menuItems: {},
order: {}
};
}
loadMenuItems() {
/* 0a. Get copy of State? */
const menuItems = {...this.state.menuItems};
/* 0. Get User */
// TODO: Get this from props
var user = Parse.User.current();
/* 1. Get Menu Items for this user */
var MenuItemTest = Parse.Object.extend('MenuItemTest');
var query = new Parse.Query(MenuItemTest);
query.equalTo('user', user);
query.find({
success: function(returnedMenuItems) {
console.log("Successfully retrieved " + returnedMenuItems.length + " menu items.");
for (var i = 0; i < returnedMenuItems.length; i++) {
var object = returnedMenuItems[i];
const menuItem = {
name: object.get('name'),
price: object.get('price'),
description: object.get('description'),
}
menuItems[`menu-item-${object.id}`] = menuItem;
}
},
error: function(error) {
console.log("Error: " + error.code + " " + error.message);
}
});
this.setState({ menuItems });
}
componentWillReceiveProps(nextProps) {
console.log(nextProps);
this.loadMenuItems();
}
componentWillMount() {
this.loadMenuItems();
}
render() {
// Example from:
// https://stackoverflow.com/questions/31723095/how-to-wait-for-ajax-response-and-only-after-that-render-the-component
if (!this.state.response) {
return <div>Loading...</div>;
}
if (this.state.response.length === 0) {
return <div>No menu items yet</div>;
}
return (
<div className="menu-items">
{
Object
.keys(this.state.menuItems)
.map(key => <MenuItem key={key} details={this.state.menuItems[key]} />)
}
</div>
)
}
}
export default MenuItems;
更新的代碼一致與評論主題。
import React from "react";
import Parse from 'parse';
import MenuItem from './MenuItem';
class MenuItems extends React.Component {
constructor() {
super();
this.loadMenuItems = this.loadMenuItems.bind(this);
}
loadMenuItems() {
const menuItems = {};
/* 0. Get User */
var user = Parse.User.current();
/* 1. Get Menu Items for this user */
var MenuItemTest = Parse.Object.extend('MenuItemTest');
var query = new Parse.Query(MenuItemTest);
query.equalTo('user', user);
query.find({
success: function(returnedMenuItems) {
console.log("Successfully retrieved " + returnedMenuItems.length + " menu items.");
for (var i = 0; i < returnedMenuItems.length; i++) {
var object = returnedMenuItems[i];
const menuItem = {
name: object.get('name'),
price: object.get('price'),
label: object.get('label'),
shorthand: object.get('shorthand'),
description: object.get('description')
}
menuItems[`menu-item-${object.id}`] = menuItem;
}
},
error: function(error) {
console.log("Error: " + error.code + " " + error.message);
}
});
this.setState({ menuItems });
}
componentWillReceiveProps(nextProps) {
console.log('I ran');
console.log(nextProps);
this.loadMenuItems();
}
componentWillMount() {
this.loadMenuItems();
}
render() {
// Handle case where the response is not here yet
if (!this.state.menuItems) {
console.log('No state');
return <div>Loading...</div>;
}
// Gives you the opportunity to handle the case where the ajax request
// completed but the result array is empty
if (this.state.menuItems.length === 0) {
console.log('Zero items');
return <div>No menu items yet</div>;
}
if (this.state.menuItems) {
return (
<div className="menu-items">
{ console.log(this.state.menuItems) }
{ console.log(Object.keys(this.state.menuItems)) }
</div>
)
}
}
}
export default MenuItems;
這固定的「載入中...」掛起,謝謝!現在我遇到另一個問題,我認爲這與循環狀態對象有關。如果我在'return(
代碼中的問題是: '回報(
沒有什麼明顯的,我可以看到...如果你只是do'this.state.menuItems.map(項目=><菜單項關鍵= {} item.somethingUnique細節= {item} />)'是否按預期工作?或者在地圖內記錄「鑰匙」? (關鍵字=> {console.log(key); return })''Object.keys(this.state.menuItems) –