J'ai du mal à changer la vue en réaction avec le routage. Il semble que j'ai essayé tout ce que je peux google sans succès. Je souhaite uniquement afficher une liste d'utilisateurs. Un clic sur chaque utilisateur doit permettre d'accéder à une page de détails. Voici le routeur:
import React from "react";
import ReactDOM from "react-dom";
import { BrowserRouter } from 'react-router-dom';
import Users from "./components/Users";
import { Router, Route } from "react-router";
import Details from "./components/Details";
ReactDOM.render((
<BrowserRouter>
<div>
<Route path="/" component={Users} />
<Route path="/details" component={Details} />
</div>
</BrowserRouter>
), document.getElementById('app'))
Lorsque j'utilise l'URL/les détails, mon navigateur accède à cette URL, mais ne modifie pas la vue. Toute autre route jette 404, donc il semble reconnaître la route mais pas la mettre à jour.
Vous devez spécifier l'attribut exact
pour votre indexRoute, sinon pour même /details
route il va toujours correspondre avec /
. Essayez également d'importer Route
de react-router-dom
import React from "react";
import ReactDOM from "react-dom";
import { BrowserRouter, Route } from 'react-router-dom';
import Users from "./components/Users";
import Details from "./components/Details";
ReactDOM.render((
<BrowserRouter>
<div>
<Route exact path="/" component={Users} />
<Route path="/details" component={Details} />
</div>
</BrowserRouter>
), document.getElementById('app'))
MISE À JOUR:
Une autre chose à faire est d’attacher vos utilisateurs du composant avec withRouter
. Vous ne devez utiliser withRouter
que lorsque votre composant ne reçoit pas le Router props
,
Cela peut arriver dans les cas où votre composant est un enfant imbriqué d'un composant rendu par le routeur ou si vous n'avez pas t lui a transmis les accessoires du routeur ou lorsque le composant n’est pas lié au routeur et est rendu en tant que composant distinct des itinéraires.
Dans Users.js, ajoutez
import {withRouter} from 'react-router';
.........
export default withRouter(Users)
Vous devez juste envelopper les composants à l'intérieur withRouter.
<Composant exact de la route = "/ mypath" composant = {withRouter (MyComponent)} />
Voici un exemple de fichier App.js:
...
import { BrowserRouter as Router, Route, Switch, withRouter } from "react-router-dom";
import Home from "./pages/Home";
import Profile from "./pages/Profile";
class App extends Component {
render() {
return (
<Router>
<Switch>
<Route exact path="/" component={withRouter(Home)} />
<Route exact path="/profile" component={withRouter(Profile)} />
</Switch>
</Router>
);
}
}
export default App;
OU
Vous pouvez aussi peut-être envelopper le composant dans withRouter avant de l'exporter, mais vous devez ensuite vous assurer de quelques autres choses.
export default withRouter(Profile)
Lors de l'utilisation de Redux, des problèmes similaires se produisaient. L'URL était mis à jour dans la barre d'adresse, mais l'application ne chargeait pas le composant respectif. J'ai pu résoudre en ajoutant withRouter à l'exportation:
import { connect } from 'react-redux'
import { withRouter } from 'react-router-dom'
export default withRouter(connect(mapStateToProps)(MyComponentName))
Vous devez ajouter exact à la route d'index et au lieu de renfermer ces composants Route par div, utilisez Switch de react-router-dom pour passer d'une route à l'autre.
import React from "react";
import ReactDOM from "react-dom";
import { Route, Switch } from 'react-router-dom';
import Users from "./components/Users";
import Details from "./components/Details";
ReactDOM.render((
<div>
<Switch>
<Route path="/" component={Users} exact/>
<Route path="/details" component={Details} />
</Switch>
</div>
), document.getElementById('app'))
J'ai eu un problème similaire avec React Routeur version 4:
En cliquant <Link />
_ composant, l'URL changerait mais les vues ne changeraient pas.
L'une des vues utilisait PureComponent
plutôt que Component
(importé de react
) et c'était la cause.
En remplaçant tous les composants de rendu de route qui utilisaient PureComponent
en Component
, mon problème a été résolu.
(Source de la résolution: https://github.com/ReactTraining/react-router/issues/4975#issuecomment-355393785 )
J'ai eu un problème similaire avec une mise en page conditionnelle:
class LayoutSwitcher extends Component {
render () {
const isLoggedIn = this.props.isLoggedIn
return (
<React.Fragment>
{ isLoggedIn
? <MainLayout {...this.props} />
: <Login />
}
</React.Fragment>
)
}
}
et réécrit les conditions comme suit:
render () {
const isLoggedIn = this.props.isLoggedIn
if (isLoggedIn) {
return <MainLayout {...this.props} />
}
return <Login />
}
Cela l'a résolu. Dans mon cas, il semble que le contexte ait été perdu.
Vous devriez vérifier ceci: https://github.com/ReactTraining/react-router/blob/master/packages/react-router/docs/guides/blocked-updates.md
Par conséquent, ce n'est certainement pas Users
ni Details
, car ils sont directement rendus par <Route>
, et le location
sera passé à props
.
Je me demande pourquoi vous avez besoin du <div>
entre <BrowserRouter>
et <Route>
? Supprimez cela et laissez-moi savoir si cela fonctionne.
J'étais confronté à un problème similaire, je suis résolu à aimer ceci s'il vous plaît jeter un oeil j'espère que cela fonctionne.
Vous devez utiliser la fonction composantWillReceiveProps dans votre composant.
cliqué sur un lien pour la première fois en appelant l'URL www.example.com/content1/ composantDidMount () est exécuté.
Maintenant, lorsque vous cliquez sur un autre lien, déclarez que www.example.com/content2/ le même composant est appelé, mais que cette propriété change et que vous pouvez accéder à cette nouvelle propriété sous composantWillReceiveProps (nextProps) que vous pouvez utiliser pour appeler l'API ou vider l'état et obtenir le nouveau Les données.
componentWillReceiveProps(nextProps){
//call your API and update state with new props
}
J'ai eu un problème similaire mais avec une structure différente. J'ai ajouté un routeur qui gérera tous les itinéraires. J'ai utilisé le composant Switch pour changer de vue. Mais en réalité, ça n'a pas été le cas. Seule l'URL a changé mais pas la vue. La raison en était le composant Link utilisé dans le composant SideBar, qui se trouvait en dehors du composant Router. (Oui, j'ai exporté SideBar avec "withRouter", non travaillé). La solution consistait donc à déplacer mon composant SideBar qui contient tous les composants Link dans mon routeur.
Le problème est dans mes linkers, ils sont en dehors de mon routeur
<div className="_wrapper">
<SideBar /> // Holds my all linkers
<Router>
<Switch>
<Route path="/" component={Home} />
<Route path="/users" component={Users} />
</Switch>
</Router>
</div>
La solution déplaçait mes linkers dans mon routeur
<div className="_wrapper">
<Router>
<SideBar /> // Holds my all linkers
<Switch>
<Route path="/" component={Home} />
<Route path="/users" component={Users} />
</Switch>
</Router>
</div>
Hmm il n'y a pas de SWITCH pour réellement changer de vue.
voici comment j'utilise un routeur pour passer de la page de landin au site principal
//index.jsx
ReactDOM.render( (<BrowserRouter><App/></BrowserRouter>), document.getElementById('root') );
//App.jsx
render()
{
return <div>
<Switch>
<Route exact path='/' component={Lander}/>
<Route path='/vadatajs' component={Vadatajs}/>
</Switch>
</div>
}
https://jsfiddle.net/Martins_Abilevs/4jko7arp/11/
ups j'ai trouvé que vous utilisez routeur différent .. désolé alors peut-être ce violon être pour vous utile
https://fiddle.jshell.net/terda12/mana88Lm/
peut-être que la solution est cachée dans la ligne pour la fonction de rendu principale ..
Router.run(routes, function(Handler) {
React.render(<Handler />, document.getElementById('container'));
});
Essaye ça,
import React from "react";
import ReactDOM from "react-dom";
import Users from "./components/Users";
import { Router, Route } from "react-router";
import Details from "./components/Details";
ReactDOM.render((
<Router>
<Route path="/" component={Wrapper} >
<IndexRoute component={Users} />
<Route path="/details" component={Details} />
</Route>
</Router>
), document.getElementById('app'))
J'ai rencontré des problèmes aussi.
https://github.com/chengjianhua/templated-operating-system
Et j'ai essayé les solutions proposées par Shubham Khatri, mais ça ne marche pas.
J'ai résolu ce problème, peut peut-être vous aider.
https://github.com/ReactTraining/react-router/blob/master/packages/react-router/docs/guides/blocked-updates.md
Selon le guide ci-dessus, lorsque vous utilisez PureComponent
ou avec des outils de gestion d'état tels que redux
, mobx
..., la mise à jour de votre itinéraire peut être bloquée. Vérifiez votre composant de route, assurez-vous que vous n'avez pas bloqué le render od votre composant.