Отправить отправку и перенаправить после обновления состояния в редуксе?

Я новичок во фронтенд-разработке. Сейчас занимаюсь проработкой проекта (простой редактор задач, без серверной части) на базе reactJs+redux. Столкнулся со следующей проблемой.

У меня есть компонент, который показывает веб-страницу по URL-адресу '/addTask/'.

const TaskCreator = ({ tasks, onAddTask }) => {

 ...

 const addTask = () => { 

 const newTask = {
   id: newId,
   header: headerInput.value,
   description: descriptionInput.value
 }

 onAddTask(newTask);
}

return(
 <div>

     ...

    <button className='btn btn-success' onClick={addTask}>Save</button>

</div>
 );
}

export default connect(
(state) => ({
tasks: state.tasks
}),
dispatch => ({

onAddTask: (task) => {
  const payload = {
    id: task.id,
    header: task.header,
    description: task.description
  };
  dispatch({ type: 'ADD_TASK', payload });
  browserHistory.push('/');
}


})
)(TaskCreator);

Когда пользователь нажимает кнопку Save. addTask звонил. После этого метод onAddTask сработал, а команда ADD_TASK задачи была отправлена. После того, как новая задача добавлена ​​в состояние, необходимо перенаправить на URL-адрес /.

Когда я вставляю оператор browserHistory.push('/'), браузер перенаправляется на URL-адрес /, но не обновляет состояние новой задачей. Если я удалю оператор browserHistory.push('/') вот так

onAddTask: (task) => {
  const payload = {
    id: task.id,
    header: task.header,
    description: task.description
  };
  dispatch({ type: 'ADD_TASK', payload });

}

Состояние обновилось, но браузер не перенаправил.

Как я могу асинхронно обновить состояние (используя диспетчеризацию) и после обновления состояния перенаправить на URL-адрес /?

Спасибо за аванс


person foxis    schedule 31.08.2017    source источник
comment
Вы пытались использовать .then после отправки действия для перенаправления ПОСЛЕ того, как ваша отправка успешно запущена?   -  person Andy Theos    schedule 31.08.2017
comment
@AndyTheos, я пытался использовать dispatch(addTaskAction(task)).then((response) => { dispatch(push('/')); });, но получил ошибку: Невозможно прочитать свойство «тогда» неопределенного.   -  person foxis    schedule 31.08.2017


Ответы (2)


Вы должны знать, как обращаться с асинхронностью (например, с цепной реакцией) в React и Redux.

Redux-saga поможет вам. https://github.com/redux-saga/redux-saga

person panghea    schedule 01.09.2017
comment
Спасибо за помощь. Я обнаружил, что моя проблема заключалась в очистке состояния избыточности после перезагрузки страницы браузера, и поэтому push('/') не работал. Когда я вручную набираю '/', состояние не ясно. Мне нужна программная команда, которая работает точно так же. - person foxis; 01.09.2017

В конце концов, я нашел обходной путь моей проблемы.

Действительно, моя проблема заключалась в очистке state во время перезагрузки браузера. И когда я пытаюсь использовать push(/), он перезагружает веб-страницу, поэтому переменная state очищается и не может видеть новые (добавленные на странице '/addTask/') задачи по URL-адресу '/'.

Чтобы избежать очистки веб-страницы, необходимо вернуться (в браузере) или вручную напечатать URL-адрес «/». Я нашел программный аналог для ручного ввода '/' URL. Для этого нужно изменить:

 <button className='btn btn-success' onClick={addTask}>Save</button>

Связать с атрибутом to этот ручной редирект:

<Link className='btn btn-success' to=`/` onClick={addTask}>Сохранить</Link>

onClick обрабатывать щелчок (сохранять новую задачу) и to перенаправлять на URL-адрес '/'.

Спасибо всем за ответы.

person foxis    schedule 02.09.2017