React hooks能替代Redux,HOC和render props么?

最近开始学习React,记录一下心得。

React hooks是16.8.0推出的,其目的是为了替换class,HOC,render props。同时网传hooks也将终结redux,那么本文将讨论hooks究竟能不能替换掉redux,HOC,render props。

1. Hooks替代Redux。

与其说Hooks替代Redux,不如说是Context在替代Redux。Context是16.3.0推出的(之前也有,但是API不一样且基本没人用)。其实从Context开始,可以说不用redux也可以写出逻辑上漂亮的APP了。context同样可以维护一个组件树共享的state,修改state,state变化的时候更新所有用到这个state的组件。之所以网传hooks要替代redux,是因为hooks里面有一个useReducer,和redux里面的reducer是一模一样。reducer其实为了处理复杂的state而引入的概念。hooks因为有了reducer,习惯redux的人在不用redux的情况下也可以用reducer的方式维护state了。

吐槽一下reducer这个名字,这根本就是乱起名字,它和js里面的array的reduce方法,或者java里面的stream的reduce一毛钱关系都没有。所以不要纠结为啥叫reducer,我们可以理解为老外的脑回路比较独特。

context+hooks完全可以替代redux的核心功能(全局state,reducer,connect),至于核心功能之外的一些功能,who care?只有那么一直在用redux的才去关心。redux轻易不会死,因为用的人很多,并且context+hooks并没有压倒性的优势去替代它。如果你是新手,那么你完全可以不去学redux了,因为context+hooks更易学,优点更多一些,虽然不是压倒性的。

谈谈redux的缺点。

1. 学习难度高。可以说学习redux和学习react本身难度基本相当。个人认为redux能活下来简直是个奇迹,难道是因为react16.3.0之前其没有同行,或者同行更差劲?

而context+hooks就好学的多了,对吧?

2. 采用全局state,性能差。redux通常是一个页面只维护一个state,这带来两点问题。其一是因为state变化之后每次是要new一个完全不同的object的(这是react的特性决定的),你的state越大,开销就越大。其二是只要这个state有变化,connect它的组件就会重新渲染。当然redux并不傻,它做了很多优化,比如通常用redux的人会使用像immutablejs或者类似的第三方库来实现其new state,可是,这是人干的事么?有问题不从根源上解决,却引入本身就有争议的第三方库(之所以有争议,是因为如果你使用的方法错误,性能会变得更差,这也没什么,问题是它非常容易被错误的使用)。

而如果你用context的话,一个页面推荐维护多个context的,只有那些相关度非常高的state才放到一个context里面。这样每个context非常小,new state的开销也小,其需要重新渲染的组件也少。

3. 代码维护困难。

第一是connect其实是HOC,也就是组件二次封装。显然封装会影响可读性。这也不是关键,关键是redux团队犯了一个很扯淡的错误,就是connect的HOC传给被封装组件的props是开发者自己定义的,而不是redux定义的。这有什么区别呢?比如说你在读别人的代码的时候,如果看到props.redux.xxx,你会意识到xxx是connect HOC过来的。但是如果你碰到的是 props.xxx,你首先会想xxx是上层commponent传过来的,然而检查后你发现竟然不是。简单说这个问题给props的来源带来不确定性。

第二是redux本质是面向过程编程,而不是hooks所带来的面向属性编程。什么意思呢?所谓过程就是初始化state,connect,reducer。你读别人的代码,你能从connect处很容易的知道它对应的reducer么?你能很容易找到state的初始值么?不能。为什么?因为这三个过程是分开的,每个过程里面都包含很多property,你需要去找property。如果用context的话,可以轻松的实现按照属性封装,就是每个属性一个context,它的初始值,reducer(如果是单一属性就可能不需要reducer)以及可能需要一些其他逻辑都可以写在一起。同时和connect对应的是useContext,useContext比connect要简洁,并且通过useContext传过去的实例,你可以很容易的找到对应的context的属性的几乎所有内容。

有些人会把redux的性能自动优化啊,调试工具啊说成redux的优点,其实这恰恰是它的不足,react官方的调试工具都满足不了你的逻辑,你的逻辑是得有多差?

2. Hooks替代HOC和render props。

首先是hooks(这里指custom hooks,下同),HOC,render props到底是做什么的?

对于新手,并不是很容易理解它们是做什么的,至少我没有很容易理解。

我现在理解为它们是为了共享一些维护state的逻辑。

