#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
они сделают это за вас.