2016-09-06 4 views
3

私が制御されていると私は(リアクト-ルータ)のためにそれらを使用していた、素材-UIのタブを使用しています。このようなリンク:React-routerのブラウザの戻るボタンを代行/処理しますか?

<Tab value={0} label="dashboard" containerElement={<Link to="/dashboard/home"/>}/> 
    <Tab value={1} label="users" containerElement={<Link to="/dashboard/users"/>} /> 
    <Tab value={2} label="data" containerElement={<Link to="/dashboard/data"/>} /> 

私はcurrenlty来場ダッシュボード/データのだと私は、ブラウザのをクリックした場合戻るボタン ハイライトされたタブはダッシュボード/データ(値= 2)に残ります(ダッシュボード/ユーザーには)ブラウザの戻るボタンが押されたら?

私は、この発見しました:

window.onpopstate = this.onBackButtonEvent; 

をしかし、この状態が

ここ

答えて

8

は、私はそれをやってしまった方法です(だけでなく、バ​​ックボタンイベントに)変更されるたびに呼び出されます。

componentDidMount() { 
    this._isMounted = true; 
    window.onpopstate =()=> { 
     if(this._isMounted) { 
     const { hash } = location; 
     if(hash.indexOf('home')>-1 && this.state.value!==0) 
      this.setState({value: 0}) 
     if(hash.indexOf('users')>-1 && this.state.value!==1) 
      this.setState({value: 1}) 
     if(hash.indexOf('data')>-1 && this.state.value!==2) 
      this.setState({value: 2}) 
     } 
    } 
    } 

支援するためのおかげでみんなが笑

+1

haha​​ fantastic!ありがとう、とにかく私を助けた! –

2

これは少し古い問題であり、あなたはおそらくalreadましたあなたの答えが得られましたが、これが必要な私のような人にとって、私はこの答えを残しています。反応-ルータを使用して

は、次のような仕事が簡単になる:

import { browserHistory } from 'react-router'; 

componentDidMount() { 
    super.componentDidMount(); 

    this.onScrollNearBottom(this.scrollToLoad); 

    this.backListener = browserHistory.listen(location => { 
     if (location.action === "POP") { 
     // Do your stuff 
     } 
    }); 
    } 

componentWillUnmount() { 
    super.componentWillUnmount(); 
    // Unbind listener 
    this.backListener(); 
} 
+0

は私のためには機能しません。あなたが '' 'browserHistory.goBack()' ''のようなものを使用するために、リア・ボタンのアクションを処理するときには、[email protected]を使用して、location.actionはブラウザの戻るボタン – loopmode

+0

@loopmodeをクリックしても、 ?? –

+2

私は他の場所でそれを発見しました。同僚は手動で履歴に干渉していました。 if(nextLocation.action === 'POP' && getStepIndex(nextLocation.pathname)=== 0 { browserHistory.push {パス名: '$ {getPathForIndex(0)}'}); falseを返します。 } フォワードボタンを利用できないようにするには 'POPならプッシュ ' あなたの答えは正しいままです - 私の側のユーザーエラー:) – loopmode

2

リアクトルーターAPIのバージョン3.xは、イベントはに登録する前に、「戻る」ボタンのイベントを公開するために使用することができますa set of utilitiesを持っていますブラウザの履歴。最初にコンポーネントをwithRouter() higher-order componentにラップする必要があります。有効なpathプロパティとコールバック関数を持つrouteオブジェクトを受け入れるsetRouteLeaveHook()関数を使用できます。

import {Component} from 'react'; 
import {withRouter} from 'react-router'; 

class Foo extends Component { 
    componentDidMount() { 
    this.props.router.setRouteLeaveHook(this.props.route, this.routerWillLeave); 
    } 

    routerWillLeave(nextState) { // return false to block navigation, true to allow 
    if (nextState.action === 'POP') { 
     // handle "Back" button clicks here 
    } 
    } 
} 

export default withRouter(Foo); 
関連する問題