什么意思呢?首先它共享的是逻辑,但是共享逻辑你随便封装一个函数不就可以了么?问题就出在它是共享维护state的逻辑。普通的逻辑的和维护state的逻辑的区别就是,维护一个state的逻辑,当state发生变化时,用到这个state的组件是要重新渲染的,显然用普通的函数做不了这个事情。

那么有哪些维护state的逻辑呢?我大体上把它们分为两类:

第一类,一个状态组件维护state的逻辑,第二类,一个非组件维护state的逻辑。

其实一个状态组件本身就是在维护一个state,当用户操作它所渲染的UI的时候,state发生响应的变化。组件的逻辑负责维护state的变化。

那么非组件指什么呢?

比如说我维护一个user的登录状态,这个登录状态需要发送请求给后台去拿。那么这个登录状态就会有3个值{fetching,online,offline},而且可能会从fetching到online,或者从fetching到offline,就是会变化的。

比如说我需要记录用户鼠标的位置(x,y坐标),这个是随用户移动鼠标而变化的。

比如说我做一个定时器,每隔一段时间切换一下我维护的一个state。

等等,我相信还有其他很多。

之所以分为这两类,是因为只有render props可以共享状态组件,而hooks和HOC是不能的,这是因为如果你是组件,那么你的返回值(或者render函数)就必须是一个dom结构,那么就没有办法把维护的state,或者根据state的计算结果传递出去(hooks),当然你也就不能返回另一个组件(HOC)

所谓的render props共享状态组件,其实就是组件重用。这里有点理解上的倾向问题,当我们说render props的时候,我们往往想到的是重用父组件,而我们谈论组件重用的时候的,往往更倾向重用子组件。其实都是一个东西。render props在概念上是最说不清的,它在写法上有两种,其实是一回事,用哪种看你自己的倾向。我这里只说最顶层的调用的地方,就是同时要写父组件和子组件的地方,在这里要把子组件作为父组件的一个props传递过去,第一种是传递一个函数,返回值是一个组件的实例:<Parent render={()=><Child />}/> 第二种是传递组件本身 const <Parent render={Child}/>d当然第一种使用的比较多,原因是props变量一般用小写开头,而实例化组件时组件名一般用大写开头,这样用第二种就多了需要一个转换语句。

然后我们建立一个简单的模型分析下三者的结构。

我们假设有三个组件A,B,C需要共享一个维护state的逻辑S。那么:

hooks就是在A,B,C中直接调用S。上层使用的时候是 <A />

HOC就是把S封装成一个函数FunctionS,这个函数接收A,B,C之一作为参数,返回一个新的组件。比如接收的是A,那么返回的组件包含A和S的所有内容。上层使用的是 const WrappedA = FunctionS(A);<WrappedA />

Render props就是把S封装成一个组件,这个组件把A,B,C之一作为他的子组件。到底是A,B,还是C呢?这个在调用S的地方指定。上层使用的是 <S render={A} />

Hooks能替代HOC,render props么?

显然render props的共享状态组件的功能是无法被替代的,因为hooks实现不了。共享非组件的功能,基本都可以用hooks来替代,而且最好用hooks来实现,因为我们看到了,hooks的逻辑最直接,最容易理解。当然第一原则应该是根据业务实事求是,就是概念上该是什么就是什么,如果概念上就是HOC,那么就用HOC。实事求是是为了代码的更好维护。

原文地址:https://www.cnblogs.com/yy17yy/p/11485481.html

时间: 2024-10-07 20:57:25

React hooks能替代Redux,HOC和render props么?的相关文章

React Hooks的999999个好处

