Redux - возвращает информацию о функции вызова для обновления реквизита / состояния - PullRequest
1 голос
/ 11 октября 2019

Я являюсь промежуточным разработчиком в React, и я хотел бы получить совет относительно наилучшей практики обновления реквизитов с помощью SET_STATE в редукторе.

Это моя файловая номенклатура:

redux/
├── events/
│   ├── reducer.js
│   ├── actions.js
│   ├── sagas.js
├── services/
│   ├── events.js

Когда я отправляю действие в sagas.js, функция action вызывает другую функцию в events.js, которая вызывает API. Я хотел бы обновлять реквизиты для предотвращения перезагрузки моей веб-страницы после каждой модификации.

Теперь, когда я вызываю функцию в events.js с помощью yield yield (...) [в sagas.js], явсегда получаю неопределенный , пока я возвращаю данные ответа API.

Я хотел бы получить эту информацию для вызова моего действия SET_STATE в моем редуктореобновить его без ретранслятора

Это мои файлы:

reducer.js

import actions from './actions'

const initialState = {
  uniqueEvent: {},
  logistic: []
}

export default function eventsReducer(state = initialState, action) {
  switch (action.type) {
    case actions.SET_STATE:
    {
      return { ...state, ...action.payload }
    }
    default:
      return state
  }
}

действия.js

const actions = {
  SET_STATE: 'events/SET_STATE',
  UPDATE_EVENT: 'events/UPDATE_EVENT',
  ADD_EVENT_LOGISTIC: 'events/ADD_EVENT_LOGISTIC',
}

export default actions

sagas.js

import { all, takeEvery, put, call } from 'redux-saga/effects'
import { pdateEvent, addEventLogistic } from 'services/events'
import actions from './actions'


export function* UPDATE_EVENT({ payload: { event } }) {
  console.log(JSON.stringify(`UPDATE_EVENT`))

  const upEvent = yield call(updateEvent, event)
  if(upEvent){
    yield put({
        type: 'events/SET_STATE',
        payload: {
          uniqueEvent: upEvent,
        },
      })
  } else {
     console.log(JSON.stringify('REDUX UPDATE_EVENT NOT DONE'))
   }
}

export function* ADD_EVENT_LOGISTIC({ payload: { activist, information, eventId } }) {
  console.log(JSON.stringify(`ADD_EVENT_LOGISTIC`))

  const logisticToAdd = {user: activist, description: information, event: eventId}

  const eventLogistic = yield call(addEventLogistic, logisticToAdd)
  if (eventLogistic) {
    yield put({
        type: 'events/SET_STATE',
        payload: {
          logistic: eventLogistic,
        },
      })
  } else {
    console.log(JSON.stringify('REDUX EVENT LOGISTIC NOT DONE'))
  }
}

export default function* rootSaga() {
  yield all([
    takeEvery(actions.UPDATE_EVENT, UPDATE_EVENT),
    takeEvery(actions.ADD_EVENT_LOGISTIC,ADD_EVENT_LOGISTIC),
  ])
}

И мои events.js (вызов API):

import { notification } from 'antd'

const axios = require('axios')

export function updateEvent(value) {
  axios.put(`http://api.xxxx.xx/xx/xxxx/events/event/${value.id}/`, value, {
    headers: {
      Authorization: `Token ${localStorage.getItem('auth_token')}`,
    },
  })
    .then(response => {
      return response.data
    })
    .catch(function(error) {
      notification.error({
        message: error.code,
        description: error.message,
      })
    })
}

export function addEventLogistic(value) {
  axios.post(`http://api.xxxx.xx/xx/xxxx/events/logistic/`, value, {
    headers: {
      Authorization: `Token ${localStorage.getItem('auth_token')}`,
    },
  })
    .then(response => {
      return response.data
    })
    .catch(function(error) {
      notification.error({
         message: error.code,
         description: error.message,
      })
    })
}

export default async function defaulFunction() {
  return true
}

Мне бы хотелось, чтобы функция addEventLogstic () в events.js возвращала JSON из запроса (я провел несколько тестов и у меня получилось), но в sagas.js переменная, объявленная с помощью yield yield (...) не получает никакого значения (тогда как я хотел бы JSON API).

У вас есть какие-либомысли? Большое спасибоза вашу драгоценную помощь

1 Ответ

2 голосов
/ 11 октября 2019

Я подозреваю, что ваша функция updateEvent и addEventLogistic ничего не возвращает. Добавьте оператор возврата, чтобы они сделали:

export function updateEvent(value) {
  //added return statement here
  return axios.put(`http://api.xxxx.xx/xx/xxxx/events/event/${value.id}/`, value, {
    headers: {
      Authorization: `Token ${localStorage.getItem('auth_token')}`,
    },
  })
    .then(response => {
      return response.data
    })
    .catch(function(error) {
      notification.error({
        message: error.code,
        description: error.message,
      })
    })
}
...