2

ここでは例のようにマスターディテールのナビゲーションを作成しています。the react router example;React Routerのマスターディテール:childrenコンポーネントは、ページの更新まで新しいビューをレンダリングしません。

私はナビゲーションパネルCheckpointNav(リンク)、およびデータ・コンポーネントOneCheckpointData(負荷時にこの男fetchsデータをレンダリングするコンテナコンポーネントOneCheckpointContainerを、持っている、とOneCheckpointViewをレンダリングします。

とき、私のリンクのいずれかをクリックCheckpointNavブラウザのURLを変更する以外は何も起こりません。新しいデータが取得されたページをリフレッシュし、新しいコンポーネントが子ビューでレンダリングされるまでではありません(エラーもありません)

Iこのバグが存在するかどうかは確かではありません。なぜなら、子コンポーネントがデータのフェッチを担当するだけでなく、 w。

<Route path="/modules/:id" component={OneCheckpointContainer}> 
    <Route path="/modules/:id/checkpoints/:cp_id" component={OneCheckpointData} /> 
    </Route> 

ここOneCheckpointContainer

import React from 'react'; 
import CheckpointNav from './CheckpointNav'; 

class OneCheckpointContainer extends React.Component { 
    constructor(props, context) { 
    super(props, context); 

    this.state = { 
     checkpoints: null, 
     user: null 
    }; 

    } 

    componentWillMount() { 
    this.loadCheckpoints(); 
    this.context.getUser((data) => this.setState({ user: data })); 
    } 

    loadCheckpoints() { 
    $.ajax({ 
     url: `/api/v1/modules/student/${this.props.params.id}/checkpoints`, 
     method: 'GET', 
    }).done((data) => { 
     this.setState({ checkpoints: data }); 
    }); 
    } 

    render() { 
    return (
     <div> 
     <div className="col-xs-3"> 
      <CheckpointNav mid={this.props.params.id} checkpoints={this.state.checkpoints} /> 
     </div> 
     <div className="col-xs-9"> 
      { this.props.children || <div>No Children Yet</div>} 
     </div> 
     </div> 
    ) 
    } 
} 

OneCheckpointContainer.displayName = OneCheckpointContainer; 

OneCheckpointContainer.contextTypes = { 
    getUser: React.PropTypes.func.isRequired 
}; 

export default OneCheckpointContainer; 

が、私は信じていませんが、バグがここにあるCheckpointNav次のとおりです:ここで

は私がルートを設定している方法です

import React from 'react'; 
import NavLink from '../widgets/NavLink'; 

const CheckpointNav = (props) => { 
    const checkpointList = props.checkpoints && props.checkpoints.length > 0 ? 
    props.checkpoints.map((item) => { 
     return <li key={item.cp._id} className="list-group-item"> 
     <NavLink className="nav-link" to={"/modules/" + props.mid + "/checkpoints/" + item.cp._id}> 
     { item.cp.title}</NavLink></li> 
    }) : <div>No CPS</div>; 
    return (
    <div className="card one-module-card"> 
     <div className="card-block modules-card-body"> 
     <ul className="list-group tags-group"> 
      { checkpointList } 
      <li className="list-group-item new-cp"><NavLink className="" 
      to={'/post/checkpoint/' + props.mid} 
      > 
      New Checkpoint 
      </NavLink></li> 
     </ul> 
     </div> 
    </div> 
); 

}; 

export default CheckpointNav; 

OneCheckpointData は、それがirrelavantなければならないので、私はOneCheckpointViewを残しています**新しいデータを取得し、私は

import React from 'react'; 
import CheckpointView from './CheckpointView'; 

class OneCheckpointData extends React.Component { 
    constructor(props, context) { 
    super(props, context); 

    this.state = { 
     checkpoint: null, 
     user: null 
    }; 

    } 

    componentWillMount() { 
    this.loadCheckpoint(); 
    this.context.getUser((data) => this.setState({ user: data })); 
    } 

    loadCheckpoint() { 
    $.ajax({ 
     url: `/api/v1/modules/three/cp/${this.props.params.cp_id}`, 
     method: 'GET', 
    }).done((data) => { 
     this.setState({ checkpoint: data }); 
    }); 
    } 

    render() { 
    return this.state.checkpoint ? <CheckpointView user={this.state.user} checkpoint={this.state.checkpoint} /> : null; 
    } 
} 

OneCheckpointData.displayName = OneCheckpointData; 

OneCheckpointData.contextTypes = { 
    getUser: React.PropTypes.func.isRequired 
}; 

export default OneCheckpointData; 

を更新しない限り、新しいレンダリングされません**

答えて

5

で、あなたはloadCheckpoing(props)関数のパラメータとしての小道具を得ることができ、あなたが、私が使用することを好むだろうちょうど

componentWillMount(this.props) { 
    this.loadCheckpoint(this.props); 
} 

componentWillReceiveProps(nextprops) { 
    this.loadCheckpoint(nextprops); 
} 

loadCheckpoint(props) { 
    this.context.getUser((data) => this.setState({ user: data })); 
    $.ajax({ 
    url: `/api/v1/modules/three/cp/${props.params.cp_id}`, //please check i have replace the this.props to props as we have props as a parameter 
    method: 'GET', 
    }).done((data) => { 
    this.setState({ checkpoint: data }); 
    }); 
} 

以下のようにcomponentWillReceivePropsに新しい小道具を送信することができ、その場合react-あなたのAjaxデータクエリを処理するために私の提案する解決策があなたのために仕事をする必要があります。

+0

あなたは何をしようとしているのか分かりますが、this.propsをargとしてcomponentWillMountに渡すことはできません – fresh5447

1

問題があることですあなたのコンポーネントはマウントする前にのみデータを取得しています。これは、初めて表示されるときにのみ機能します。また、これらのコンポーネントは、新しいプロパティを受け取るたびにデータを取得する必要があります。新しい場所に移動した後にルータからIDを取得します。

これを行うには、最も簡単な方法は、前の小道具と新しい小道具を比較し、必要に応じて新しいデータを取得するcomponentWillReceivePropsを追加することです。

別の方法として、経路が変更されるたびにデータを取得するために、Routes設定にonEnterハンドラを追加することができます。

this question's answersを確認して、両方のアプローチの例を確認してください。

1

これは、componentwillMountでloadcheckpoints関数を呼び出したためです。これは、コンポーネントのライフサイクルで1回だけ呼び出されます。 ナビゲーションバーのリンクをクリックしたときにコンポーネントがすでにマウントされているため、compoenntwillmountは呼び出されません。データがフェッチされません。

次のようなアプローチを試してください。 CheckpointNavのリンクのonclick関数は、OneCheckpointContainerから渡される必要があります。読み込まれたデータは、データをOneCheckpointDataに渡して小道具として渡すコンテナ内の状態に設定する必要があります。診断へ

1

2つのステップ:あなたの方法は、あなたが別のリンクをクリックするたびに呼び出されているかどうかをloadCheckpoint

  1. をチェック。ただ、その方法でconsole.log(new Date().toLocaleTimeString())のような1行を残す

  2. ステップ1の成功は、この部分でthis参照の問題があるかどうかを確認した場合: (data) => { this.setState({ checkpoint: data }); }

はところで、あなたはより良いAJAXを入れたいですcomponentDidMountメソッドで呼び出します。参照してください:https://facebook.github.io/react/docs/component-specs.html#mounting-componentdidmount

関連する問題