Реагировать маршрутизатор v4
Там есть несколько вещей, которые мне нужно, чтобы получить эту работу гладко.
Документ doc на auth workflow имеет довольно много необходимого.
Однако у меня было три проблемы
- Где делает
props.history
взялось?
- Как передать его до моего компонента, который не является непосредственно внутри
Route
компонента
- Что делать, если я хочу другой
props
?
Я закончил с использованием:
- вариант 2 из an answer on 'Programmatically navigate using react router' - т.е. использовать
<Route render>
, который получает вас props.history
, которые затем могут быть переданы детям.
- Используйте
render={routeProps => <MyComponent {...props} {routeProps} />}
объединить другие props
из this answer on 'react-router - pass props to handler component'
нотабене С помощью метода 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>
)
Одна из запутанных вещей, которые я нашел, что в целом ряде из React маршрутизатора v4 документов они используют MyComponent = ({ match })
т.е.Object destructuring, что означало изначально я не понял, что Route
проходит вниз три реквизита, 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>
}
}
@Alex Метод теперь передается в виде реквизита через контекст. Но у меня все еще есть проблема с этим материалом в производстве. – CESCO
Итак, это означает, что мне нужно передать дочерние компоненты самому объекту маршрутизатора, верно? – Alex
нет, маршрутизатор будет там уже, не нужно пропускать –