Redux: откуда государство узнает, какой дочерний редуктор следует выбрать при поступлении действия? - PullRequest
0 голосов
/ 05 марта 2020

При чтении документации библиотеки Redux у меня возникает вопрос о combineReducers.

Phase1: один редуктор

Когда у нас есть один редуктор, он обрабатывает все виды типов действий.

export default function counter(state = 0, action) {
  switch (action.type) {
    case 'INCREMENT':
      return state + 1
    case 'DECREMENT':
      return state - 1
    case 'FOO'
      return state + 100
    case 'BAR'
      return state - 100
    case 'SHOW_ME_THE_MONEY'
      return state + 10000000000
    default:
      return state
  }
}

Phase2: мы разделяем их на разные редукторы

Ну, у вас есть рецензент кода, который сказал, что нехорошо иметь одного бога-редуктора для обработки всех действия. Пожалуйста, создайте разные редукторы, чтобы делать разные вещи.

  • cheat: SHOW_ME_THE_MONEY / FOO / BAR
  • counter: INCREMENT / DECREMENT

.

export default function cheat(state = [], action) {
  switch (action.type) {
    case 'FOO'
      return state + 100
    case 'BAR'
      return state - 100
    case 'SHOW_ME_THE_MONEY'
      return state + 10000000000
  }
}


export default function counter(state = 0, action) {
  switch (action.type) {
    case 'INCREMENT':
      return state + 1
    case 'DECREMENT':
      return state - 1

    default:
      return state
  }
}

затем мы объединяем их в единицу с помощью combReducers.

import { combineReducers } from 'redux'
import todos from './cheat'
import counter from './counter'
export default combineReducers({
  cheat,
  counter
})

затем отправляем действие в состояние.

store.dispatch({
  type: 'SHOW_ME_THE_MONEY',
  text: 'To Buy new Macbook Pro 16'
})

Вопрос

Когда поступает действие FOO, откуда государство узнает, какой дочерний редуктор должен быть выбран и использован для вычисления нового состояния?

Полагаю, что сопоставление между типом действия и редуктором является существенным, но оно кажется ненужным, что Демонстрация в документации.

  • FOO -> читер
  • BAR -> читер
  • SHOW_ME_THE_MONEY -> читер
  • INCREMENT - > счетчик-редуктор
  • DECREMENT -> счетчик-редуктор

Ответы [ 2 ]

1 голос
/ 05 марта 2020

combineReducers выполняет только сопоставление между вашим дочерним ключом-восстановителем (cheat, counter) и соответствующим срезом состояния (state.cheat, state.counter).

The redux basi c tutorial проведет вас через эту концепцию, называемую композицией редуктора.

Дочерние редукторы получают все действия, но только их часть состояния:

let {
  createStore,
  combineReducers
} = Redux

function cheat(state = 0, action) {
  console.log("cheat reducer receive action: ", action.type)
  console.log("cheat reducer slice: ", state)
  switch (action.type) {
    case 'FOO':
      return state + 100
    case 'BAR':
      return state - 100
    case 'SHOW_ME_THE_MONEY':
      return state + 10000000000

    default:
      return state
  }
}

function counter(state = 0, action) {
  console.log("counter reducer receive action: ", action.type)
  console.log("counter reducer slice: ", state)
  switch (action.type) {
    case 'INCREMENT':
      return state + 1
    case 'DECREMENT':
      return state - 1

    default:
      return state
  }
}

let combined = combineReducers({
  cheat,
  counter
})
let store = createStore(combined)

store.subscribe(() => console.log("store state: ", store.getState()))

store.dispatch({
  type: 'INCREMENT'
})
store.dispatch({
  type: 'INCREMENT'
})
store.dispatch({
  type: 'FOO'
})
store.dispatch({
  type: 'BAR'
})
store.dispatch({
  type: 'SHOW_ME_THE_MONEY'
})
<script src="https://unpkg.com/redux/dist/redux.js"></script>
0 голосов
/ 05 марта 2020

этот официальный FAQ по редуксу предоставляется @louisbl в качестве комментария, но я думаю, что он очень полезен, заслуживает того, чтобы быть представленным в качестве ответа.

FAQ по Redux: Действия

Данное действие может быть выполнено всеми, некоторыми или ни одним из них. Это позволяет отделить компоненты от фактических изменений данных, поскольку одно действие может повлиять на разные части дерева состояний, и компоненту не нужно знать об этом. Некоторые пользователи предпочитают связывать их более тесно, например, файловую структуру «утки», но по умолчанию определенно нет однозначного сопоставления, и вы должны отказаться от такой парадигмы в любое время, когда захотите обрабатывать действие во многих редукторах.

Еще один вопрос:

Redux Можно ли использовать один тип действия в отдельных редукторах?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...