2017-01-05 9 views
0

formSubmit части моей среагировать формы компоненты, как показано ниже:POST в среагировать/Redux среды - как получить вернулся `_id` перенаправлять

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 является рассылает действие Redux, который затем затем take п от Redux-саге

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

проблема заключается в том, что я не знаю, как поднять на новый _id после запроса POST успешно завершен. Следует ли перенаправить URL-адрес в файл действия или в компонент?

Возможно, это так, что я должен указать push url из действия, но я тоже не могу понять это.

Я использую реакторы, редукты, реагирующие-редукты и реакционно-редукционный маршрутизатор.

спасибо

ответ

1

Вы должны добавить еще код. Во всяком случае, это не похоже на действительно идиоматическое сокращение.

Если вы выполняете Ajax-звонки, у вас должно быть промежуточное ПО, например, redux-thunk. Он отправит действие в обратном вызове Ajax. Это действие будет содержать ответ сервера и обрабатываться редуктором. Вы получите новое состояние с идентификатором, и, таким образом, новый компонентный рендеринг получит его в реквизитах.

UPDATE:

Поскольку вы используете перевождь-сага Middleware, вы можете просто выполнить вызов на реакцию маршрутизаторами-перевождь действия создателя в саге Ajax обратного вызова. Doc здесь: https://github.com/reactjs/react-router-redux#what-if-i-want-to-issue-navigation-events-via-redux-actions

Обязательно импортировать browserHistory из среагировать-маршрутизатор для маршрутизатора промежуточного

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

спасибо за ваши комментарии. запрос xhr отправляется через саунд-релиз. Здесь можно перенаправить с возвращенным новым _id, который я не могу понять. – Joe

+0

Вы можете передать действие маршрутизатора redux в полезной нагрузке SUBMIT_LODGE_FORM и отправить из саги после ответа на вызов Ajax. –

+1

Или отправьте push (<ваш маршрут с id>) непосредственно из саги. –

0

вопрос действительно был откуда направить действие меняющегося URL-адрес. Ответ пришел от ответа Джорджио Bozio и затем:

  1. https://github.com/redux-saga/redux-saga/issues/79#issuecomment-215665308 - быть три способа изменить URL-адрес.

  2. специально, я использовал import { push } from 'react-router-redux'

  3. , но у меня была проблема с тем, как настроить промежуточное программное обеспечение и эта связь решается для меня: https://github.com/reactjs/react-router-redux/issues/366#issuecomment-212044390