React Router v4
Jest kilka rzeczy, które mi potrzebne, aby dostać tę pracę bez zakłóceń.
Strona doc na auth workflow ma dość dużo tego, co jest wymagane.
Jednak miałem trzy kwestie
- Skąd
props.history
pochodzi?
- Jak przekazać to do mojego komponentu, który nie jest bezpośrednio wewnątrz komponentu
Route
- Co jeśli chcę inny
props
?
skończyło się przy użyciu:
- opcję 2 z an answer on 'Programmatically navigate using react router' - czyli użycie
<Route render>
który dostaje props.history
które następnie mogą być przekazywane do dzieci.
- Użyj
render={routeProps => <MyComponent {...props} {routeProps} />}
połączyć z inną props
this answer on 'react-router - pass props to handler component'
nb Metodą render
trzeba jawnie przejść przez rekwizyty ze składnika Route
. Również z powodów wydajnościowych chcesz używać render
, a nie component
(wymuszenie ponownego załadowania za każdym razem).
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>
)
Jedną z dziwnych rzeczy znalazłem jest to, że sporo z React docs Router v4 używają MyComponent = ({ match })
tjObject destructuring, co oznaczało, że początkowo nie zdawałem sobie sprawy, że Route
przechodzi w dół trzy rekwizyty, match
, location
i history
myślę, że niektóre z pozostałych odpowiedzi tutaj zakładamy, że wszystko odbywa się za pośrednictwem klas JavaScript.
Oto przykład, plus, jeśli nie trzeba przechodzić przez dowolny props
można po prostu użyć 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 Metoda jest teraz przekazywana jako rekwizyty w kontekście kontekstu. Ale wciąż mam wiele problemów z tymi materiałami w produkcji – CESCO
Oznacza to, że muszę przekazać elementy potomne obiektowi routera, prawda? – Alex
nie, router już tam będzie, nie trzeba przechodzić –