2017-02-16 79 views
2

我目前正在写一MERN堆栈应用程序,我似乎处理状态以及我欣赏使用模块化概念背后反应。何时使用Redux?

我看到终极版获得非常流行,但是从我的基本的了解,似乎把所有的状态,并将它们存储在一个单店。

目前我储存的一个道具叫isMobile简单地声明无论我是在移动状态还是不行。我目前正在根据需要将其传递给每个组件,以进行相应的调整。 Redux有助于解决这种情况吗?如果没有,使用React的真正好处是什么。

+0

它听起来并不像'isMobile'永远不会改变,所以它不是你真正需要一个状态管理器的东西。 –

+0

我第一次头“MERN”,我喜欢它。 :) – Aaron

+0

@Jordan,好吧,例如,某些平板电脑会根据横向和纵向显示不同的视图。因此,如果我传递状态:所有组件都可以对状态更改做出反应。 – 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

的终极版常见问题解答,在此http://redux.js.org/docs/faq/General.html#general-when-to-use具体问题:

一般情况下,使用终极版w ^如果你有合理数量的数据随着时间的推移而变化,那么你需要一个单一的事实来源,并且你发现像将所有事物保持在顶层React组件的状态这样的方法已经不够了。

我最近还合着了一篇讨论the benefits of using Redux in a React application的文章。总结在于,将应用程序状态保持在组件树之外可以使数据流更简单,尤其是在您描述的情况下。

+1

感谢您的阅读和链接。非常感激。 – Sequential

0

当使用Redux的阵营,你会发现,有两种类型的状态:全球性的,这是不可改变的,并通过行动和其处理的常用方法本地状态改变。
学习终极版中反应的好方法是要经过丹Abramow的入门终极版:

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

你会发现,在本教程的阵营代码有没有生命周期挂钩,每个组件只呈现HTML。所有州都是全球性的,并通过行动而改变

然而,在使用终极版一个更大的应用程序通常会有局部和全局的状态,他们将不得不互相交流。这增加了您的应用程序的复杂性。

请参阅 https://medium.com/@dan_abramov/you-might-not-need-redux-be46360cf367