一次在 Vue3 中使用render函数的事故,从源码中找到了答案

在 Vue3 版本 3.0.4 中,使用 render 函数创建组件时,直接通过 ref 获得的数据是原始值而非响应式对象,导致动态绑定失效。本文通过源码分析,发现这是由于在 setup 函数执行后,ref 的值被转换。解决方案是在 setup 函数中返回一个包含 ref 的对象,或者直接返回一个函数作为 render 函数。返回函数时,该函数会被用作组件的 render 函数,从而实现正确显示内容。
摘要由CSDN通过智能技术生成

一次在 Vue3 中使用render函数的事故,从源码中找到了答案

第一遍看 vue3 的源码,有不对的地方,希望各位大佬能指出,感谢!!!

Vue3 版本 3.0.4

Vue3.0 创建组件时,在 render 函数中使用 setup 函数中返回的 ref 数据,无法动态绑定

示例:

Vue.createApp({
   
    setup() {
   
        const elRef = Vue.ref(null)
        Vue.onMounted(() => {
   
        	elRef.value.innerHTML = "123"
        })
        return {
   
        	elRef
        }
    },
    render() {
   
        return Vue.h("div", {
   
            ref: this.elRef
        })
    }
}).mount("#app")

浏览器报错
image-20201209111428308

查找问题

1、找到 render 函数的执行

源码位置:https://github.com/vuejs/vue-next/blob/master/packages/runtime-core/src/componentRenderUtils.ts 77行

删减后的代码:

export function renderComponentRoot(
  instance: ComponentInternalInstance
): VNode {
   
  const {
   
    proxy,
    withProxy,
    props,
    render,
    renderCache,
    data,
    setupState,
    ctx
  } = instance

  let result
  try {
   
    let fallthroughAttrs
    if (vnode.shapeFlag & ShapeFlags.STATEFUL_COMPONENT) {
   
	  const proxyToUse = withProxy 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值