180 votes

Comment mettre à jour de manière programmatique les paramètres de la requête dans react-router ?

Je n'arrive pas à trouver comment mettre à jour les paramètres de requête avec react-router sans utiliser <Link/> . hashHistory.push(url) ne semble pas enregistrer les paramètres de requête, et il ne semble pas que vous puissiez passer un objet de requête ou quoi que ce soit comme deuxième argument.

Comment changer l'url de /shop/Clothes/dresses à /shop/Clothes/dresses?color=blue dans react-router sans utiliser <Link> ?

Et c'est un onChange La fonction d'écoute est vraiment le seul moyen d'écouter les changements de requête ? Pourquoi les modifications de requêtes ne sont-elles pas automatiquement détectées et traitées comme le sont les modifications de paramètres ?

0 votes

Vous devez utiliser le singleton de l'historique, comme indiqué dans la section cette question

228voto

John F. Points 480

Au sein de la push méthode de hashHistory vous pouvez spécifier vos paramètres de requête. Par exemple,

history.push({
  pathname: '/dresses',
  search: '?color=blue'
})

ou

history.push('/dresses?color=blue')

Vous pouvez consulter cette dépôt pour des exemples supplémentaires sur l'utilisation de history

2 votes

Génial ! Est-il possible de passer un objet de requête {color : blue, size : 10} au lieu d'une chaîne de caractères ?

1 votes

@claireablani Actuellement, je ne pense pas que cela soit supporté.

0 votes

Ok - savez-vous s'il est habituel de juste stringifier l'objet de la requête avant d'appeler hashHistory push ?

47voto

Exemple utilisant react-router v4, redux-thunk et le paquet react-router-redux(5.0.0-alpha.6).

Lorsque l'utilisateur utilise la fonction de recherche, je veux qu'il puisse envoyer le lien url de la même requête à un collègue.

import { push } from 'react-router-redux';
import qs from 'query-string';

export const search = () => (dispatch) => {
    const query = { firstName: 'John', lastName: 'Doe' };

    //API call to retrieve records
    //...

    const searchString = qs.stringify(query);

    dispatch(push({
        search: searchString
    }))
}

16 votes

react-router-redux est déprécié

0 votes

Je pense que cela doit maintenant être fait en rendant la <Redirect> tag, lien vers page de documentation

2 votes

Vous pouvez simplement envelopper votre composant dans withReducer HOC qui vous donnera le history prop. Et puis vous pouvez exécuter history.push({ search: querystring } .

43voto

spedy Points 393

La réponse de Jean est correcte. Lorsque je traite des paramètres, j'ai également besoin de URLSearchParams interface :

this.props.history.push({
    pathname: '/client',
    search: "?" + new URLSearchParams({clientId: clientId}).toString()
})

Vous pouvez aussi avoir besoin d'envelopper votre composant avec un withRouter décorateur, par exemple. export default withRouter(YourComponent); .

3 votes

withRouter est un HOC, pas un décorateur

0 votes

Pas besoin d'utiliser .toString() ici, parce que le fait d'ajouter le point d'interrogation le contraindra automatiquement.

3voto

Design by Adrian Points 689

De DimitriDushkin sur GitHub :

import { browserHistory } from 'react-router';

/**
 * @param {Object} query
 */
export const addQuery = (query) => {
  const location = Object.assign({}, browserHistory.getCurrentLocation());

  Object.assign(location.query, query);
  // or simple replace location.query if you want to completely change params

  browserHistory.push(location);
};

/**
 * @param {...String} queryNames
 */
export const removeQuery = (...queryNames) => {
  const location = Object.assign({}, browserHistory.getCurrentLocation());
  queryNames.forEach(q => delete location.query[q]);
  browserHistory.push(location);
};

ou

import { withRouter } from 'react-router';
import { addQuery, removeQuery } from '../../utils/utils-router';

function SomeComponent({ location }) {
  return <div style={{ backgroundColor: location.query.paintRed ? '#f00' : '#fff' }}>
    <button onClick={ () => addQuery({ paintRed: 1 })}>Paint red</button>
    <button onClick={ () => removeQuery('paintRed')}>Paint white</button>
  </div>;
}

export default withRouter(SomeComponent);

0 votes

Ceci est pour react-router v3 et ne fonctionnera pas avec les versions suivantes

3voto

Balasubramani M Points 538

Utilisation de requête-chaîne est le module recommandé lorsque vous avez besoin d'un module qui analyse facilement votre chaîne de requête.

http://localhost:3000?token=xxx-xxx-xxx

componentWillMount() {
    var query = queryString.parse(this.props.location.search);
    if (query.token) {
        window.localStorage.setItem("jwt", query.token);
        store.dispatch(push("/"));
    }
}

Ici, je redirige vers mon client à partir du serveur Node.js après une authentification Google-Passport réussie, qui est redirigée avec le jeton comme paramètre de requête.

Je l'analyse avec le module query-string, je le sauvegarde et je mets à jour les paramètres de la requête dans l'url avec push from react-router-redux .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X