本节摘要:本节交付一张 React 到 Solid 的术语映射总表,并把映射分成"等价替换""形似神不似""Solid 独有"三类。最后用一个 console.log 实验验证 Solid 组件只执行一次——这是全册最重要的世界观校准点。
「响应式原语」是 Solid 文档里的高频词,指的是 Signal、Effect、Memo、Store 这几个最小可组合的积木。React 世界里没有完全对位的概念:Hooks 是"带状态的函数约定",而原语是"自带依赖追踪的值与计算单元"。词汇表能翻译,底层语义有位移——这正是本节要把映射分三类讲的原因,一把尺子量到底会出错。
| 你在 React 的习惯 | Solid 的对应物 | 映射性质 | 一句话差异 |
|---|---|---|---|
useState |
createSignal |
形似神不似 | setter 只通知订阅者,不重跑组件 |
useEffect |
createEffect |
形似神不似 | 依赖自动追踪,没有依赖数组 |
useMemo |
createMemo |
形似神不似 | 有真实依赖图的缓存,不是提示 |
useRef(存值) |
组件内普通变量 | 等价替换 | 组件只跑一次,变量天然持久 |
useRef(拿节点) |
ref 属性 |
等价替换 | 同名不同机制,用法接近 |
useContext |
createContext + useContext |
形似神不似 | 不会因上层 value 变化整体重渲染 |
React.memo |
不需要 | Solid 独有 | 无重渲染即无 memo 需求 |
列表 key |
For 组件 |
Solid 独有 | 按引用跟踪条目,自动移动节点 |
| 条件渲染三元 | Show / Switch |
等价替换 | 分支结构编译为定向插拔 |
Suspense |
Suspense |
等价替换 | 配合 createResource 原生协作 |
lazy + import |
lazy |
等价替换 | 返回组件可直接渲染 |
| 自定义 Hook | 组合原语 | 等价替换 | 不受 Hook 调用规则约束 |
React.lazy 边界 |
ErrorBoundary |
等价替换 | 用法接近,粒度更自由 |
表里出现频率最高的词是"形似神不似"。这四个字值得展开:所谓形似,是调用形状接近——createSignal(0) 与 useState(0) 都返回一对函数;所谓神不似,是触达范围完全不同。React 的 setter 是"广播 + 重算"模型,Solid 的 setter 是"点对点投递"模型。后文每一章都在为这张表的某一行展开细讲,这里先建立整体感。

用代码验证。同一个计数按钮,先看 React 版本:
import { useState } from "react"; function Counter() { console.log("Counter 执行了"); // 每次点击都会打印 const [count, setCount] = useState(0); return <button onClick={() => setCount(count + 1)}>点击了 {count} 次</button>; }
再看 Solid 版本:
import { createSignal } from "solid-js"; function Counter() { console.log("Counter 执行了"); // 只在挂载时打印,之后再也不打 const [count, setCount] = createSignal(0); return <button onClick={() => setCount(count() + 1)}>点击了 {count()} 次</button>; }
逐行对比差异。第一处不同是读取方式:React 直接写 count(值在重跑时重新获得),Solid 写 count()(调用即读取,读取即登记订阅)。JSX 里那对圆括号是全册最重要的字符——它告诉运行时"此刻这个组件正在被读取依赖"。第二处不同是执行范围:点击后 React 从 Counter 函数头开始重跑,console.log 再打一条;Solid 只有 JSX 里那个文本节点对应的绑定函数被调用,函数体的其他代码纹丝不动。
推论马上就来了:既然组件只跑一次,"组件函数体内的局部变量"就是稳定持久的——这直接取代了 useRef 存值的用途;也解释了 props 为什么不能解构,解构发生在函数执行的那一刻,拿到的是当时的快照,后续更新再也同步不到。这个坑先埋在这里,第 3 章拆。
等价替换类(ref 属性、Suspense、lazy)可以带着肌肉记忆直接用,迁移成本最低。形似神不似类是本册的重点,每一组都要在对应章节里用代码对照拆开:第 2 章负责 Signal、Effect、Memo、Store 四行,第 3 章负责自定义 Hook 与生命周期两行。Solid 独有类(React.memo 的缺席、For 的引用跟踪)意味着 React 里的一整套优化动作在 Solid 里直接作废——不是"用不上",而是"问题本身不存在了",第 4 章与第 8 章会反复回到这个话题。
💡 关键直觉:拿到任何一段 Solid 代码,先找圆括号。
xxx()出现在哪里,依赖就登记到哪里;更新也只会流回到哪里。读懂了圆括号,就读懂了细粒度响应式。
count() 的圆括号是依赖登记点,也是更新投放点。对照表之外,把第一周最容易产生的认知错觉也列出来,逐条配一句"实际情况"。
错觉一:"没有重渲染,那 state 改了谁来刷新界面?"实际情况:绑定制刷新——编译器为每个表达式位置生成了专属的写入函数,信号变化时它们被精确调用。刷新这件事从组件级下沉到了节点级。
错觉二:"props 和 React 的 props 是同一个东西。"实际情况:形状一致,机制是取值器对象。读取时机决定值是否保鲜,这是第 3 章的核心议题,先在词汇层面把"props 对象"标记为形似神不似。
错觉三:"条件渲染和列表渲染是语法问题。"实际情况:在 Solid 里它们是架构问题——表达式只求值一次的模型下,列表必须交给专门的跟踪组件,这在 React 里是风格偏好,在这里是正确性要求。
错觉四:"测试和工具链也要重学一遍。"实际情况:这两块的迁移成本出乎意料地低,第 9 章会展示查询 API 几乎原样平移。第一周不需要为它们焦虑。
四条错觉对应四类 API 面貌,也预告了全册的章节安排:执行模型在先(第 2 章),props 与生命周期其次(第 3 章),控制流再次(第 4 章),工具面殿后(第 7、9 章)。词汇表是地图,错觉清单是路上的坑,两者合起来,第一周的路线就算画完了。
💡 给团队迁移组织者的建议:把本节的总对照表打印成桌面卡,前两周的代码评审遇到争议就翻卡。争议减少的速度,就是心智模型对齐的速度。
下一章进入状态原语的逐个对照,从最常用的 createSignal 与 useState 开始。