我有一個時間選擇器,我想將該值設置爲this.state.start
。然而,this.state.start
的值可能等於this.props.normal
或this.props.spec
,具體取決於用戶是否設置了特殊小時數,如果他們沒有,那麼它會回落到使用正常小時數。在React中渲染組件時有條件地更新this.state?
我遇到了一個問題,試圖做if-else語句來更新this.state.start
的狀態。雖然它應該更新正確的值(if-else語句應該是正確的),但反應並不允許您像渲染一樣更新渲染函數中的狀態。如何有條件地設置this.state.start
?下面的代碼:
class NormalHours extends React.Component {
constructor(props) {
super(props)
this.state = {
start: null,
}
}
render() {
//Browser is very angry at this part
if(this.props.specStart == this.props.normStart || this.props.specStart == null)
{
//If special hours are null or equal to normal start use normal hours
this.setState({
start: this.props.normStart;
});
}
else
{
//Else the hours are different so use special hours
this.setState({
start: this.props.specStart;
});
}
return(
<div>
//Using Material UI; this is rendered as a textbox
<TimePicker
name="StartTime"
onChange={(e, date) => {
this.props.onSetStartTime(Utils.convertDateToTimeString(date))
}}
value={this.state.start}
/>
只是一個參考:你不應該在渲染狀態設置狀態,改變狀態觸發'render()',因此你將進入一個不幸的循環。除非您使用'shouldComponentUpdate'處理更新。 (你目前沒有) – Dan
爲什麼normStart和specStart設置在道具上而不是狀態?如果他們在道具上,你可能可以使用shouldReceiveProps生命週期方法 – Pineda
@Dan Yea這就是我遇到的問題,以及我想要如何解決的問題。我嘗試了多種方式,並且仍然存在循環問題。 – Jobokai