Vue3 TSX中响应式变量更新的渲染机制及代码疑问
Vue3 TSX 响应式更新与渲染机制问题解答
问题1:Vue3的TSX写法中,修改响应式变量时,是整个返回的渲染函数刷新,还是仅局部调用?
- Vue3的组件更新以组件实例为单位:当响应式变量触发依赖更新时,会重新执行组件的渲染函数(即setup返回的函数),生成全新的虚拟DOM。
- 但Vue的diff算法会对比新旧虚拟DOM,最终仅将实际变化的部分更新到真实DOM,不会全量替换整个组件的DOM结构。
- TSX和模板写法的核心更新逻辑完全一致,只是编写虚拟DOM的方式不同。
问题2:示例代码中,genComponent内的变量变更时为何会触发genComponent2执行?
示例代码如下:
<script lang="tsx"> import { defineComponent, ref } from 'vue'; function genComponent() { console.log(`genComponent`) const a = ref('kkk'); setTimeout(() => { a.value = 'aaa'; console.log(`change to aaaa!!!`); }, 3000); return <div>{a.value}</div>; } function genComponent2() { console.log(`genComponent2`) const a = ref('zzz'); return <div>{a.value}</div>; } export default defineComponent({ name: 'MyComponent', setup() { return () => <div> <div> { genComponent() } </div> <div> { genComponent2() } </div> </div> }, }); </script>
原因解析:
genComponent和genComponent2是普通JavaScript函数,而非Vue组件。每次组件渲染函数执行时,这两个函数都会被直接调用。- 当
genComponent内的a.value变更时,该ref的依赖被触发,导致组件进入更新流程:重新执行setup返回的渲染函数。 - 在渲染函数重新执行的过程中,
genComponent()和genComponent2()会被依次调用,因此会看到genComponent2的日志打印。 - 额外注意:每次执行
genComponent都会创建新的ref实例,第一次渲染时创建的ref被收集为依赖,其value变更触发更新;更新时创建的新ref不会被收集依赖,但不影响渲染函数整体执行的逻辑。
内容的提问来源于stack exchange,提问作者natsusao
相关产品推荐
相关产品推荐

