Hooks:React 的主力工具
React Hooks 彻底革新了函数组件的写法,使得我们无需类组件的复杂性,就能实现 state 管理(useState)、副作用处理(useEffect)以及性能优化计算(useMemo)。
但在大型应用中,Hooks 往往会带来以下问题:
渲染过载:组件树层级较深时,频繁的重新渲染会导致 UI 性能下降。
依赖地狱:useEffect 和 useMemo 的依赖数组越来越复杂,极易引入 bug。
代码复杂度增加:跨组件管理 state 和副作用通常需要引入 Redux 或 Zustand 等库,带来额外开销。
Signals:为可扩展性而生
Signals 是一种细粒度的响应式系统,能以极高的效率管理 state。与 React 的 useState 不同,useState 每次变更都会触发整个组件重新渲染,而 Signals 只会更新依赖它们的那部分 UI,实现精准更新。
Signals 是轻量且自包含的状态单元。当它们的值发生变化时,会通知所有订阅者(例如你的 UI 或业务逻辑),而不会连带触发整个组件的重新渲染周期。
import { signal } from'@preact/signals-react';
constcount=signal(0); // Create a signal
console.log(count.value); // Read: 0
count.value=5; // Write: Updates subscribers
下面是一个来自于 CodeSandbox 的具体示例。
示例链接:
https://codesandbox.io/p/sandbox/react19-signals-101-s3q37h?file=%2Fsrc%2FApp.js%3A30%2C20&from-embed[!tip]
译者备注:请务必打开 CodeSandbox 查看示例代码
在上面的示例中,点击第一个按钮时,你会在控制台日志中看到两个子组件都被重新渲染了。而当你点击第二个按钮时,只有 ChildY 组件被渲染。原因在于,第一个按钮更新的是 React 的 state,而第二个按钮更新的是 Signal。由于 Signal 只在 ChildY 中被使用,因此只有该组件被触发渲染。
Signals 更具可扩展性,原因在于它们:
消除不必要的重新渲染:只更新依赖的 DOM 节点或计算逻辑,而非整个组件。
简化副作用管理:自动追踪依赖,告别手动维护依赖数组。
提升可维护性:将 state 和逻辑集中管理,降低大型代码库的复杂度。