2017-02-16 2 views
2

В настоящее время я пишу приложение стека MERN, и, похоже, я хорошо справляюсь с состоянием штата, поскольку я ценю использование модульных концепций React.Когда использовать Redux?

Я видел, что Redux очень популярен, но из моего основного понимания он, кажется, берет все состояния и хранит их в одном магазине.

В настоящее время я сохраняю ссылку под названием isMobile, просто объявляя, находится ли я в состоянии мобильной связи или нет. В настоящее время я передаю это каждому компоненту по мере необходимости, чтобы соответствующим образом настроить. Помогает ли Redux такая ситуация? Если нет, каковы реальные преимущества при использовании React.

+0

Это не звучит как 'isMobile' будет когда-нибудь изменится, так что это не то, что вам действительно нужно государственный менеджер по. –

+0

Первый раз, когда я возглавляю «MERN», мне это нравится. :) – Aaron

+0

@ Иордан, ну, например, некоторые планшеты будут видеть разные взгляды на основе Пейзажа и Портрет. Поэтому, если я передам состояние: все компоненты могут реагировать на изменение состояния. – Sequential

ответ

1

Мне иногда полезно использовать редуктор window, который отслеживает такие вещи, как размер экрана, высота прокрутки и другие атрибуты, на которые будут опираться некоторые из моих компонентов. Я бы создал создателя действия, который я установил в компоненте верхнего уровня, чтобы любое изменение размера или действие прокрутки могло обновлять хранилище redux, и таким образом мне не нужно было бы прикреплять эти обработчики к каждому компоненту, зависящему от свойств окна.

Обратите внимание, что это может привести к серьезным изменениям производительности, поэтому использование функции дебюта и/или дросселирования для уменьшения количества срабатываний, связанных с действием, имеет важное значение.

Таким образом, в любом компоненте оболочки для приложения или в самых верхних компонентах, вы могли бы сделать что-то вроде этого:

import { throttle, debounce } from 'lodash'; 

... 
... 

constructor(props){ 
    super(props); 
    this.scrollHandler = this.scrollHandler.bind(this); 
    this.resizeHandler = this.resizeHandler.bind(this); 
    this.update = this.update.bind(this); 
} 

scrollHandler() { 
    throttle(this.update, 250)(); 
} 

resizeHandler() { 
    debounce(this.update, 500)(); 
} 

update() { 
    const { updateWindow } = this.props; 
    const { 
     innerHeight, 
     innerWidth, 
     outerHeight, 
     outerWidth, 
     pageYOffset, 
     scrollY 
    } = window; 

    updateWindow({ 
     innerHeight, 
     innerWidth, 
     outerHeight, 
     outerWidth, 
     pageYOffset, 
     scrollY 
    }); 
} 

componentDidMount() { 
    this.update(); 
    window.addEventListener('scroll', this.scrollHandler, false); 
    window.addEventListener('resize', this.resizeHandler, false); 
} 

componentWillUnmount() { 
    window.removeEventListener('scroll', this.scrollHandler, false); 
    window.removeEventListener('resize', this.resizeHandler, false); 
} 

И редуктор может выглядеть примерно так:

const DEFAULT_WINDOW = { 
    innerWidth: 0, 
    innerHeight: 0, 
    outerWidth: 0, 
    outerHeight: 0, 
    pageYOffset: 0, 
    scrollY: 0, 
    scrollingUp: false, 
    scrollingDown: false 
}; 

const window = (
    state = DEFAULT_WINDOW, 
    action 
) => { 
    const { data } = action; 
    switch (action.type) { 
     case types.UPDATE_WINDOW: 
      return assign({}, state, data, { 
       scrollingUp: data.pageYOffset < state.pageYOffset, 
       scrollingDown: data.pageYOffset > state.pageYOffset 
      }); 
     default: return state; 
    } 
}; 
+0

Прекрасное спасибо за пример и объяснение. – Sequential

3

Redux FAQ отвечает на этот конкретный вопрос на http://redux.js.org/docs/faq/General.html#general-when-to-use:

в общем, используйте Redux ш Если у вас есть разумные объемы данных, которые меняются со временем, вам нужен единственный источник правды, и вы обнаружите, что подходов, таких как сохранение всего в состоянии компонента React-компонента верхнего уровня, уже недостаточно.

Я также недавно являлся соавтором статьи, в которой обсуждаются вопросы the benefits of using Redux in a React application. Резюме состоит в том, что сохранение состояния вашего приложения за пределами дерева компонентов может упростить процесс передачи данных, особенно в случаях, подобных описанным вами.

+1

Благодарим вас за это чтение и ссылку. Очень признателен. – Sequential

0

При использовании Redux in React вы заметите, что существуют два типа состояний: global, которые неизменяемы и изменяются посредством действий и локальных состояний, которые обрабатываются обычным способом.
Хороший способ узнать Redux в React должен пройти через Dan Abramow по началу работы с Redux:

https://egghead.io/courses/getting-started-with-redux

Вы заметите, что код Реагировать в учебнике не имеет жизненного цикла крючки, каждый компонент только оказывает HTML. Все состояния глобальны и изменены посредством действий.

Однако в более крупном приложении с использованием Redux обычно будут как локальные, так и глобальные состояния, и им придется взаимодействовать друг с другом. Это добавляет дополнительную сложность вашему приложению.

Пожалуйста, см https://medium.com/@dan_abramov/you-might-not-need-redux-be46360cf367