Reactアプリで react-router v4 および material-ui を使用しています。 GridList 内でGridTile
をクリックすると、URLを変更する方法を知りたいと思いました。
私の最初のアイデアは、onTouchTap
のハンドラーを使用することでした。ただし、リダイレクトを確認できる唯一の方法は、コンポーネントRedirect
またはLink
を使用することです。これら2つのコンポーネントをレンダリングせずにURLを変更するにはどうすればよいですか?
this.context.router.Push('/foo')
を試しましたが、うまくいかないようです。
これを試して、
this.props.router.Push('/foo')
warning v4より前のバージョンで動作
そして
this.props.history.Push('/foo')
v4以降
これを使用してReact Router v4でリダイレクトします。
this.props.history.Push('/foo');
それがあなたのために働くことを望みます;)
React Router v4
これをスムーズに機能させるために必要なことがいくつかあります。
auth workflow のドキュメントページには、必要なものが非常にたくさんあります。
しかし、私は3つの問題がありました
props.history
はどこから来たのですか?Route
コンポーネント内に直接ないコンポーネントにパススルーするにはどうすればよいですかprops
が必要な場合はどうなりますか?私は最終的に使用しました:
<Route render>
を使用すると、props.history
が子に渡されます。render={routeProps => <MyComponent {...props} {routeProps} />}
を使用して、他のprops
を 「react-router-ハンドラーコンポーネントに小道具を渡す」に関する回答N.B. render
メソッドでは、Route
コンポーネントからプロップを明示的に渡す必要があります。また、パフォーマンス上の理由から、render
ではなくcomponent
を使用する必要があります(component
は毎回強制的にリロードします)。
const App = (props) => (
<Route
path="/home"
render={routeProps => <MyComponent {...props} {...routeProps}>}
/>
)
const MyComponent = (props) => (
/**
* @link https://reacttraining.com/react-router/web/example/auth-workflow
* N.B. I use `props.history` instead of `history`
*/
<button onClick={() => {
fakeAuth.signout(() => props.history.Push('/foo'))
}}>Sign out</button>
)
私が見つけた紛らわしいことの1つは、React Router v4ドキュメントのかなりの部分でMyComponent = ({ match })
を使用していることです。つまり Object destructuring です。 Route
が3つのプロップ、match
、location
、およびhistory
を渡すことを理解してください
ここでの他の答えのいくつかは、すべてがJavaScriptクラスを介して行われると仮定していると思います。
次に例を示します。また、props
を渡す必要がない場合は、component
を使用できます。
class App extends React.Component {
render () {
<Route
path="/home"
component={MyComponent}
/>
}
}
class MyComponent extends React.Component {
render () {
/**
* @link https://reacttraining.com/react-router/web/example/auth-workflow
* N.B. I use `props.history` instead of `history`
*/
<button onClick={() => {
this.fakeAuth.signout(() => this.props.history.Push('/foo'))
}}>Sign out</button>
}
}
これは私が同様のことをした方法です。 YouTube動画のサムネイルであるタイルがあります。タイルをクリックすると、「video_id」を使用して正しいビデオをページにレンダリングする「player」ページにリダイレクトされます。
<GridTile
key={video_id}
title={video_title}
containerElement={<Link to={`/player/${video_id}`}/>}
>
ETA:申し訳ありませんが、何らかの理由でLINKまたはREDIRECTコンポーネントを使用したくないことに気づきました。たぶん私の答えは何らかの形で助けになるでしょう。 ; )