2016-02-20 18 views
11

に移動していませんプログラムでビューから新しいページへのルート、ALAへ:browserHistory.pushは、私はこの(反応-ルータ2.0)を使用して、ルータ上でbrowserHistoryを設定した新しいページ

import { browserHistory } from 'react-router' 

... 

browserHistory.push('/map'); 

これは、/マップのURLを変更しますが、そのルートでコンポーネントをレンダリングしません。私は間違って何をしていますか?

+0

マップビューである 'requireAuth'ハンドラを見ることはできますか? –

+0

ok - 追加されました。 onEnter属性がない場合も同じことが起こります(/ mapはレンダリングされません)。 – outside2344

+0

はい - browserHistory.push( '/ map')が呼び出されました。URLの変更が表示されますが、新しいルートコンポーネント(MapContainer)はレンダリングされません。 最後に、私がauthを無効にして、/ mapに直接行くと、正しくレンダリングされます。 – outside2344

答えて

9

私のコメントで述べたように私はこの同じ問題を抱えていましたが、それを機能させる方法を見つけました。

あなたのルートは変更されていますが、AppLayoutコンポーネントは実際に自動的に状態を更新していません。ルーターは、コンポーネントの状態変更を自動的に強制するようには見えません。基本的には、AppLayoutのthis.state.childrenは新しい子で更新されていません。

私が見つけた解決策(そして完全な開示、これがあなたがこれを達成する方法であるかどうかわからない、またはベストプラクティスである場合)はcomponentWillReceiveProps関数を使用し、this.state.childrenを子供新しい小道具から:

componentWillReceiveProps(nextProps) { 
    this.setState({ 
     children: nextProps.children 
    }); 
} 

希望があります。

+2

これは最善の方法のようですが、これはインターネット上でこの問題を見つけることができる唯一の答えであり、githubに関する本当に平凡な文書と結びついています。可能な限り、これを拡大してください。私は正確に私のコンポーネントのコンテナの私のルータで、私はcomponentWillReceivePropsを使用する必要がありますか分からない?私は VaRの子供を使用しています = React.Children.map(子供、機能(子){ リターンReact.cloneElement(子、{ ユーザー:ユーザー、 キー:キー }); }); 純粋なjs関数内で私の小道具を複製する。 – mibbit

2

ルータがアプリケーションの別のセクションに移動できるようにする別の解決策は、ライフサイクルの方法で更新を強制することなく、コンテキストルータを使用することです。 )私は(browserHistory.push、を認識していないよ理由(複数可)について

class MyComp extends Component { 
    static contextTypes = { 
    router: PropTypes.object 
    } 

    handleClick =() => { 
    this.context.router.push('/other/route') 
    } 
} 

のために動作しませんでした:あなたが必要なのは(簡潔にするために、ルータのインスタンス化と他のコードを省略)コンポーネントにcontextTypeを宣言することです私は、browserHistory.goBack()と.goForward()でした。

関連する問題