// 注册函数式组件ref export function registerRef(vnode, context) { if (!context.data.ref) { return vnode; } // 备份vnode原有的insert周期函数 const hackInsert = vnode.data.hook.insert; // 新的vnode的insert周期函数 vnode.data.hook.insert = function(config) { hackInsert(config); // 当vnode生成实例后,通过上下文反写入父组件的refs; context.parent.$refs[context.data.ref] = config.componentInstance || config.elm; // ref本身就有组件实例和dom节点两种情况,优先取实例 }; return vnode; } // 简写注册ref export function ref(name, context) { return registerRef(context._c(name, context), context); } export default { registerRef, ref, };