2016-08-13 26 views
0

我正在嘗試構建一個非常簡單的應用程序React,它會告訴您自給定日期以來有多少天過去了。我正在使用React,MomentsReactJS Datepicker作爲此應用的基礎,以便快速實施。如何讓文本動態地隨着React改變,但不能在Render中調用改變?

我發現了一個error當我嘗試選擇一個日期說

warning.js:44 
Warning: setState(...): Cannot update during an existing state transition (such as within 'render' or another component's constructor) 

我明白這意味着我不能有一個功能更新state我目前顯示由於render的問題,但我很難弄清楚如何在不更新render方法的情況下獲得此類功能。

這是當前的應用程序:

import React, { Component } from 'react'; 
 
import DatePicker from 'react-datepicker'; 
 
import moment from 'moment'; 
 
import './App.css'; 
 
import 'react-datepicker/dist/react-datepicker.css'; 
 

 
class App extends Component { 
 
    constructor() { 
 
    super(); 
 
    this.handleChange = this.handleChange.bind(this) 
 
    this.state = { 
 
     startDate: moment(), 
 
     dateDiff: moment(), 
 
     dateCheck: false 
 
    }; 
 
    } 
 
    handleChange(date) { 
 
    this.setState({ 
 
     startDate: date, 
 
     dateCheck: true 
 
    }); 
 
    } 
 
    showDiff(date, dateCheck) { 
 
    if (dateCheck) { 
 
     this.setState({ 
 
     dateCheck: false, 
 
     dateDiff: moment().startOf(date).fromNow() 
 
     }); 
 
    } 
 
    } 
 
    render() { 
 
    return (
 
     <div className="App"> 
 
     <div className="DatePicker"> 
 
      <DatePicker 
 
      selected={this.state.startDate} 
 
      onChange={this.handleChange} 
 
      showYearDropdown 
 
      dateFormatCalendar="MMMM" 
 
      isClearable={true} 
 
      placeholderText='Enter A Date' /> 
 

 
     </div> 
 
     <div> 
 
      {this.showDiff(this.state.startDate, this.state.dateCheck)} 
 
     </div> 
 
     </div> 
 
    ); 
 
    } 
 
} 
 

 
export default App;

我想有它更新每一個新的日期選擇時間的計算天數,並認爲dateCheck標誌會幫助,但它沒有。

謝謝

回答

2

React自動重新渲染需要更新狀態變化的DOM部分。這個想法是告訴React 什麼你想要它呈現,而不是你想要它如何呈現

因此,對於您的情況,如果您只是想讓React從現在開始渲染日期差異,則只需在更新時更改startDate。下面是一些代碼,試圖說明我的建議:

import React, { Component } from 'react'; 
import DatePicker from 'react-datepicker'; 
import moment from 'moment'; 
import './App.css'; 
import 'react-datepicker/dist/react-datepicker.css'; 

class App extends Component { 
    constructor() { 
    super(); 
    this.handleChange = this.handleChange.bind(this) 
    this.state = { 
     startDate: moment() 
    }; 
    } 
    handleChange(date) { 
    this.setState({ 
     startDate: date 
    }); 
    } 
    render() { 
    return (
     <div className="App"> 
     <div className="DatePicker"> 
      <DatePicker 
      selected={this.state.startDate} 
      onChange={this.handleChange} 
      showYearDropdown 
      dateFormatCalendar="MMMM" 
      isClearable={true} 
      placeholderText='Enter A Date' /> 
     </div> 
     <div> 
      {this.state.startDate.fromNow()} 
     </div> 
     </div> 
    ); 
    } 
} 

export default App; 
+0

太棒了!我很愚蠢,沒有意識到:( 我會將你的帖子標記爲答案,但對於試圖這樣做的人,我犯了另一個錯誤,並將dateDiff初始化爲一個時刻對象和'fromNow'函數返回一個產生錯誤的字符串 簡單地使'dateDiff:'''修正了問題 現在文本顯示正確,但它實際上並沒有更新,並且從現在起不斷說幾秒鐘,而不管日期我選擇:( 編輯*我不得不添加另一行以允許datePicker知道在同一個'setState'調用中顯示'startDate:date'的日期。 –

+0

啊我明白了代碼現在要做的事情。最初只是爲了概念而回答,而不是考慮背後的邏輯,我修改了它現在 - 給它一個嘗試,讓我知道如果這工作:) – Karin

+0

太棒了!是的,我明白你現在是怎麼做到的。非常感謝你:) 編輯*現在我覺得可笑!我最初的想法是,我可以告訴從現在到某一特定日期之間有多少天,但是在我進入我的生日之後,它只是在幾年內將它交給我......回到繪圖板! –