2.4 ----vue render源码

Posted ttblog5

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2.4 ----vue render源码相关的知识,希望对你有一定的参考价值。

vm._render 最终是通过执行 createElement 方法并返回的是 vnode  
Vue.prototype._render = function () { var vm = this; var ref = vm.$options; var render = ref.render; var _parentVnode = ref._parentVnode; if (_parentVnode) { vm.$scopedSlots = normalizeScopedSlots( _parentVnode.data.scopedSlots, vm.$slots, vm.$scopedSlots ); } // set parent vnode. this allows render functions to have access // to the data on the placeholder node. vm.$vnode = _parentVnode; // render self var vnode; try { // There‘s no need to maintain a stack because all render fns are called // separately from one another. Nested component‘s render fns are called // when parent component is patched. currentRenderingInstance = vm;
vm.$createElement 方法定义是在执行 initRender 方法的时候,可以看到除了 vm.$createElement 方法,还有一个 vm._c 方法,它是被模板编译成的 render 函数使用,而 vm.$createElement 是用户手写 render 方法使用的, 这俩个方法支持的参数相同,并且内部都调用了 createElement 方法。 vnode
= render.call(vm._renderProxy, vm.$createElement); } catch (e) { handleError(e, vm, "render"); // return error render result, // or previous vnode to prevent render error causing blank component /* istanbul ignore else */ if (vm.$options.renderError) { try { vnode = vm.$options.renderError.call(vm._renderProxy, vm.$createElement, e); } catch (e) { handleError(e, vm, "renderError"); vnode = vm._vnode; } } else { vnode = vm._vnode; } } finally { currentRenderingInstance = null; } // if the returned array contains only a single node, allow it if (Array.isArray(vnode) && vnode.length === 1) { vnode = vnode[0]; } // return empty vnode in case the render function errored out if (!(vnode instanceof VNode)) { if (Array.isArray(vnode)) { warn( ‘Multiple root nodes returned from render function. Render function ‘ + ‘should return a single root node.‘, vm ); } vnode = createEmptyVNode(); } // set parent vnode.parent = _parentVnode; return vnode }; }

 

以上是关于2.4 ----vue render源码的主要内容,如果未能解决你的问题,请参考以下文章

vue源码分析三 -- vm._render()如何生成虚拟dom

使用带有渲染功能的 Vue.js 3 片段

[Vue源码]一起来学Vue模板编译原理-AST生成Render字符串

Vue源码后记-vFor列表渲染

Vue源码中compiler部分逻辑梳理(内有彩蛋)

Part3-2-1 Vue.js 源码剖析-首次渲染过程