vue响应式系统与jsx是协作关系:响应式提供数据变化通知,jsx通过渲染函数生成新虚拟dom;二者分工明确,缺一不可,依赖收集与触发更新自然衔接。

Vue 的响应式系统和 JSX 渲染逻辑之间不是“自动绑定”的关系,而是协作关系:响应式系统提供数据变化通知能力,JSX(通过渲染函数)负责接收这些变化并生成新的虚拟 DOM。二者分工明确,缺一不可。
响应式数据是 JSX 更新的前提
JSX 本身只是语法糖,最终被编译为 h() 调用。它不感知响应式——但你在 JSX 中访问的变量(如 count、list)如果来自 ref 或 reactive,就会触发 Vue 的依赖追踪机制:
- 首次渲染时,JSX 中读取响应式字段会收集依赖;
- 后续该字段变更,会触发组件重新执行
render函数; - 新返回的 VNode 与旧 VNode 对比后,高效更新真实 DOM。
没有响应式数据,JSX 就只是静态结构;没有 JSX(或渲染函数),响应式变化就无法驱动视图更新。
JSX 中的响应式写法需符合规则
在 JSX 中使用响应式值,必须保持“可追踪性”:
- 直接解构
const { count } = toRefs(state)后使用count.value—— ✅ 可追踪; - 错误写法:
const count = state.count(未用toRefs或unref)—— ❌ 丢失响应性; - 事件处理器中修改响应式数据,如
onClick={() => count.value++}—— ✅ 触发更新; - 条件渲染、列表映射都依赖响应式源,例如
{show ? <div>...</div> : null}或{items.map(i => <li key="{i.id}">{i.name}</li>)}—— ✅ 自动重算。
事件与响应式联动靠显式调用
JSX 中的事件绑定(如 onClick)本身不响应式,但它通常触发响应式数据的变更:
-
<button onclick="{()"> visible.value = !visible.value}></button>—— 点击改变响应式布尔值; - 这个赋值操作会通知 Vue,“visible 改了”,进而触发整个组件重新渲染;
- 注意:不能在 JSX 中写副作用逻辑(如直接
fetch()+setState),应封装在函数中,由响应式状态驱动 UI 变化。
避免常见断连陷阱
以下情况会导致 JSX 不再响应:
- 把响应式对象展开后传入 JSX 子组件,却没用
toRefs或v-bind解构 —— 子组件收不到更新; - 在 JSX 外部缓存了非响应式副本(如
const cached = [...state.list]),后续修改state.list不影响cached; - 使用
computed但未在 JSX 中直接读取其返回值(比如只赋给局部变量),导致依赖未建立。
本质上,Vue 的响应式系统管“数据变”,JSX 渲染逻辑管“怎么变”,两者通过依赖收集和触发更新自然衔接,不需要额外桥接代码。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











