够了不要再问ReactHooks是否

          作者

MaxGonzalez      译者

肖鹏      编辑

Yonie  

我的许多同事最近通过各种方式问同一类问题:"如果我们开始用hook后,那还有必要用Redux吗?"

"Reacthook不是让Redux过时了吗?那只用Hooks就可以做Redux所有能做的事了吧?"

随便搜一下Google,你就会发现人们也在互联网上问同样的问题。

简单来说,“ReactHooks是否替代了Redux”这个问题的答案是:“不”。更细致不过礼貌的答案是:“嗯,这个取决于你实际项目的类型“。最终,我倾向于回答人们“我不确定你是否明白自己在说什么”。

“ReactHooks取代了Redux”这个论点有着根本的缺陷,其原因有好几个。首先:

    Redux从始至终都是可选方案  

Redux的作者之一DanAbramov曾经表达过你可能不需要Redux的建议。如果你本来就不需要某样东西,那你也就不用替换它了。

如果你正在用React,为了用起来Redux,你还得把Redux-Redux装到你的应用里。在项目中使用多个库显然会增加最终应用打包的大小,也就会增加加载应用所需的时间。因此,除非有真正的理由,你不应该使用任何库,如jQuery,Redux,MobX,甚至是React。

当人们问起来hook是否能替代Redux时,他们似乎认为得在这两者之间做出选择,但事实并非如此。如果你正开发的应用不需要存储大量状态,或者组件层次足够简单不需要深层次的prop传递,那么用整个状态管理库方案是没有意义的。无论是否使用hook,应用的状态都足够由React提供的功能进行管理了。

即便你的应用需要管理一个庞大的状态,或者应用的层次结构如古树的根一样错综复杂,你也不一定非得使用状态管理库。深层次传递prop可能很麻烦,但原生的React已经为你提供了包含在hook在内的多种状态管理的选择,他们都能帮你把状态管理的井井有条。Redux是一个轻量级的库,不过配置相对复杂,增加最终打包的体积,还需要做出各种权衡取舍。不在项目中使用Redux有许多合理的理由,所以你并不总是需要用它。

虽然如此,我们还是有许多理由使用Redux。如果你的项目本来就在用Redux,那最开始决定使用Redux应该是有一些好的理由的,比如项目的组织架构需要有一个可预测的,单一事实来源的程序状态;中间件功能;或是强大的开发调试工具。如果你曾有理由使用Redux,那hook并不会让你的这些理由失效。如果你曾需要用Redux,那你也许还得继续用它。

    两者解决问题的方式不同  

Redux是一个状态管理库。Hooks是最近才加入React的新功能,它可以让函数组件支持曾经只在class组件中支持的特性。

那么,用函数组件替换class组件实现React应用会让状态管理库过时吗?答案是否定的。

关于为何开发Reacthook,官方文档给出了三个主要原因:class组件的逻辑复用很困难。生命周期方法内常包含让人困惑的无关逻辑。

class对于机器和人类来说都难以理解。

你可以注意到这些动机都跟状态管理无关。

话虽如此,Reacthook确实为你提供了状态管理的新选择。值得注意的是,useState,useReducer和useContext这些管理状态的新方法,一定程度上比之前React原生提供的方案更好、更有条理。但Reacthook没有提供超出之前React版本的新能力,也不会让状态管理库过时。

    Reacthook不会使React应用做任何它以前做不到的事  

没错,函数组件可以做到以前只有在class组件才能实现的功能,同时函数组件有更好的代码组织结构和重用能力,但函数组件做不到class组件也做不到的事。Reacthook的目的不是为了让应用更好,而是为了让开发体验更好。

useState和useReducer只是管理组件状态的方法,其工作方式与class组件中的this.state和this.setState工作方式的大致相同。对于深层传递prop的问题,hook也是无能为力。

人们似乎认为useContext可以把Redux打入冷宫,因为你可以使用它解决状态深层次传递的问题,但它确实不是什么新功能。contextAPI已经存在于React一段时间了。useContext只是让你可以不通过包装组件就能使用context。虽然有些开发人员选择使用context管理整个应用的状态,但context的设计初衷不是如此。官方文档提到:

Context设计目的是为了共享那些对于一个组件树而言是“全局”的数据,例如当前认证的用户、主题或首选语言。

换句话说,放在context中的数据不应该经常更新。

文档还建议要谨慎使用context,因为“它会让代码复用变得更困难“。他们还警告开发人员,如果使用不当,context还会导致不必要的重新渲染。

我见到过一些项目成功使用Reactcontext管理整个应用的状态。理论上这确实是一种选择。但context的设计初衷并不包含状态管理,而这是Redux或是其他状态管理库的设计目的。此外,Reacthook绝对不意味着Redux的灭亡,如果你瞅一眼React-Redux最近更新的文档,你会看到:

    React-Redux也拥有自己的Hook了  

没错,ReactHook有助于重振React-Redux库,并移除了一些它的痛点。这与“hook会替代Redux”这个观点相去甚远。

我在另一篇文章深入介绍了React-Redux中的hook:


转载请注明:http://www.aierlanlan.com/cyrz/553.html