Как получить данные из Redux в действиях? - PullRequest
0 голосов
/ 13 мая 2018

Я пытаюсь понять, есть ли способ вызвать данные из избыточного числа в действии.

Вот мое действие, в котором я хочу использовать user_id и токен, которые хранятся в state.auth.user_id и state.auth.token

jobsActions.js

export function createJob(title, company, avatar, shortDescription, description, address, postcode, city, jobType, payment, price, duration, postDate ) {
  return function (dispatch) {
      return axios.post(JOBS_URL(user_id), { title, company, avatar, shortDescription, description, address, postcode, city, jobType, payment, price, duration, postDate }, {
        headers: { authorization: token }
      }).then((response) => {
        dispatch(addJob(response.data.job));
        // console.log(response.data.job)
      }).catch((err) => {
        // console.log(err);
        dispatch(addAlert("Couldn't create job."));
      });
  };
}

authAction.js

export function loginUser(email, password) {
  return function (dispatch) {
    return axios.post(SIGNIN_URL, { email, password }).then((response) => {
      var { user_id, token } = response.data;
      dispatch(authUser(user_id, token));
      onSignIn(user_id);
    }).catch((error) => {
      dispatch(addAlert("Could not log in."));
    });
  };
}

export const authUser = (user_id, token) => {
  return {
    type: 'AUTH_USER',
    user_id,
    token
  }
}

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

У меня раньше была такая же проблема, и я создал энхансер, чтобы помочь справиться с ней:

перевождь название-редукторы

Это позволяет получить доступ к состоянию из любого места в вашем коде и связать состояния редуктора друг с другом. Например, используя enchancer, ваш редуктор заданий может иметь внешнее состояние только для чтения, называемое токен, связанное с токеном вашего редуктора аутентификации:

linkState(jobReducer.token, authReducer.token)

Позже вы можете получить доступ к токену из вашего действия

createJob() {
   ...
   var token = getState(jobReducer.token)
}

Преимущество этого в том, что вашему модулю заданий не важно, откуда взялся токен. Вы можете легко поменять методы аутентификации из разных модулей:

swith(loginType) {
    case USERNAME_AND_PASSWORD:
       linkState(jobReducer.token, authReducer.token)
    break;
    case FACEBOOK_LOGIN:
       linkState(jobReducer.token, facebookReducer.token)
    break;
    case OAUTH:
       linkState(jobReducer.token, oauthReducer.token)
    break
}
0 голосов
/ 13 мая 2018

Да.Вы используете redux-thunk, а функции thunk уже получают getState в качестве второго аргумента.Просто измените свои функции на:

export function createJob(title, company, avatar, shortDescription, description, address, postcode, city, jobType, payment, price, duration, postDate ) {
  return function (dispatch, getState) {
      const state = getState();
      const {user_id, token} = state.auth;

      return axios.post(JOBS_URL(user_id), { title, company, avatar, shortDescription, description, address, postcode, city, jobType, payment, price, duration, postDate }, {
        headers: { authorization: token }
      }).then((response) => {
        dispatch(addJob(response.data.job));
        // console.log(response.data.job)
      }).catch((err) => {
        // console.log(err);
        dispatch(addAlert("Couldn't create job."));
      });
  };
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...