2016-04-15 55 views
1

我正在使用React(14.2)和Redux。除了當我在update上分配一個動作時,我有一切設置和工作,發生遞歸循環。React Redux在更新時發送導致遞歸錯誤

componentWillMount() { 
    const { wizardActions, valid, errors } = this.props 
    wizardActions.setPropState({valid: valid, errors: errors}) 
} 

componentWillUpdate(nextProps) { 
    const { wizardActions } = this.props 
    console.log('NP', nextProps) 
    //*** IF I UNCOMMENT THE FOLLWOING LINES THE APP GOES INTO AN INFINTIE 
    // RECURSION LOOP... 
    /*if(this.props !== nextProps) { 
    wizardActions.setPropState({valid: nextProps.valid, errors: nextProps.errors}) 
    }*/ 
} 

如何在當前組件的道具更改時更新Redux狀態?我也在componentWillReceiveProps()中試過這個,它也做了同樣的事情。

TIA!

+1

使用'if'語句?當然,你只想在具有特定情況的更新後調度,比如'this.props!== nextProps' – azium

+0

添加了if語句,但仍然是相同的行爲 –

+3

哦,它不能是* exact * if語句,因爲對象引用是總是不同的..這將永遠評估爲真。你必須比較你想成爲新的道具內的特定值。 – azium

回答

-1

有沒有理由不能使用componentDidUpdate掛鉤?
React docs中,他們注意到不要在componentWillUpdate中調用this.setState以避免無限循環。 Redux的dispatch不是this.setState,但它會產生相同的效果。

+0

componentDidUpdate面向DOM操作,這不是在這裏完成的 –

2

當由外部事件引起的派送動作以響應道具變化即可。反應路由器。但似乎你想分發動作以響應從Redux注入的道具的變化,這使得它變得循環。這在Redux中並不是你應該做的。

validerrors哪裏來的?如果他們由Redux管理,則不需要在componentWillUpdate中發送操作 - 在您收到新值時,它們已經在Redux狀態中更新。如果它們由具有本地狀態的父組件管理,則考慮首先將該狀態移動到Redux,而不是用兩個真實來源(組件和存儲)複製該狀態。

一般來說,應用程序中的任何給定狀態應該只有一個事實根源。這個真相的來源可以是一個Redux商店,一個React組件或一些外部來源,但是你不應該嘗試在生命週期方法中同步幾個真相來源。

0

OK - 得到這個工作沒有問題,我修改了if是道具specifc如下:

componentWillUpdate(nextProps) { 
    const { wizardActions } = this.props 
    if(this.props.errors !== nextProps.errors) { 
    wizardActions.setPropState({valid: nextProps.valid, errors: nextProps.errors}) 
    } 
} 

一些事情......

  1. 感謝所有的回信和其中一些細節的水平... 它是@azium,導致我的工作解決方案的路徑
  2. ComponentDidUpdate更多用於DOM操作,這不是我在做什麼這裏
  3. 關注的道具(有效和錯誤)由Redux表格裝飾器注入。 Redux Form在Redux狀態下保留了一些東西,但不是這些 - 它們被直接注入了運行時支持