2016-10-11 6 views
1

私はreact-router-reduxを使用しています。私のアプリのヘッダーを更新しようとしています。ルートが変更されたときはいつでも店舗からその状態を受け取ります(@@router/UPDATE_LOCATION両方持って反応ルータのルートの場所との同期還元店

componentWillMount() { 
    this.props.appActions.setHeader('New Block') 
    } 

私は手動でルート/blocks/newcomponentWillMountでヘッダーを設定し、それがルート「ブロック」の子である、:)

現在、私のようなcomponentWillMountでアクションを派遣しています別のヘッダー、私はhistoryに戻ったときに動作しません。なぜなら、thルートblocksのeコンポーネントが再度マウントされない場合は、まだがマウントされています。したがって、ヘッダはまだNew Blockです。そして、blocksがマウントされ、かつnewがまだ子としてアンマウントされていたときに、それ以前のヘッダが何であったかは分かりません。

(そして、私はそれから起こるようです何redux-devtools、と逆時間しようとすると、私は戻ってコンポーネントが再びマウントポイントに行くたびに、それは再び行動を派遣する、とdevtoolが届きます別のディスパッチ)

ルートは:

<Route path="begin" component={PlayerBeginContainer}> 
    <IndexRoute component={PlayerOverview}/> 
     <Route path="blocks" component={PlayerBlocks}> 
     <Route path="new" component={PlayerNewBlock}/> 
     </Route> 
</Route> 
... 

私は店を同期しようとしたときはいつでもルート変更、しかし:

if (action && action.type === UPDATE_LOCATION) { 
let path = action.payload.pathname.split('/') 
// Laboriously iterate through array to figure out what the new header state should be. 
    // i.e. if (1 in split && split[1] === 'routeName') 
    // or let lastPath = path[path.length - 1] 
    // and getting parentPath would require more checking of whether it is the parent itself or not etc. 
    // appHeader = 'routeHeader' 
    return Object.assign({}, state, { appHeader: appHeader}); 
} 

特定のサブルートでトリガする必要がある場合は、これは非常に面倒です。また、ルータに定義されているものの、別のネストされた構造を作ってはいけません。

ヘッダーでは、this.props.location.pathname以外は使用できません。どのルートを使用しているか把握することはできません。また、コンポーネント自身もヘッダー自体を設定する必要はありません(つまりcomponentWillMount)。

最後のオプションはルータonEnterを使用することですが、ルータをきれいに保ちたいと思いますが、おそらく私はこれを妥協する必要があります。

ここに何か不足していますか?またはこれで私を助けることができるいくつかの種類のlib?

TL:私がどこにいるか把握するためにlocation.pathnameを分解することなく、headerコンポーネントがどのルートにいるかを認識させるにはどうすればよいですか?

+0

あなただけ取得することができますあなたが '' react-router-redux''に与えたあなたの州のロケーションピックアップをピックアップすることによって、 '' mapStateToProp''であなたの関連する反応コンポーネントの小道具としての全位置状態を取得できます。いったんあなたが小道具としてそれを持っていれば、あなたが望むことをすることができるはずです。パス名を再び分割することになりますが、UPDATE_LOCATIONアクションを聞くよりもきれいに思えます。 – iamnat

+0

これはヘルプ:https://github.com/reactjs/react-router-redux#how-do-i-access-router-state-in-a-container-component? – iamnat

+0

@iamnat、問題は、私は 'params.id'または' query.filter'を使用していないので、私のヘッダは各ケースのパス名を '.split( '/')'しなければなりません。 – BlockChange

答えて

0

これは私のコードベースのコードです。このアプリでは、私はハッシュの歴史を使用しますが、私はあなたもother history objectsと同じことをすることができると思います。

import {hashHistory} from 'react-router'; 
import {syncHistoryWithStore} from 'react-router-redux'; 

const history = syncHistoryWithStore(hashHistory, store); 
history.listen(location => { 
    // here you can do something after location is updated 
}); 

<Router history={history}> 
.... 
</Router> 

、その後、あなたのコンポーネントにあなたがstate.routingからいくつかの情報を取得することができます。

function mapStateToProps(state) { 
    return { 
    current: state.routing.locationBeforeTransitions.pathname, 
    }; 
} 

export default connect(mapStateToProps)(App); 

これを行う、いくつかのコンポーネントからのルートを変更するには:

import {push} from 'react-router-redux'; 
this.props.dispatch(push('/route')); 
関連する問題