Skip to content
Discussion options

You must be logged in to vote
  • render 函数重新执行,拿到了最新的 vnode 是肯定的,但是这个最新的 vnode 并没有全部 patch。 因为 vue3 内部做了优化:

    • 编译期分析哪些节点是动态的,打上标记(PatchFlag),标记节点需要更新什么
    • 首次渲染时,将这些这些节点收集起来,放到 vnode.dynamicChildren 上
    • 数据发生变化,重新渲染时,只 patch dynamicChildren
  • 理解了这个优化后,就能解决你的疑惑了,当 r.value 发生变化时:

    • {{ rmb }} 和 {{ data }} 是 const 定义的非响应式变量,不可能会被重新赋值,所以它俩不需要 patch
    • {{ c }} 是 let 定义的变量,可能会改变,需要 patch
    • {{ data.name.city }} const 变量上的属性,也可能会被修改,也得 patch

仔细看生成的 render 函数就能明白了

return (_ctx, _cache) => {
  return (_openBlock(), _createElementBlock(_Fragment, null, [
    _createElementVNode("h1", null, _toDisplayString(r.value), 1 /* TEXT */),
    _createElementVNode("h1", null, _toDisplayString(rmb)),
    _createElementVNode("h2", null, _toDisplayString(_…

Replies: 3 comments 5 replies

Comment options

You must be logged in to vote
0 replies
Comment options

You must be logged in to vote
5 replies
@I-love-learn
Comment options

@I-love-learn
Comment options

@I-love-learn
Comment options

@edison1105
Comment options

@I-love-learn
Comment options

Answer selected by edison1105
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
2 participants