当前位置:首页 > 科技  > 软件

React 函数组件不是有状态吗,为什么还要说他是纯函数

来源: 责编: 时间:2024-05-08 09:19:08 81观看
导读许多人在学习 React 时会有这样一个疑问,不断看到 React 官方团队言论,或者说各路大佬都是在说 React 是函数式编程,我们写组件确实写的是组件,但问题就在于,我们写的组件是有内部状态,这样的函数就不是纯函数了,这怎么能算

GOo28资讯网——每日最新资讯28at.com

许多人在学习 React 时会有这样一个疑问,不断看到 React 官方团队言论,或者说各路大佬都是在说 React 是函数式编程,我们写组件确实写的是组件,但问题就在于,我们写的组件是有内部状态,这样的函数就不是纯函数了,这怎么能算是函数式编程呢?GOo28资讯网——每日最新资讯28at.com

想不通。GOo28资讯网——每日最新资讯28at.com

今天这篇文章,就来跟大家解释一下,为什么 React 的函数式组件,其实就是纯函数。GOo28资讯网——每日最新资讯28at.com

UI = f(state)

一、hook 的特性

我们在声明一个函数式组件时,常常会使用到 hook 来声明一些状态或者方法,但是我们在使用 hook 时,你会发现 hook 会有一些奇怪的规则,那么就是不能把 hook 放到条件判断中去。GOo28资讯网——每日最新资讯28at.com

if (a === 1) {  const [count, setCount] = useState(0)}

然后有的人就很不理解这个现象。于是把这个情况定性为 React 的设计缺陷。但这真的是设计缺陷吗?GOo28资讯网——每日最新资讯28at.com

我们只需要换个思路,你就能对这个现象豁然开朗。GOo28资讯网——每日最新资讯28at.com

二、hook 存在哪?

在初学阶段,我们会很自然的认为,当我们使用 useState 在函数内部定义了一个状态时,那么这个状态一定是保存在这个函数内部的。GOo28资讯网——每日最新资讯28at.com

function Demo() {  const [count, setCount] = useState(0)  ...}

然后理解得多了,才发现并不是这样。每一个函数的状态都被存在了另外一个模块里(Fiber tree)。也就是说,只要 React 允许,我们甚至可以在别的组件访问到任意一个组件里的状态。当然 React 对这种情况做了限制,只允许通过特定的语法来做到这个事情。GOo28资讯网——每日最新资讯28at.com

函数组件中的所有的 hook 都是从外部传入的。GOo28资讯网——每日最新资讯28at.com

三、state 其实是参数

我们再来看一下这个公式。GOo28资讯网——每日最新资讯28at.com

UI = f(state)

这个时候我们会恍然发现,虽然 state 在函数内部定义/获取了,但是很明显,React 是期望大家把他当成外部传入的参数来理解的。GOo28资讯网——每日最新资讯28at.com

例如我们有这样一个函数。GOo28资讯网——每日最新资讯28at.com

function Counter({x}) {  const [count, setCount] = useState(0)  return (    <div>{x + count}</div>  )}

他可以等价于。GOo28资讯网——每日最新资讯28at.com

function Counter({x}, [count = 0, setCount]) {  return (    <div>{x + count}</div>  )}

这个时候我们就明朗了,函数,原来还是纯函数。但是为什么语法不这样设计呢,不是更好理解吗?当然是因为参数太多了写不下了呀,因此 React 把传参的行为,下放到了函数内部,通过 hook 的方式来实现。GOo28资讯网——每日最新资讯28at.com

四、重新审视 hook

如果 state 是外部传入的参数,那么此时我们就要重新审视一下为什么不能把 hook 放到条件判断中去了。GOo28资讯网——每日最新资讯28at.com

例如:GOo28资讯网——每日最新资讯28at.com

function Counter({x}) {  if (a === 0) {    const [loading, setLoading] = useState(false)    }  const [count, setCount] = useState(0)  return (    <div>{x + count}</div>  )}

所以,useState 是外部传参,那么参数本来就应该有严格的顺序要求,这个时候如果第一个参数因为不符合条件而在代码逻辑里消失了,那第二个参数,不就变成第一个参数了吗?GOo28资讯网——每日最新资讯28at.com

这个时候代码逻辑中,就会把第二个参数当成第一个参数去使用,这不就乱了吗?GOo28资讯网——每日最新资讯28at.com

当我们调用 setState 时,表示入参正在发生变化,函数自然也会重新执行。GOo28资讯网——每日最新资讯28at.com

五、总结

