2017-09-24 60 views
0

我正在尋找這麼多的方式來解決這個內部狀態,但沒有一個人的作品,setState仍然不是這裏的componentWillReciveProps方法裏面工作是我的代碼:反應母語:未更新componentWillReciveProps

export class Detail extends React.Component 
{ 
    constructor(props) 
    { 
    super(props); 
    this.state = { 
     ids: 'ger' 
    } 
    } 

    componentWillReceiveProps(nextProps) { 
    this.setState({ ids: nextProps.data },() => { 
      console.log(nextProps.data+"=this id") 
     }); 
    } 


    render() 
    { 
    return (
     <View> 
     <Text>{this.state.ids}</Text> 
     </View> 
    ); 
    } 
} 

如果我做console.log(nextProps.data+"=this id")它可以將我想更新的ID返回到this.state.ids。但在<Text>{this.state.ids}</Text>中,渲染仍顯示默認值this.state.ids('ger'),表示this.state.ids未在componentWillReceiveProps中更新。

+0

我認爲這與你的[上一個問題](https://stackoverflow.com/q/46389012/2315280)有關,並且可能是由於你的渲染項目上沒有'key' prop 'ListView'。請看看[這個答案](https://stackoverflow.com/a/35229429/2315280) – bennygenel

+0

我試過這種方式,仍然得到這個問題,奇怪的是'nextProps.data'獲得id時成功我做'console.log(nextProps.data +「=這個id」)'(例如,輸出是「4 = this id」),但ids狀態仍然沒有更新,即使我已經做了'this.setState({ids :nextProps.data})''componentWillReceiveProps''內:'( – janotama

回答

1

setState()並不總是立即更新組件。

你可以在here找到所有你需要的。

實際上作爲react文檔saya「React在安裝時不會調用componentWillReceiveProps和初始道具,只有在某些組件的道具可能更新時才調用此方法,調用this.setState通常不會觸發componentWillReceiveProps。

你可以找到更多here

0

這看起來像一個反模式給我。爲什麼不直接將nextProps.data作爲ID注入到Detail組件中?然後你就可以輸出的ID直接像這樣:

<Text>{this.props.ids}</Text> 

通常你也應該得到一個警告,在「componentWillReceiveProps」調用的setState不會有任何效果。如果你真的想更新你的狀態,你可以做「this.state.ids = nextProps.data」我想。

+0

我相信你對設置狀態是錯誤的。請檢查[正確使用狀態的反應文檔](https://facebook.github.io/react/docs/ state-and-lifecycle.html#using-state-correctly)獲得更多關於它的信息 – bennygenel

+0

我知道,使用this.state.something =設置狀態會設置狀態,但不會重新渲染組件,但是在componentWillReceiveProps之後,該組件應該重新渲染,因爲道具改變了,除非shouldComponentUpdate返回false。但正如我所說的設置stat這種方式並不是很好的做法。 – justadudewhohacks