React hooks:它们对共享状态管理有用吗?终极版?

React hooks: are they useful for shared state management, like e.g. Redux?

关于 React hooks 的炒作。信息太多,我还是不知道:hooks的出现是否意味着像Redux这样的库可以被扔进垃圾箱?

到目前为止,我的理解是钩子适用于有状态的功能组件,那么共享状态呢?

是的,但看起来它仍然不是官方功能。它仍在功能提案中。阶段。许多人认为 React 上下文会将 redux 转储到垃圾中,但事实证明它没有。

不,钩子不会完全消除对 Redux 的需求。钩子主要是作为实现我们今天必须使用的功能的替代方法 类:

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

除上述之外,挂钩还提供了一种在组件之间共享有状态逻辑的更简单方法。

Redux 更可能 kill/replace 的是 context 而不是钩子,钩子是一种跨组件共享状态的方法。但 IMO 上下文不如 Redux 存储强大,因为除了共享状态存储之外,Redux 还提供其他功能,例如中间件和具有时间旅行功能的专用开发工具。据我所知,目前还没有围绕 Redux 构建的完整学习和工具生态系统。

如果你像 this example 那样将 useReducer 钩子与上下文结合使用,它与使用 Redux 非常相似,对于小型应用程序(如 TodoMVC),它可能就足够了.对于大型应用程序,我认为只有一个上下文和 useReducer 就足够了。您可能需要多个,这就是使用 Redux 和组合商店的意义所在。您还可以组合多个上下文和 useReducer 挂钩,但仅使用 Redux 可能更清晰。

不,Hooks 不会取代 Redux,但它们可以帮助您编写更简洁的代码,并且您不需要编写 class 组件只是为了使用本地状态或生命周期方法。这是一个很好的用例。

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

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

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

在未来,也许 redux 连接器 (react-redux) 会被挂钩杀死或不再使用,但 Redux 本身是一个很棒的库,因为它在必须处理大量数据的应用程序中带来了秩序,由大量开发人员开发。

可能会有更多不需要 Redux 的用例,但是不会,Hooks 和上下文都不会 "kill"Redux

我在一个企业应用程序中使用 Redux,以前它是一团糟,没有真实的来源。 Redux 在代码库和逻辑中放置顺序。

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

上下文更类似于 props,因为它解决了在大型、高度嵌套的企业级应用程序中将信息从 parent 传递到 child 的噩梦。缺点是 Context 有点复杂,设置它可能很痛苦。

挂钩只允许我们使用现在可以挂接到应用程序状态的功能组件,而无需将它们变成 class-based 组件。

混淆在于您可以使用像 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, []);

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

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

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