2017-05-17 14 views
1

render()でビューコンポーネントが呼び出された特定のプロジェクトをユーザーがクリックすると、プロジェクトのリストを表示するページがあります。子コンポーネントのsetState警告。警告:マウントされたコンポーネントまたはマウントされているコンポーネントのみを更新できます

親:

constructor(props) { 
    super(props); 
    this.state = { 
     showData : [], 
     view : false, 
     projectId: '' 
    }; 
    this.buttonHandler = this.buttonHandler.bind(this); 
    this.back = this.back.bind(this); 
    }; 


// change view state to true to render diff component 
    buttonHandler(){ 
    this.setState({view:true}) 
    }; 



    back(){ 

    this.setState({view:true}) 
    } 

render(){ 

    let compA = (
    <Paper> 
     <List> 
      <Subheader >New 
      Projects</Subheader> 
      {this.state.showData.map(item => 
       <div key={item.title}> 
        <ListItem onClick={()=> 
        this.buttonHandler()} leftAvatar= 
        {<Avatar icon={<Wallpaper />} />} primaryText= 
        "test" secondaryText="test" /> 
        <Divider inset={true} /> 
       </div> 
      )} 
     </List> 
    </Paper> 
); 

let compB = (
    <ReviewProject 
    back={this.back}/> 
); 
    return(
     <div> 
     {this.state.view?compB:compA} 
     </div> 
    ); 
} 

子コンプB:

constructor(props) { 
super(props); 
this.state = { 
//some code 
}; 

} 
//calls function back from parent which sets state the "view" to false 
dismiss() { 
    this.props.back(); 
    }; 

dismiss()機能がリストコンポーネントcompAをバックレンダリングする子で呼び出されると、警告が飛び出す:

Warning: setState(...): Can only update a mounted or mounting component. This usually means you called setState() on an unmounted component. This is a no-op. Please check the code for the compB component. 

これを解決する方法はありますか?良い練習が前後に他の1つの構成要素からナビゲートするものです

+0

はどのように消す関数を呼び出すか、そしてあなたが良いでしょう異なるコンポーネントを、レンダリングするために 'routes'を使用することができます場合は、バック機能 –

+0

の定義を追加することができます。 – Panther

+0

私はcompBでdismiss関数を呼び出し、compAのビューの状態をfalseに設定します。私は再編集しました – Pickles

答えて

0

Iが見出さ溶液である:

ABの切り替えを処理するためにviewProject成分と呼ばれる第三の成分を作成します。

class A extends React.Component { 
    constructor(props) { 
    super(props) 
    } 

    render() { 
    return (
     <div> 
     This is component A 
     <button onClick={this.props.onGoBClick}>Go to B</button> 
     </div> 
    ) 
    } 
} 

class B extends React.Component { 
    constructor(props) { 
    super(props) 
    } 

    render() { 
    return (
     <div> 
     This is component B 
     <button onClick={this.props.onGoAClick}>Go to A</button> 
     </div> 
    ) 
    } 
} 

class ViewContainer extends React.Component { 
    constructor(props) { 
    super(props); 
    this.state = { 
     view: false, 
    } 
    this.goToA = this.goToA.bind(this); 
    this.goToB = this.goToB.bind(this); 
    } 

    goToA() { 
    this.setState({view: false}) 
    } 

    goToB() { 
    this.setState({view: true}) 
    } 

    render() { 
    return (
     this.state.view ? 
     <B onGoAClick={this.goToA}/> 
     : 
     <A onGoBClick={this.goToB}/> 
    ) 
    } 
} 

ReactDOM.render(<ViewContainer />, document.getElementById('app')) 
0

最初に 機能(){の下にあるため、実際に

if (this.refs.ref) 
    this.setState({view: true}); 
} 

render() { 
    return (
    <div ref="ref">{this.state.view}</div> 
); 
} 
+0

私はすでにバインドを解除しています。また、私のbuttonHandler()はonTouchTapにバインドされているので、トリガされるとcompAの代わりにcompBがレンダリングされます。最初はstate.viewをfalseとして宣言しました。私はすでに私の希望する出力を達成しています、それは私が警告を得ることだけです。提案thoをありがとう。 – Pickles

0

を定義したとして、あなたの状態を設定する前にも、REFを使用して試すことができますレンダリングすると、compAがレンダリングされた場合、compBが見つからない場合があります。したがって、リアクションが再レンダリングしようとすると、欠落している要素を見つけることができません。

==>解決

render(){        
    let returnedComp = (
     <Paper> 
      <List> 
       <Subheader >New Projects</Subheader> 
       {this.state.showData.map(item => 
        <div key={item.title}> 
         <ListItem onClick={()=> 
         this.buttonHandler()} leftAvatar= 
         {<Avatar icon={<Wallpaper />} />} primaryText= 
         "test" secondaryText="test" /> 
         <Divider inset={true} /> 
        </div> 
       )} 
      </List> 
     </Paper> 
    ); 

     if (this.state.view) { 
      returnedComp = (
       <ReviewProject back={this.back}/> 
      ); 
     } 
     return(
      <div> 
      {returnedComp} 
      </div> 
     ); 
} 
+0

最初はthis.state.viewがfalseで、最初のレンダリング時にcompAがレンダリングされます。buttonHandlerがonTouchTapによってトリガされると、ビューはtrueに設定され、再レンダリングがトリガされます。 this.state.view?compB:compA}は、this.state.viewがtrueの場合、compB else compAの場合です。ありがとう、しかし、私はこれが私の警告を解決するとは思わない – Pickles

+0

あなたはこれを試してみてください、それともあなたはすでにそれを試してみましたか?あなたのロジックは問題ありませんが、問題は反応し、jsxは独自のルールを持っています!上記の答えは私の以前のほぼ同じ問題を修正した私の実際のコードからコピーされました! – thinhvo0108

+0

さて、私はそれを試して、私はまだ同じ警告を得ています。マウントされていないコンポーネントからsetStateを呼び出すことは、私と何か関係があると思います。とにかくおかげさまで感謝します。 – Pickles

関連する問題

 関連する問題