服务粉丝

我们一直在努力
当前位置:首页 > 财经 >

【第2868期】前端框架的未来:useSignal()

日期: 来源:前端早读课收集编辑:CUGGZ

前言

Signal(信号)是一种存储应用状态的形式。今日前端早读课文章由 @CUGGZ 分享,公号:前端充电宝授权。

正文从这开始~~

Signal(信号)是一种存储应用状态的形式,类似于 React 中的 useState()。但是,有一些关键性差异使 Signal 更具优势。Vue、Preact、Solid 和 Qwik 等流行 JavaScript 框架都支持 Signal。

Signal 并不是最近才出现的,在此之前,它已经存在于 Knockout 等框架中。不过,在最近几年通过巧妙的编译器技巧和与 JSX 的深度集成极大地改进了它的开发者体验・,这使得它非常简洁并且使用起来很方便。

下面就来看看 Signal 都有哪些优势,为什么说它是前端框架的未来!

Signal 是什么?

Signal 和 State 之间的主要区别在于 Signal 返回一个 getter 和一个 setter,而非响应式系统返回一个值和一个 setter。

注意:有些响应式系统同时返回一个 getter/setter,有些则返回两个单独的引用,但思想是一样的。

Signal 的优势

State 混淆了两个独立的概念:

  • StateReference:对状态的引用。

  • StateValue:存储在状态引用 / 存储中的实际值。

那为什么返回一个 getter 比返回一个值更好呢?因为通过返回 getter,可以将状态引用的传递与状态值的读取分开。

下面以这段 SolidJS 代码为例:

  • createSignal():分配 StateStorage 并将其初始化为 0。

  • getCount:可以传递的对状态的引用。

  • getCount():获取状态值。

上面解释了 Signal 和普通 State 的不同。那 Signal 到底有什么优势呢?Signal 是响应式的,这意味着它需要跟踪谁对状态感兴趣(订阅者),如果状态发生变化,则通知订阅者状态变化。

为了具有响应式,Signal 必须要收集谁对它的值感兴趣。它通过观察在什么情况下调用状态 getter 来获取此信息。通过从 getter 中获取值,告诉 Signal 该位置对该值感兴趣。如果值发生变化,则需要调用 getter 创建一个订阅。

这就是为什么传递状态 getter 而不是状态值很重要的原因。状态值的传递不会向 Signal 提供有关实际使用该值的位置的任何信息。这就是为什么区分状态引用和状态值在 Signal 中如此重要。

为了进行对比,这里是 Qwik 中的相同示例。请注意,(getter/setter) 已被替换为具有 .value 属性(表示 getter/setter)的单个对象。虽然语法不同,但内部的工作原理是一样的。

当单击按钮并增加值时,框架只需要将文本节点从 0 更新为 1。它可以这样做是因为在模板的初始渲染期间,Signal 已经知道 count.value 只能被文本节点访问。因此,它知道如果 count 的值发生变化,就只需要更新文本节点而无需更新其他地方。

useState () 的缺点

下面来看看在 React 中是如何使用 useState() 的以及它的缺点。

React 的 useState() 会返回一个状态值。这意味着 useState() 不知道组件或应用内部如何使用状态值。所以,一旦通过调用 setCount() 通知 React 状态更改,React 就不知道页面的哪一部分发生了更改,因此必须重新渲染整个组件,这在计算上是很昂贵的。

useRef () 不渲染

React 的 useRef() 类似于 useSignal(),但它不会导致页面重新渲染。下面的例子看起来与 useSignal() 非常相似,但它不起作用。

useRef() 的使用与 useSignal() 完全一样,用于传递对状态的引用而不是状态本身。但是,useRef () 缺少了订阅跟踪和通知。

在基于 Signal 的框架中,useSignal() 和 useRef() 是一样的。useSignal() 可以执行 useRef() 加上订阅跟踪的功能,这样就进一步简化了框架的 API。

内置的 useMemo ()

Signal 很小需要进行记忆,因为它需要做的工作很少。

下面来看一个包含两个计数器和两个子组件的例子:

这里只会更新两个 Display 组件之一的文本节点。未更新的文本节点在初始渲染后将永远不会打印。

 # 初始渲染输出
<Counter/>
<Display count={0}/>
<Display count={0}/>

# 单击时的渲染
(空白)

实际上,我们无法在 React 中实现相同的效果,因为至少会有一个组件需要重新渲染。那么下面就来看看如何在 React 中记忆组件以最小化重新渲染的次数。

但即使进行了记忆,React 也会产生多次重新渲染:

 # 初始渲染输出
<Counter/>
<Display count={0}/>
<Display count={0}/>

# 单击时的渲染
<Counter/>
<Display count={1}/>

如果没有记忆,我们会看到:

 # 初始渲染输出
<Counter/>
<Display count={0}/>
<Display count={0}/>

# 单击时的渲染
<Counter/>
<Display count={1}/>
<Display count={0}/>

这比 Signal 需要做的工作多得多。所以,这就是为什么 Signal 的工作就像把所有事情都记下来了,而不必由我们自己来记忆。

举个例子

