React钩子:它们对共享状态管理有用吗,例如是Redux吗?

时间:2018-11-08 00:43:28

标签: reactjs redux state-management react-hooks

有一个关于React挂钩的炒作。信息太多,我仍然不知道:钩子的出现是否意味着可以将Redux之类的库扔给垃圾?

到目前为止,我所了解的是钩子对于有状态功能组件很有用,共享状态又如何呢?

5 个答案:

答案 0 :(得分:11)

否,钩子并不能完全消除,而无需使用Redux。钩子主要是实现我们今天必须使用类的功能的替代方法:

  1. 本地组件状态
  2. 上下文
  3. 生命周期方法和副作用

除了上述内容之外,钩子还提供了一种更轻松的方式来在组件之间共享状态逻辑。

更可能杀死/替换Redux的是context而不是挂钩,这是一种在组件之间共享状态的方法。但是,IMO上下文不像Redux存储那么强大,除了共享状态存储(例如中间件和具有时移功能的专用devtool)之外,Redux还提供了其他功能。据我所知,围绕Redux建立了一个完整的学习和工具生态系统,而上下文目前还没有。

如果将useReducer钩子与this example中的上下文结合使用,则与使用Redux非常相似,对于小型应用程序(例如TodoMVC),这可能就足够了。对于大型应用程序,我认为没有一个上下文和useReducer就足够了。您可能需要多个,这就是使用Redux和组合存储的意义所在。您还可以结合使用多个上下文和useReducer钩子,但仅使用Redux可能会更干净。

答案 1 :(得分:2)

不,Hooks不会取代Redux,但是它们可以帮助您编写更简洁的代码,并且您不需要仅使用局部状态或生命周期方法就可以编写类组件。那是一个很好的用例。

过去,您必须使用Redux来确保组件的每次重新渲染之间的状态都是持久的。但是现在您可以只使用useState()方法来实现持久的本地状态! 您可以使用useEffect()代替React生命周期方法,还可以使用useReducer编写快速操作创建者方法并访问全局状态!

Here is a good article about how to use useReducer() method.

答案 2 :(得分:1)

是的,但看起来它仍然不是官方功能。仍在功能建议中。阶段。许多人认为反应上下文会将redux丢弃到垃圾中,但事实并非如此。

答案 3 :(得分:0)

请注意,Redux只是状态管理。不是反应库。您可以在所需的任何项目中使用Redux。

将来,redux连接器(react-redux)可能会被钩杀死或不被使用,但是Redux本身是一个很棒的库,因为它将命令带入必须处理大量数据的应用程序内部并通过大量的开发人员。

在更多情况下,不需要Redux,但是没有, Hooks和上下文都不会“杀死” Redux

我在企业应用程序内部使用Redux,以前它是一团糟,没有真相。 Redux将订单置于代码库和逻辑中。

答案 4 :(得分:0)

Hook和Context不能代替Redux来管理应用程序状态。

上下文更类似于道具,因为它解决了在大型,高度嵌套的企业级应用程序中将信息从父母传递给孩子的噩梦。缺点是Context有点复杂,设置起来可能很痛苦。

钩子只允许我们使用功能组件,这些组件现在可以钩入应用程序状态,而不必将它们变成基于类的组件。

混乱之处在于,您可以使用useReducer之类的钩子来从Redux获取功能,而无需使用传统的Redux设置。

因此,就像您正在处理博客应用程序一样,并且想要添加功能来更新博客文章,可以像这样应用useReducer

const blogReducer = (state, action) => {
  switch (action.type) {
    case 'add_blogpost':
      return [...state, { title: `Blog Post #${state.length + 1}` }];
    default:
      return state;
  }
};

那将是您的减速器,然后您可以像这样应用

export const BlogProvider = ({ children }) => {
  const [blogPosts, dispatch] = useReducer(blogReducer, []);

您可以临时创建一个辅助函数来调度动作对象:

const addBlogPost = () => {
    dispatch({ type: 'add_blogpost' });
  };

您将不得不将其添加到价值道具'add_blogpost'中。无论如何,这只是在功能组件上利用Redux各个方面而又不使用整个Redux系统本身的一种令人困惑的方式,但又不能替代。