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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 14:32:09