下面就来看一个实现购物车的例子(React):

APP 组件中定义了购物车的状态 cart 以及两个子组件:

  • Main 组件:通过多层组件传递 setCart 函数,直到它到达购买按钮。

  • NavBar 组件:通过多层组件传递购物车状态,直到它到达渲染购物车的组件。

这里的问题就是每次点击购买按钮时,大部分组件树都必须重新渲染。这会导致类似于的输出:

 # 点击购买按钮时
<App/>
<Main/>
<Product/>
<NavBar/>
<Cart/>

如果使用记忆,那么就可以避免 Main 组件重新渲染,而只有 NavBar 组件重新渲染:

 # 点击购买按钮时
<App/>
<NavBar/>
<Cart/>

如果使用 Signal,输出是这样的:

 # 点击购买按钮时
<Cart/>

这大大减少了需要执行的代码量。

总结

Signal 是在应用中存储状态的一种方式,类似于 React 中的 useState()。两者的关键区别在于,Signal 返回一个 getter 和一个 setter,而非响应式系统只返回一个值和一个 setter。

Signal 是响应式的,这意味着它需要跟踪谁对状态感兴趣并通知订阅者状态更改。这是通过观察调用状态 getter 的上下文来实现的,它创建了一个订阅。

相比之下,React 中的 useState() 仅返回状态值,这意味着它不知道如何使用状态值,并且必须重新渲染整个组件树以响应状态变化。

所以说 Signal 是前端框架的未来!

关于本文
译者:@CUGGZ
译文:https://mp.weixin.qq.com/s/1VWULD5jaUEicMtAEa0MWw
作者:@MIŠKO HEVERY
原文:https://www.builder.io/blog/usesignal-is-the-future-of-web-frameworks


这期前端早读课
对你有帮助,帮” 赞 “一下,
期待下一期,帮” 在看” 一下 。

相关阅读

  • B 端设计组件课,保姆级公开课终于来了

  • 先问一个问题:面对 各大设计系统 琳琅满目 的组件,你有没有感到非常的茫然?我们看遍了各大设计系统,了解市面上的大部分组件过后,发现组件设计当中一直以来存在一个问题,不同的组
  • 聊聊选择字段在 B 端系统的意义

  • 选择对于 B 端系统来说究竟意味着什么?如果将下图两个组件摆在设计师面前,它们唯一的差别便是 一个有着右侧的下拉箭头、一个右侧没有下拉箭头。当听到了这种解释时,我也就只能
  • 无缝切换?从Vue到React

  • 阿里妹导读本文主要针对Vue开发者或新手快速上手React。本文主要分析Vue和React在开发上的区别,帮助Vue开发者快速上手React,同时也适用于前端新手入门React。单文件组件 VS c
  • 绿色动力拟通过收购扩大生活垃圾焚烧发电业务

  • 【环球网财经综合报道】2月20日,绿色动力(601330)发布关于签署股权收购框架协议的公告。公告显示,公司于2023年2月18日与中华环保产业(控股)集团有限公司、福建省丰泉环保控股有限
  • ​光伏出口何以成为中国外贸“新名片”

  • 光伏出口何以成为中国外贸的“新名片”?来看几组数据:2022年,中国光伏产品出口同比增长67.8%,与电动汽车、锂电池一道组成外贸出口“新三样”;国产光伏产品(硅片、电池片、组件)去

热门文章

  • “复活”半年后 京东拍拍二手杀入公益事业

  • 京东拍拍二手“复活”半年后,杀入公益事业,试图让企业捐的赠品、家庭闲置品变成实实在在的“爱心”。 把“闲置品”变爱心 6月12日,“益心一益·守护梦想每一步”2018年四

最新文章

  • 提升城市内涵深度 打造青春上虞城

  • 2月16日下午,绍兴市网络大城市专班专题调研上虞区网络大城市建设工作,先后走访一江两岸核心段城市风貌区、双创·鸿雁城市新区风貌区、大运河风貌提升片区,围绕规划设计、政策
  • 【第2868期】前端框架的未来:useSignal()

  • 前言Signal(信号)是一种存储应用状态的形式。今日前端早读课文章由 @CUGGZ 分享,公号:前端充电宝授权。正文从这开始~~Signal(信号)是一种存储应用状态的形式,类似于 React 中的 useS
  • 城东法院:星夜兼程保权益 执行到位安民心

  • 下足力气解决执行难近日,城东法院执行干警根据申请人提供的财产线索,星夜兼程,驱车往返海西州2000余公里,成功将财产执行到位,解决了萦绕在法官和申请人心头近两年的问题,切实将“
  • 【第2869期】浅谈 Canvas 渲染引擎

  • 前言介绍一下社区几个比较有代表性的 Canvas 渲染引擎的设计原理。今日前端早读课文章由 @null 分享,公号:前端小馆授权。正文从这开始~~用过 Canvas 的都知道它的 API 比较多,使
  • 【早说】遇到那种人怎么办?

  • When you think that life is full of“Suckers”, it is because you live in a circle of“Suckers”. Your job is not to reform the bad guys, or to become worse tha