2017-01-05 1 views
0

La partie formSubmit de ma réaction composante de forme est comme ci-dessous:requête POST dans une réaction/environnement redux - comment se retourne `_id` pour rediriger

handleFormSubmission = (e) => { 
    if (e) e.preventDefault() 
    const { showErrors, validationErrors, ...formData } = this.state 
    const { submitForm, router } = this.props 
    const errors = run(formData, fieldValidations) 

    let newState = update(this.state, { 
    validationErrors: { $set: errors } 
    }) 

    this.setState(newState,() => { 
    if (isEmpty(this.state.validationErrors)) { 
    // submitForm is an dispatches a redux action 
    submitForm(formData) 

    if (formData._id) { 
     // the below is good on a PUT request 
     router.push(`/accounts/lodgedocket/${formData._id}`) 
    } else router.push(`/accounts/lodge`) 
    // with the else above I have no _id to redirect to 
    } else this.matterno.focus() 
}) 

submitForm est une dépêche une action Redux, qui a ensuite est alors n take par Redux-saga

const { payload } = yield take(constants.SUBMIT_LODGE_FORM) 

le problème est que je ne sais pas comment prendre la nouvelle _id après la requête POST a terminé avec succès. La redirection d'URL doit-elle avoir lieu dans le fichier d'action ou dans le composant?

Peut-être que c'est le cas que je devrais push l'url de l'action, mais je ne peux pas comprendre cela non plus. J'utilise reactjs, redux, react-redux et react-redux-router.

merci

Répondre

1

Vous devriez ajouter un peu plus de code. De toute façon, ça ne ressemble pas à un reflex vraiment idiomatique.

Si vous faites des appels Ajax vous devriez avoir un middleware, comme redux-thunk. Il enverra une action dans le rappel Ajax. Cette action contiendra la réponse du serveur et sera traitée par un réducteur. Vous obtiendrez un nouvel état avec l'ID et ainsi un nouveau rendu de composant l'obtiendra dans les accessoires.

MISE À JOUR:

Puisque vous utilisez middleware Redux-saga, vous pouvez simplement exécuter un appel au créateur d'action-réaction routeur Redux dans la saga de rappel Ajax. Doc ici: https://github.com/reactjs/react-router-redux#what-if-i-want-to-issue-navigation-events-via-redux-actions

Assurez-vous d'importer browserHistory de la question était vraiment réagir-routeur pour le middleware routeur

import { browserHistory } from 'react-router' 
const middleware = routerMiddleware(browserHistory) 
+0

Merci pour vos commentaires. la requête xhr est envoyée via redux-saga. C'est où rediriger avec le nouveau _id que je ne peux pas comprendre. – Joe

+0

Vous pouvez passer l'action du routeur redux dans la charge SUBMIT_LODGE_FORM et la distribuer à partir de la saga après la réponse d'appel Ajax. –

+1

Ou envoyez push () directement à partir de la saga. –