请帮助我渲染从 Firebase 实时数据库检索的数据。
我成功从 Firebase 中以数组形式检索数据。下一步是显示数据——问题就从这里开始了。
我想要显示的数据应该存储在“模块”状态。首先,它被设置为一个空数组。然后检索数据,通过 CoumponentDidMount 生命周期方法中的 setState 更新状态 - 我可以在 React DevTool 中将数据视为数组 - 但组件不会渲染(显示)它们。
我认为问题与生命周期方法有关,因为我可以在控制台中记录状态,但我还可以看到一个弹出信息,表明数组(从 Firebase 检索)“刚刚被评估”。如果我是对的,这意味着数据是在渲染方法之后检索的?我该怎么做才能解决问题并正确显示数据?
这是我的代码:
import React, { Component } from "react";
import firebase from "firebase";
import { DB_CONFIG } from "./database/db_config";
import ModulesData from "./modulesData";
//import LandingPage from "./components/landingPageComponents/landingPage";
import ThematicAreaNav from "./components/navbarComponents/thematicAreaNav";
import ThematicArea from "./components/singleModuleComponents/thematicArea";
import OrderList from "./components/orderListComponents/orderList";
import Footer from "./components/footerComponents/footer";
let chosenModulesArray = [];
class App extends Component {
constructor(props) {
super(props);
this.state = {
holdClickedModulesNames: chosenModulesArray,
modules: []
};
}
componentDidMount() {
let ref = firebase
.initializeApp(DB_CONFIG)
.database()
.ref();
ref.once("value").then(dataSnapshot => {
this.response = dataSnapshot.val()["modulesData"];
this.setState({ modules: this.response });
});
}
render() {
return (
<div>
{console.log(this.state.modules)}}{/*<LandingPage />*/}
<ThematicAreaNav modules={this.state.modules} />
<div className="main-layout">
<ThematicArea
modules={this.state.modules}
orderedModules={this.props.orderedModules}
clickedModuleNames={this.state.holdClickedModulesNames}
chosenModulesNames={this.state.holdClickedModulesNames}
/>
<OrderList
clickedModuleNames={this.state.holdClickedModulesNames}
chosenModulesNames={this.state.holdClickedModulesNames}
/>
</div>
<div className="footer">
<Footer />
</div>
</div>
);
}
}
export default App;
enter code here
从视觉角度来看如果您的数据在之后返回render()
,而不是显示空白屏幕或一半填充的组件,而是显示等待数据填充的加载屏幕 - 从用户体验的角度来看,这始终是一个很好的实践!
代码示例:
class app extends Component {
constructor(props){
modules:null,
loading:true,
}
componentDidMount(){
getModules();
}
getModules(){
let ref = firebase
.initializeApp(DB_CONFIG)
.database()
.ref();
ref.once("value").then(dataSnapshot => {
this.response = dataSnapshot.val()["modulesData"];
//once the data is back, set the loading to false so it can be rendered
this.setState({ data: this.response, loading: false });
});
}
render(){
// deconstruct 'modules' from the state to call it without this.state...
const {modules, loading, holdClickedModulesNames} = this.state;
const { orderedModules } = this.props;
return loading ? (
<div>
loading...
</div>
) : (
<div>
<ThematicAreaNav modules={modules} />
<div className="main-layout">
<ThematicArea
modules={modules}
orderedModules={orderedModules}
clickedModuleNames={holdClickedModulesNames}
chosenModulesNames={holdClickedModulesNames}
/>
<OrderList
clickedModuleNames={holdClickedModulesNames}
chosenModulesNames={holdClickedModulesNames}
/>
</div>
<div className="footer">
<Footer />
</div>
</div>
)
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)