You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

@preact/signals-react 2.0.0中React组件为何使用counter.value不更新?

问题描述

我正在使用2.0.0版本的@preact/signals-react实现一个简单的计数器应用:

import { signal } from "@preact/signals-react";

const counter = signal(0);

function App() {
  return (
    <div className="App">
      <header className="App-header">
        <p>
          Count: {counter.value}
        </p>
        <button onClick={() => {
          counter.value += 1;
        }}>
          Click me
        </button>
      </header>
    </div>
  );
}

export default App;

计数器应用界面

问题在于点击按钮后计数器并未更新。但如果将计数器显示代码改写为:

<p>
  Count: {counter}
</p>

组件就会重新渲染,计数器值也能正常显示。

我原本以为counter.value是访问信号值的正确方式,请问这背后的原因是什么?

原因解析

这是@preact/signals-react 2.0.0版本特意设计的行为:

  • 当你在JSX中直接传入signal实例(比如{counter})时,库会自动完成两件事:自动解包获取当前值,同时建立订阅关系。一旦signal的值发生变化,订阅机制会触发组件重新渲染,你就能看到更新后的数值。
  • 而直接访问counter.value时,在函数组件的渲染上下文里,这种方式不会触发订阅追踪。signal的订阅需要依赖库提供的追踪上下文,如果你只是单纯读取.value,组件不会感知到这个值的后续变化,自然不会重新渲染。

简单来说,2.0.0版本针对React做了优化,让signal实例可以直接在JSX中使用,省去了手动订阅和管理的步骤;而直接用.value更适合在事件回调、useEffect等非渲染追踪的场景中读取值。

内容的提问来源于stack exchange,提问作者samhodev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 22:33:12