当我单击导航栏时,我有一个导航栏,我将状态设置为true并将其作为道具传递给我的组件,但函数需要花费一些时间来更新它,而我的道具发送为false时,如何发送更新的道具?状态更新已完成
navbar.js
constructor(props) {
super(props);
this.state = {
burgerClicked:false,
};
}
burgerClicked=()=>{
this.setState({ burgerClicked: true },()=>{ this.props.clicked(this.state.burgerClicked)})
}
app.js
constructor(props){
super(props);
this.state={
open:false,
}
}
openSideNav =(burgerClicked)=>{// the time is taking here to update it send open as false
this.setState({open:burgerClicked},()=>{
console.log(this.state.open)
});
<Navbar clicked={this.openSideNav} tokenRequested={this.request}/>
<Header open={this.state.open} />
header.js
constructor(props) {
super(props);
this.state = { showSideNav: false };
}
UNSAFE_componentWillReceiveProps(){
//
console.log(this.props.open,this.state.showSideNav);//this.props.open is false
if (this.props.open) {
this.setState({showSideNav:this.props.open},()=>{
console.log(this.state.showSideNav); //this.state.showSideNav dont print on first click but print true on second click on burger
})
}
console.log(this.props.open,this.state.showSideNav); //this.props.open is false
}
{(() => {
if (!this.state.showSideNav) {
return null;
}
return(
<SideNavbar closeNav={this.closeSideNav}/>
)
})()}
答案 0 :(得分:0)
这个答案可能超出您的要求,但是在这里:
在此示例中,您具有三种状态:burgerClicked
(在Navbar.js
中,open
(在App.js
中)和showSideNav
(在{{1 }}。
这三个人似乎都在跟踪同一件事:“侧面导航是否打开?”。您不想要那样,应该只使用一个组件来跟踪它。
根据您的示例,我会说只有header.js
应该具有该状态,并将其值传递给App.js
和Navbar
作为道具。
在header
中,Navbar.js
仅需要调用onClick
函数,无需传递任何参数。然后,clicked
找出是将App.js
设置为open
还是true
(这很可能意味着切换它)。
一旦false
更新其状态,它将把更新后的值传递给App.js
和header
,这就是React的优点。
答案 1 :(得分:0)
您的问题有点难以理解,只能弄清楚您要使用条件渲染。
阅读此https://reactjs.org/docs/conditional-rendering.html
希望它能对您有所帮助:)