2017-02-12 120 views
0

我有一個組件,我更新了我的componentDidMount函數中的狀態。我得到了我指出此頁棉絨警告:我應該在哪裏更新狀態?

https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/no-did-mount-set-state.md

它說

的setState的componentDidMount(沒有確實貼裝設定狀態)

防止使用

在組件掛載後更新狀態將觸發第二次render()調用,並可能導致屬性/佈局抖動。

我應該在哪裏更新我的狀態呢?

這是我componentDidMount功能:

componentDidMount(){ 
    this.interval = setInterval(() => { 
     this.setState({ 
     frame: this.state.frame + 1 
     }); 
    }, this.props.interval); 
    } 

這是我的渲染功能:

我的構造函數:

constructor(props, context){ 
    super(props, context); 

    this.state = {frame: 1}; 
} 
+2

構造函數怎麼樣? –

回答

2

其實,你不使用setState,您正在定義將使用setState這一規則的異步操作我相信是關於同步操作setState,所以如果您確定第一次渲染將在觸發時間間隔之前,您可以在eslint config中禁用此規則。

退房此線程和意見@ljharbhttps://github.com/airbnb/javascript/issues/684#issuecomment-264094930

在componentDidMount做的setState會造成明顯的呈現閃光。

但是,在進行服務器渲染時,任何需要瀏覽器環境的東西都必須放在componentDidMount中,因爲它僅運行客戶端,但componentWillMount在客戶端和服務器上運行。

+0

我明白你的意思是關於異步操作。即使我在linter中禁用了警告,我在瀏覽器控制檯中也會看到以下信息:Warning:setState(...):只能更新已安裝或掛載的組件。這通常意味着您在卸載的組件上調用了setState()。這是一個沒有操作。 –

+1

你是否在'componentWillUnmount()'中刪除定時器?我不明白你會如何得到這個警告。 – aaaaaa

+2

啊..我拼寫錯誤componentWillUnmount .. :(。標記爲正確的,因爲它似乎是合法的忽略錯誤,另一個警告是因爲我無關的錯誤。 –