Как управлять логическим значением в redux?

#javascript #reactjs #redux #react-redux #switch-statement

#javascript #reactjs #redux #реагировать-redux #оператор переключения

Вопрос:

Похоже, я не могу отправлять логические значения. Может кто-нибудь сказать мне, что я делаю не так?

Это мое состояние:

 const initState = {
  allSongs: songData(),
  currentSong: { ...songData()[0] },
  isPlaying: false,
};
 

Как я могу управлять isPlaying с помощью функции отправки?Когда я отправляю его таким образом, он не работает:

       dispatch(playAndPause(true));
 

Это мой создатель действий:

 export const playAndPause = (isPlayingBool) => (dispatch) => {
  return {
    type: PLAY_AND_PAUSE,
    payload: {
      isPlaying: isPlayingBool,
    },
  };
};
 

Редуктор:

 case PLAY_AND_PAUSE:
      return {
        ...state,
        isPlaying: action.payload.isPlaying,
      };
 

Комментарии:

1. Можете ли вы показать нам код, в котором вы меняете состояние?

2. @SinanYaman Да, я отредактировал сообщение, чтобы включить и это.

Ответ №1:

То, что у вас есть playAndPause , — это не обычный создатель действий, а создатель действия thunk. Эта внутренняя функция будет вызвана и позволит вам выполнять асинхронные действия перед фактической отправкой. Если бы вы хотели пойти по этому пути, правильным способом было бы

 export const playAndPause = (isPlayingBool) => (dispatch) => {
  // do some stuff here
  dispatch({
    type: PLAY_AND_PAUSE,
    payload: {
      isPlaying: isPlayingBool,
    },
  });
};
 

Но на самом деле, вам, вероятно, нужен обычный создатель действий:

 export const playAndPause = (isPlayingBool) => ({
  type: PLAY_AND_PAUSE,
  payload: {
    isPlaying: isPlayingBool,
  },
});
 

Также, пожалуйста, обратите внимание, что вы пишете здесь довольно старый стиль redux. Если вы изучаете redux прямо сейчас, пожалуйста, прекратите любое руководство, которому вы следуете, и вместо этого следуйте официальным руководствам.
В конце концов, вы напишете, возможно, 1/4 кода, который вы будете писать, с текущим стилем, который вы используете.

Например, современный redux не требует от вас написания каких-либо создателей действий или констант типа действия. В нем также нет редукторов switch … case или неизменяемой логики в редукторах.

Комментарии:

1. Спасибо, что сообщили мне о новом стиле. Я нашел его и преобразовал свой файл redux в этот стиль. Но реализация thunk немного сбивает с толку. Можете ли вы показать мне, как бы вы написали создатель действия thunk в новом стиле? Должен ли я следовать этому руководству, чтобы добраться до этого? redux-toolkit.js.org/api/createAsyncThunk

2. Вы все равно можете использовать обычные thunks, что вполне допустимо. Если ваши thunks отправляют какое-то started действие в начале и success error действие or в конце, createAsyncThunk они сделают это за вас.