Recompose withReducer: обоснование вызова функции асинхронного редуктора

Я использую withReducer HOC и заметил такое поведение: например, вызов обработчика кликов:

import React from 'react'
import { withReducer } from 'recompose'
import { compose } from 'ramda'

export default compose(
  withReducer('state', 'dispatch', (state, { value }) => {
    console.log(value)
    return { ...state, value }
  }, { value: 'zero' })
)((props) => {
  const { dispatch, state } = props,
    onClick = () => {
      console.log('Hello')
      dispatch({ value: 'one' })
      dispatch({ value: 'two' })
      dispatch({ value: 'three' })
      console.log('World')
    }
  return (
    <div>
      <div>{state.value}</div>
      <button onClick={onClick}>Click me</button>
    </div>
  )
})

Он будет производить

Привет

Мир

один

два

три

Это означает, что функция сокращения вызывается асинхронно. Какое оправдание для того, чтобы называть его асинхронным, а не сразу применять изменения для хранения?


person Komlev    schedule 07.01.2017    source источник


Ответы (2)


Редюсер вызывается асинхронно, потому что мы можем использовать только setState для обновления дерева, а setState является асинхронным.

Если мы вызовем редьюсер синхронно, нам нужно будет где-то сохранить новое состояние, затем вызвать setState и асинхронно получить новое состояние из того места, где мы его сохранили. В конце концов, ваше дерево по-прежнему обновляется асинхронно.

Вот почему withReducer() recompose немного отличается от redux. Вы можете думать, что withReducer — это упрощенная версия redux + react-redux connect().

person wuct    schedule 09.01.2017

В этом случае диспетчеризация фактически является оболочкой для метода setState ванильного API.

React реализует setState асинхронно, потому что переходы между состояниями иногда группируются вместе из соображений производительности.

Согласно документам React:

setState() не изменяет this.state немедленно, а создает отложенный переход состояния.... Нет гарантии синхронной работы вызовов setState, и вызовы могут быть объединены в пакеты для повышения производительности.

person Jonathan Huang    schedule 07.01.2017