上下文+挂钩或Redux

时间:2019-09-25 07:10:55

标签: javascript reactjs

实际上我正在建立一个新项目,对选择流程感到困惑:

  1. useState + useReducer + useContext

  1. Redux

该项目属于高级和中型项目,可能会在不久的将来导致大型应用程序的产生或消失。

如果我选择选项1(useState + useReducer + useContext):

a。尚无useReducer中间件。由于它不是一个全局状态容器,因此很难在全球范围内应用这样的中间件。 b。还没有本机功能将所有减速器组合为一个终极减速器。

如果我选择选项2,则可以使用选项1无法提供的功能。

我发现,我们可以实施,我们可以在选项1中手动组合多个reducer。

import userReducer from './reducers/user';
import basketReducer from './reducers/basket';
const mainReducer = ({ user, basket }, action) => ({
     user: userReducer(user, action),
     basket: basketReducer(basket, action)
});

并且也可以实现中间件

import userReducer from './reducers/user';
import basketReducer from './reducers/basket';
const mainReducer = ({ user, basket }, action) => {
  // middleware goes here, i.e calling analytics service, etc.
  return {
    user: userReducer(user, action),
    basket: basketReducer(basket, action)
  };
});

实际上,我在这里冻结选择哪种方式最合适?

如果我要使用Redux,则必须实现Redux,axios,saga,不可变的js或其他第三方库。 我将使用Redux的强大功能,并且还应该首先了解Redux的所有概念。因为我知道上下文+钩子。

官员们是否有计划将Redux中缺少的成分带入钩子+环境中?

2 个答案:

答案 0 :(得分:1)

  

实际上我在这里冻结选择哪种方式最合适?

最理想的是,我俩都一样。它们都支持记忆。但是,Redux的优点是它在整个应用程序状态下都具有single source of truth

  

官员们是否有计划将Redux中缺少的成分带入钩子+环境中?

Redux,Hooks,Context和Saga具有不同的目的/动机。

最终,出于以下原因,我建议您使用钩子+功能组件:

  1. 由于上下文提供者而消除了wrapper hell

  2. 在功能组件中通过useEffect细化处理副作用(获取,订阅)。

答案 1 :(得分:1)

  

官员们是否有计划将Redux中缺少的成分带入钩子+背景?

不,这与它的 Design-Principles (设计原理)相矛盾,事实是您可以自己实现这些功能(不是很复杂),React的生态系统中有许多稳定而出色的状态管理员(例如reduxmobx)。

  

通用抽象(设计原则):通常,我们拒绝添加可以在用户环境中实现的功能。我们不想使用无用的库代码来夸大您的应用程序。但是,有一些例外情况。


  

实际上我在这里冻结选择哪种方式最合适?

这个问题太笼统了,它取决于您的应用程序逻辑,扩展性以及是否真的需要所有redux功能。

请参阅SO问题 React Context vs React Redux, when should I use each one?


  

如果我要使用Redux,则必须实现Redux,axios,saga,不可变js或其他第三方库。

使用axiosfetch)和immutablefreeze)未绑定到redux,也建议使用to not mutate data并使用应用程序中的不可变库。

此外,如上所述,在熟悉中间件之后,您不必sagaredux集成在一起,具体取决于您的应用程序逻辑,完全需要saga