私はreact-router-redux
を使用しています。私のアプリのヘッダーを更新しようとしています。ルートが変更されたときはいつでも店舗からその状態を受け取ります(@@router/UPDATE_LOCATION
両方持って反応ルータのルートの場所との同期還元店
componentWillMount() {
this.props.appActions.setHeader('New Block')
}
私は手動でルート/blocks/new
にcomponentWillMount
でヘッダーを設定し、それがルート「ブロック」の子である、:)
現在、私のような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
コンポーネントがどのルートにいるかを認識させるにはどうすればよいですか?
あなただけ取得することができますあなたが '' react-router-redux''に与えたあなたの州のロケーションピックアップをピックアップすることによって、 '' mapStateToProp''であなたの関連する反応コンポーネントの小道具としての全位置状態を取得できます。いったんあなたが小道具としてそれを持っていれば、あなたが望むことをすることができるはずです。パス名を再び分割することになりますが、UPDATE_LOCATIONアクションを聞くよりもきれいに思えます。 – iamnat
これはヘルプ:https://github.com/reactjs/react-router-redux#how-do-i-access-router-state-in-a-container-component? – iamnat
@iamnat、問題は、私は 'params.id'または' query.filter'を使用していないので、私のヘッダは各ケースのパス名を '.split( '/')'しなければなりません。 – BlockChange