2017-08-01 29 views
1

私はreact-router v4を使用しています。 <Link>コンポーネントをクリックすると、ルートがただちに変更されることがわかります。私はデータをフェッチする前に現在のルートに留まり、ルートを切り替えずにデータをフェッチします。 react-router v3にはonEnterフックがありますが、現在はreact-router v4になっていますが、廃止予定です。では、<Link>コンポーネントをクリックした後、ルートが変更される直前にデータを取得するにはどうすればよいですか?反応ルータv4のonEnter小道

例:

それはです:Aで - - >Bのためのデータをフェッチする - >B

ないレンダリング><Link> to Bでクリックしてください:Aで - ><Link> to Bでクリック - >Route Bをレンダリング - >Bのデータを取得する - >再レンダリングB

答えて

3

react-router v4には、から小道具が

react-router v3に既存のonEnterの機能を置き換えるために、あなたがreact-router v4でこれの等価が

<Route exact path="/" render= {() => {getData(); return <Home data={this.state.data}/>}} /> 

しかし提案された方法だろうreact-router v3

<Route path="/" component={Home} onEnter={getData} /> 

でのようなルートを持っていると仮定componentlifecycleメソッドを使用することです。 Github discussionから

We have no lifecycle hooks that receive props on initial render. 

私たちは、もはや "ルートのライフサイクル" を持っていません。代わりに<Match> のコンポーネントは実際のコンポーネント(s のような擬似コンポーネントではない)であるため、Reactのライフサイクルに参加することになります。つまり、 はcomponentWillMountを使用できます。

だから、提案された解決策の一つは、次のとおりです。

V4は、すべてのコンポーネントだけであることのルートについてです。これは、ライフサイクルメソッド を利用することを意味します。

componentWillMount() { // or componentDidMount 
    fetch(this.props.match.params.id) 
} 

componentWillReceiveProps(nextProps) { // or componentDidUpdate 
    if (nextProps.match.params.id !== this.props.match.params.id) { 
    fetch(nextProps.match.params.id) 
    } 
} 
+0

私はonEnterを置き換えるつもりはありませんでした。たとえば、コードでgetData()は1秒以上かかることがあります。ただし、データが返される前にが返されます。あなたは{Home}にいて、データを待っています。私がしたいのは、をレンダリングしてデータを取得し、次に{Home}に切り替えることです。 –

+1

@ONIAKI、残念ながらv4にはそのような機能はありません。 Githubの議論にはいくつかのアプローチがあります。データを取得するためのライフサイクルフックを使用することをお勧めします。 –

+0

それは静かで混乱します。私は彼らの哲学を理解していますが、ユーザーと対話するためのいくつかの方法をブロックしています。 Em ...私はvue.jsを使用しており、vue-routerは私が言うことを正確に行うことができます。たぶん、私は良い解決策を見つける前に、反応ルータv3に切り替えることを検討する必要があります。 –

関連する問題