2017-03-20 19 views
1

react-routerを使用してセカンダリコンポーネントの内部にsetStateエラーが発生します。誰も私のコードで問題を見ることができますか?React - setState(...):マウントされているコンポーネントまたはマウントされているコンポーネントのみをアップデートできます

import React, { Component } from 'react'; 
import { Row, Col } from 'react-bootstrap'; 
import { Card, CardTitle, CardText } from 'material-ui/Card'; 
import './App.css'; 

class Dashboard extends Component { 
    constructor(props) { 
    super(props); 
    this.state = { 
     info: [] 
    }; 
    this.setInfo = this.setInfo.bind(this); 

    this.setInfo(); 
    } 

    setInfo =() => { 
    var info = [ 
     { 
     id: 0, 
     title: 'Server Space', 
     subtitle: '', 
     textContent: '' 
     }, 
     { 
     id: 1, 
     title: 'Pi Space', 
     subtitle: '', 
     textContent: '' 
     } 
    ]; 
    this.setState({ info: info }); 
    } 

    render() { 
    return (
     <div> 
     <h2>Info</h2> 
     <Row> 
      {this.state.info.map((inf) => { 
      return (
       <Col xs={12} md={4} key={inf.id}> 
       <Card className="card"> 
        <CardTitle title={inf.title} subtitle={inf.subtitle} /> 
        <CardText>{inf.textContent}</CardText> 
       </Card> 
       </Col> 
      ) 
      })} 
     </Row> 
     </div> 
    ) 
    } 
} 

export default Dashboard; 

これは、その結果:問題の行は、あなたがコンストラクタでthis.setStateを呼び出すことになっていませんthis.setState({ info: info });

答えて

7

ある

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 Dashboard component. 

。 あなたは直接の状態を設定することができます。

var info = [ 
    { 
    id: 0, 
    title: 'Server Space', 
    subtitle: '', 
    textContent: '' 
    }, 
    { 
    id: 1, 
    title: 'Pi Space', 
    subtitle: '', 
    textContent: '' 
    } 
]; 

class Dashboard extends Component { 
    constructor(props) { 
    super(props); 
    this.state = { 
     info: info 
    }; 
    this.setInfo = this.setInfo.bind(this); 
    } 

    setInfo =() => { 
    this.setState({ info: info }); 
    } 
    ... 
+0

ありがとうございました。なぜこれがこれまで私がこれまでやったように動作していないのか混乱していましたが、私はスーパーエージェントを使用していて、非同期終了関数でsetStateを呼び出していることに気付きました – Timmo

+0

共有のおかげで、それは私が持っているものです コンストラクタ(小道具){ \t \tスーパー(小道具); \t \t this.state = {data:this.props.cryptos、isLoading:false}; \t \tたsetInterval(()=> { \t \t \t this._query(クエリ); \t \t}、6000)。 \t}; \t _handleResponse(応答){ \t \t this.setState({data:レスポンス、isLoading:false}); \t}; \t _query(クエリ){ \t \t this.setState({isLoading:true}); \t \t \t => this.setState((クエリ) \t \t \t \t .then(応答=> response.json())。次いで、(JSON => this._handleResponse(JSON))\t \t .catch(エラーをフェッチ{ \t \t \t \t \t \t \t \t isLoading:偽、 \t \t \t \t \t \t \t \tメッセージ: 'エラー:' +エラー \t \t \t})); \t}; – Alex

+0

コンポーネントがアンマウントされているときにクリアする必要があることがわかりました。ここではインターバルについての素晴らしい記事http://reactnativequickly.com/book/chap07.html – Alex

4

コンポーネントconstructorが呼び出された部品が実装される前に、あなたはそれでsetState呼び出すことはできませんので(setStateを搭載部品にのみ呼び出すことができます)。コンストラクタは状態を初期化するための適切な場所ですが、あなたは直接の状態を設定することによってそれを行う必要があります。

constructor(props) { 
    super(props); 
    var info = [...]; 
    this.state= { 
    info: info 
    }; 
} 

constructorあなたが直接状態を設定することはありませんので、ご注意ください - constructorすることは、あなたがそれを行うことができます唯一の例外です。

関連する問題

 関連する問題