簡體   English   中英

當狀態中的“日期”更新時,React 組件不會重新渲染

[英]React component not re-rendering when "Date" in state gets updated

免責聲明:我將 React 與 Typescript 一起使用。
我有一個組件,它在安裝時會用這樣的日期設置狀態:

constructor(props: SomeProps) {
    super(props);
    const fromDate = new Date();
    fromDate.setHours(fromDate.getHours() - fromDate.getUTCDate());
    fromDate.setDate(fromDate.getDate() - 1);
    this.state = {
      fromDate: fromDate,
    };
  }

componentDidMount()被炒魷魚,我嘗試setStatefromDate再次,如果需要的話:

componentDidMount(): void {
  ...someCode
  if (someData.length > 0) {
      const fromDate = new Date(someData[someData.length - 1].timestamp);
      fromDate.setDate(fromDate.getDate() - 1);
      this.setState({
        fromDate
      });
    }
}

再次設置fromDate后(在componentDidMount() ),我可以在 React DevTools(Chrome 版)中看到 fromDate 已更改,但不會重新渲染以下 DateTimePicker 組件:

const { fromDate } = this.state;
<DateTimePicker
   value={fromDate.toISOString()}
   label="From"
   dateChangeHandler={(e: any) => this.handleChange(e)}
/>

再次查看 React DevTools,我可以看到我的主要組件狀態確實發生了變化,但是 DateTimePicker 沒有從狀態中收到新的fromDate
有誰知道,為什么不重新渲染?
謝謝!

問題可能是您將 Date() 對象存儲在狀態中,因此從技術上講狀態沒有改變, fromDate 仍然是一個對象。

你可以試試

constructor(props: SomeProps) {
    super(props);
    const fromDate = new Date();
    fromDate.setHours(fromDate.getHours() - fromDate.getUTCDate());
    fromDate.setDate(fromDate.getDate() - 1);
    this.state = {
      fromDate: fromDate.toISOString(),
    };
  }

componentDidMount(): void {
  ...someCode
  if (someData.length > 0) {
      const fromDate = new Date(someData[someData.length - 1].timestamp);
      fromDate.setDate(fromDate.getDate() - 1);
      this.setState({
        fromDate: fromDate.toIsoString()
      });
    }
}

然后在渲染

const { fromDate } = this.state;
<DateTimePicker
   value={fromDate}
   label="From"
   dateChangeHandler={(e: any) => this.handleChange(e)}
/>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM