'react-router-dom' a une fonction de rafraîchissement ici , mais je ne sais pas comment appeler cette méthode, aussi leur document bien formaté ne prend pas la peine d'expliquer cela .
window.location.reload () ne fonctionne pas pour moi, car il efface également l'App Store. J'ai modifié certaines données, puis je dois recharger l'itinéraire avec des données mises à jour.
J'ai également lu ceci: https://github.com/ReactTraining/react-router/issues/1982https://github.com/ReactTraining/react-router/issues/224
ce fil discute exactement de ma question: https://github.com/ReactTraining/react-router/issues/4056
et je ne sais toujours pas comment le faire. Cette fonction de base ne devrait pas nécessiter trop d'efforts, mais après avoir dépensé énormément d'efforts, je ne peux pas recharger l'itinéraire actuel.
voici mon code:
@inject('store') @observer
export default class PasswordInput extends Component {
constructor (props) {
super(props)
this.setPwd = this.setPwd.bind(this)
this.submit = this.submit.bind(this)
}
componentWillMount() {
this.case = this.props.store.case
this.setState({refresh: false})
}
setPwd(e) {
// console.log(e)
this.case.pwd = e.target.value
}
submit() {
console.log(this.props.caseId)
this.setState({refresh: true})
}
render() {
return (
<Container>
<div>{this.state.refresh}</div>
{ (this.state.refresh) && <Redirect refresh={true} to={'/cases/' + this.props.caseId}></Redirect>}
<br />
<Grid columns="three">
<Grid.Row>
<Grid.Column key={2}>
<Form>
<label>Enter Password</label>
<input placeholder="empty" type="text" onChange={this.setPwd} value={this.case.pwd}></input>
<Button name="Save" color="green" size="mini"
style={{marginTop:'1em'}}
onClick={this.submit}>
Submit
</Button>
</Form>
</Grid.Column>
</Grid.Row>
</Grid>
</Container>
)
}
}
J'ai résolu ce problème en poussant un nouvel itinéraire dans l'historique, puis en remplaçant cet itinéraire par l'itinéraire actuel (ou l'itinéraire que vous souhaitez actualiser). Cela déclenchera react-router pour "recharger" l'itinéraire sans rafraîchir la page entière.
if (routesEqual && forceRefresh) {
router.Push({ pathname: "/empty" });
router.replace({ pathname: "/route-to-refresh" });
}
Le routeur React fonctionne en utilisant l'historique de votre navigateur pour naviguer sans recharger la page entière. Si vous forcez un itinéraire dans l'historique, le routeur de réaction le détectera et rechargera l'itinéraire. Il est important de remplacer l'itinéraire vide afin que votre bouton de retour ne vous amène pas à l'itinéraire vide après l'avoir enfoncé.
Selon react-router il semble que la bibliothèque de routeurs react ne supporte pas cette fonctionnalité et ne le fera probablement jamais, donc vous devez forcer le rafraîchissement de manière hacky.
J'ai le même problème et je n'ai aucune idée de la façon dont le rafraîchissement se produit. Ma solution est de suivre deux étapes.
Le DOM se rendra ensuite avec votre itinéraire.
Voici ma solution avec "Redirect" de react-router-dom:
<Route key={props.notifications.key} path={props.notifications.path} exact render={() => <Redirect to={props.notifications.path + "/update"}/>}/>
<Route key={props.notifications.key + "/update"} path={props.notifications.path + "/update"} exact render={() => <props.notifications.component apis={props.notifications.apis}/>}/>
Seulement cela a fonctionné pour moi:
reloadOrNavigate = () => {
const { history, location } = this.props;
if (location.pathname === '/dashboard') {
history.replace(`/reload`);
setTimeout(() => {
history.replace(`/dashboard`);
});
} else {
history.Push('/dashboard');
}
};
La réponse est similaire à la précédente mais j'avais besoin d'ajouter la fonction setTimeout
pour la faire fonctionner. Dans mon cas, j'ai dû actualiser l'URL actuelle en cliquant sur le logo si je suis sur le /dashboard
page. Tout d'abord, il passe à la route supplémentaire /reload
(à vous de décider), puis revient immédiatement. La page devient blanche pendant moins d'une seconde et apparaît avec les données rechargées. Aucun rechargement dans le navigateur ne se produit, c'est toujours du SPA qui est bon.
Vous pouvez utiliser ce petit truc. Poussez un nouveau chemin dans l'histoire comme history.Push ('/ temp') et appeler immédiatement le history.goBack ()
Voici l'exemple:
Créez un historique et transmettez-le au routeur:
import { createBrowserHistory } from "history";
export const appHistory = createBrowserHistory();
<Router history={appHistory}>
<Route exact path="/" component={Home} />
<Route path="/about" component={About} />
</Router>
puis quelque part dans votre application, modifiez l'historique:
appHistory.Push('/temp');
appHistory.goBack();
De cette façon, l'itinéraire "restera" le même et sera rafraîchi.