#javascript #redux #ngrx
#javascript #redux #ngrx
Вопрос:
Я работаю с NgRx для реализации Redux. Я пытаюсь понять шаблон redux. Зачем нам нужно отправлять действие? Почему мы не можем просто вызвать userReducer
функцию непосредственно из сервисного кода ниже, передавая правильное действие? Спасибо!
Сервисный код:
this.store.dispatch(new userActions.SetName({"bob"})
user.action.ts:
readonly type = UserActionTypes.SET_NAME
constructor(public payload: string) { }
}
user.reducer.ts:
export function userReducer(
state: UserState = BEGINNING_STATE
action: UserActions
)
switch(action.type) {
case UserActionTypes.SET_NAME:
return {
...state,
Name: state.Name
}
}
Комментарии:
1. похоже, пришло время предпринять redux.js.org/tutorials/fundamentals/part-1-overview или даже redux.js.org/tutorials/essentials/part-1-overview-concepts потому что официальные учебные пособия очень хорошо написаны и охватывают все, что вы хотите знать о redux.
2. Как автор этих руководств: да, я согласен, и я действительно рад видеть, что люди рекомендуют их 🙂
3. Спасибо Майку и Марку. Статьи помогли мне лучше понять, что такое redux. Тем не менее, я все еще не понимаю, «зачем» нам нужны действия, а не просто прямой вызов редуктора
Ответ №1:
Вы отделяете «указать, что что-то произошло» (действие) от «сделать это, если произошло X» (редуктор / промежуточное программное обеспечение). Если вы вызываете reducer напрямую, у вас нет такого разделения, поэтому, если вы реорганизуете кнопку, которая отправляет приращение на кнопку, которая выполняет один конкретный редуктор, вы просто изменили код на кнопку, которая при нажатии указывает ПРИРАЩЕНИЕ, на кнопку, которая при нажатии изменяет состояние определенным образом. Есть много преимуществ, которые это разделение может иметь в больших сложных приложениях.
У Facebook было большое приложение, над которым работали несколько человек в разных точках мира (facebook chat), и в этом приложении есть несколько компонентов, которые должны указывать на то, что что-то произошло, но вместо этого напрямую меняют состояние или вызывают побочные эффекты, которые нарушают код других людей. Итак, они придумали шаблон, который исправил это. Теперь разработчики могут создавать компоненты, которые будут указывать только на то, что что-то произошло, чтобы другие разработчики могли написать код, который должен быть выполнен, когда происходят определенные вещи.
Инструменты redux devtools сохраняют действия и результирующее состояние, чтобы упростить отладку. Если что-то не работает, первое, что вы должны сделать, это проверить devtools, чтобы увидеть, отправлены ли правильные действия и правильно ли они изменили состояние.
Запись в состояние с помощью действий и редукторов — это только одна часть, вы должны использовать селекторы для чтения состояния составным и многократно используемым способом.
Комментарии:
1. Спасибо, HMR. Я думаю, что теперь у меня есть лучшее представление о преимуществах. Аналогично ли использование действий использованию брокера в publisher-subscriber?
2. @user3667098 Точно, вы можете использовать subscribe для добавления прослушивателей изменений в хранилище. Это делается с помощью react-redux, поэтому при вызове прослушивателя изменений redux повторно отобразит компоненты, если mapStateToProps или useSelector вернут другое значение, чем в прошлый раз.