最近前几个月开始,新项目都开始完全使用typescript+hooks,先不说typescript吧,hooks是真的香?? 1.更好的分离页面和逻辑,重用逻辑的方法 现在前端项目的组件化,一般都是基于最基础的UI组件库(里面也有组件的功能逻辑),加上业务逻辑,封装一个个component,container. 组件是 UI + 逻辑的复用,但逻辑复用能力等于 0. 而在项目中,很难做到轻松的把 UI 和逻辑分开.(这里的逻辑并不是简单的能抽离的那种工具函数).在此之前,React有Mixin(

React 之 render props 的理解

1.基本概念 在调用组件时,引入一个函数类型的 prop,这个 prop定义了组件的渲染方式. 2.回调渲染 回顾组件通信的几种方式 父-> 子 props 子-> 父 回调.消息通道 任意 状态提升.Context.Redux 等 而 render props 本质实际上是使用到了回调的方式来通信.只不过在传统的 js 回调是在构造函数中进行初始化(使用回调函数作为参数),而在 react 中,现在可以通过 props 传入该回调函数,就是我们所介绍的 render prop. 从结果论来说

深入浅出 React 的 HOC 以及的 Render Props

重复是不可能的,这辈子都不可能写重复的代码 当然,这句话分分钟都要被产品打脸,天天喊着改需求,老哥,这里改下可好? 所以,我们需要抽象,封装重复的功能或者逻辑,这样改需求,也不用到处改 那么这次我们来讲讲 React 里的高级组件 React 高级组件有两种方式: 使用高阶组件( Higher Order Component ==> HOC ) 子组件作为函数的模式( Render Props ) 高阶组件 首先来说说高阶组件,它不是 React 的提供的 API,它是模式,一种增强组件的模式,

初探React Hooks &amp; SSR改造

Hooks React v16.8 发布了 Hooks,其主要是解决跨组件.组件复用的状态管理问题. 在 class 中组件的状态封装在对象中,然后通过单向数据流来组织组件间的状态交互.这种模式下,跨组件的状态管理变得非常困难,复用的组件也会因为要兼容不同的组件变得产生很多副作用,如果对组件再次拆分,也会造成冗余代码增多,和组件过多带来的问题. 后来有了 Redux 之类的状态管理库,来统一管理组件状态.但是这种分层依然会让代码变得很复杂,需要更多的嵌套.状态和方法,写代码时也常在几个文件之间不

React Hooks用法大全

前言 在 React 的世界中,有容器组件和 UI 组件之分,在 React Hooks 出现之前,UI 组件我们可以使用函数,无状态组件来展示 UI,而对于容器组件,函数组件就显得无能为力,我们依赖于类组件来获取数据,处理数据,并向下传递参数给 UI 组件进行渲染.在我看来,使用 React Hooks 相比于从前的类组件有以下几点好处: 代码可读性更强,原本同一块功能的代码逻辑被拆分在了不同的生命周期函数中,容易使开发者不利于维护和迭代,通过 React Hooks 可以将功能代码聚合,方便

理解 React Hooks

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由志航发表于云+社区专栏 TL;DR 一句话总结 React Hooks 就是在 react 函数组件中,也可以使用类组件(classes components)的 state 和 组件生命周期,而不需要在 mixin. 函数组件.HOC组件和 render props 之间来回切换,使得函数组件的功能更加实在,更加方便我们在业务中实现业务逻辑代码的分离和组件的复用. 本文将从以下几个方面介绍 hooks Hooks 在解决什么问题

30分钟精通React今年最劲爆的新特性——React Hooks

你还在为该使用无状态组件(Function)还是有状态组件(Class)而烦恼吗? --拥有了hooks,你再也不需要写Class了,你的所有组件都将是Function. 你还在为搞不清使用哪个生命周期钩子函数而日夜难眠吗? --拥有了Hooks,生命周期钩子函数可以先丢一边了. 你在还在为组件中的this指向而晕头转向吗? --既然Class都丢掉了,哪里还有this?你的人生第一次不再需要面对this. 这样看来,说React Hooks是今年最劲爆的新特性真的毫不夸张.如果你也对react

react新特性 react hooks

本文介绍的是react新特性react hooks,本文面向的是有一定react开发经验的小伙伴,如果你对react还不是很熟悉的话我建议你先学习react并多多联系. 首先我们都知道react有3种组件:分别是Function函数式无状态组件.class有状态组件.高阶组件.这里不对这3种组件做一一介绍. 本文重点是react hooks 一个最简单的Hooks 首先让我们看一下一个简单的有状态组件: 1 class Example extends React.Component { 2 co

基于 Webpack 4 和 React hooks 搭建项目

面对日新月异的前端,我表示快学不动了??. Webpack 老早就已经更新到了 V4.x,前段时间 React 又推出了 hooks API.刚好春节在家里休假,时间比较空闲,还是赶紧把 React 技术栈这块补上. 网上有很多介绍 hooks 知识点的文章,但都比较零碎,基本只能写一些小 Demo .还没有比较系统的,全新的基于 hooks 进行搭建实际项目的讲解.所以这里就从开发实际项目的角度,搭建起单页面 Web App 项目的基本脚手架,并基于 hooks API 实现一个 react