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