hook 存放在函数外部,因此不属于函数内部的状态。我们在理解函数式组件是纯函数时,应该把 hook 当成参数去看待,这样很多现象就非常自然了。GOo28资讯网——每日最新资讯28at.com

函数式编程更加侧重于把逻辑解耦拆分成不同的函数,然后通过函数组合的形式去构建一个完整的逻辑,例如我们非常常见的 map 方法GOo28资讯网——每日最新资讯28at.com

function func(item) {  return item + 1}var newArr = arr.map(func)

所以理解函数式编程,会对逻辑封装解耦的能力要求比较高,在这种情况下,理解函数式编程确实会存在一定的门槛。所以最后思考一个问题,为什么 state 一定要是不可变数据?GOo28资讯网——每日最新资讯28at.com

本文链接://www.dmpip.com//www.dmpip.com/showinfo-26-87257-0.htmlReact 函数组件不是有状态吗,为什么还要说他是纯函数

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: HTMX:重回前端的原始时代?

下一篇: 十项快速检查,确保你的 AWS 支出处于控制之中

标签:
  • 热门焦点
  • 小米官宣:2023年上半年出货量中国第一!

    小米官宣:2023年上半年出货量中国第一!

    今日早间,小米电视官方微博带来消息,称2023年小米电视上半年出货量达到了中国第一,同时还表示小米电视的巨屏风暴即将开始。“公布一个好消息2023年#小米电视上半年出货量中国
  • 小米平板5 Pro 12.4简评:多专多能 兼顾影音娱乐的大屏利器

    小米平板5 Pro 12.4简评:多专多能 兼顾影音娱乐的大屏利器

    疫情带来了网课,网课盘活了安卓平板,安卓平板市场虽然中途停滞了几年,但好的一点就是停滞的这几年行业又有了新的发展方向,例如超窄边框、高刷新率、多摄镜头组合等,这就让安卓
  • 7月安卓手机性价比榜:努比亚+红魔两款新机入榜

    7月安卓手机性价比榜:努比亚+红魔两款新机入榜

    7月登场的新机有努比亚Z50S Pro和红魔8S Pro,除了三星之外目前唯二的两款搭载超频版骁龙8Gen2处理器的产品,而且努比亚和红魔也一贯有着不错的性价比,所以在本次的性价比榜单
  • 容量越大越不坏?24万块硬盘故障率报告公布 这些产品零故障

    容量越大越不坏?24万块硬盘故障率报告公布 这些产品零故障

    8月5日消息,云存储服务商Backblaze发布了最新的硬盘故障率报告,年故障率有所上升。Backblaze发布的硬盘季度统计数据,其中包括故障率等重要方面。这些结
  • 虚拟键盘 API 的妙用

    虚拟键盘 API 的妙用

    你是否在遇到过这样的问题:移动设备上有一个固定元素,当激活虚拟键盘时,该元素被隐藏在了键盘下方?多年来,这一直是 Web 上的默认行为,在本文中,我们将探讨这个问题、为什么会发生
  • 梁柱接棒两年,腾讯音乐闯出新路子

    梁柱接棒两年,腾讯音乐闯出新路子

    文丨田静 出品丨牛刀财经(niudaocaijing)7月5日,企鹅FM发布官方公告称由于业务调整,将于9月6日正式停止运营,这意味着腾讯音乐长音频业务走向消亡。腾讯在长音频领域还在摸索。为
  • “又被陈思诚骗了”

    “又被陈思诚骗了”

    作者|张思齐 出品|众面(ID:ZhongMian_ZM)如今的国产悬疑电影,成了陈思诚的天下。最近大爆电影《消失的她》票房突破30亿断层夺魁暑期档,陈思诚再度风头无两。你可以说陈思诚的
  • 华为Mate 60保护壳曝光:硕大后置相机模组 凸起程度有惊喜

    华为Mate 60保护壳曝光:硕大后置相机模组 凸起程度有惊喜

    这段时间以来,关于华为新旗舰的爆料日渐密集。据此前多方爆料,今年华为将开始恢复一年双旗舰战略,除上半年推出的P60系列外,往年下半年的Mate系列也将
  • OPPO K11样张首曝:千元机影像“卷”得真不错!

    OPPO K11样张首曝:千元机影像“卷”得真不错!

    一直以来,OPPO K系列机型都保持着较为均衡的产品体验,历来都是2K价位的明星机型,去年推出的OPPO K10和OPPO K10 Pro两款机型凭借各自的出色配置,堪称有
Top
Baidu
map