ref内部工作原理很简单,其实就是将指令ref、:ref或v-bind:ref标识的元素实例存放在的$refs对象中当前作用域,那么我们可以通过this.$refs获取对应的元素实例。但是因为作用域继承有个小技巧,我们还是要注意从this.$refs中我们能得到的元素实例。让我告诉你一切吧!深入ref工作原理//file./src/directives/ref.tsexportconstref:Directive=({el,ctx:{scope:{$refs}},get,effect})=>{letprevRef:anyeffect(()=>{//获取指向元素的属性名constref=get()$refs[ref]=el//由于属性名可以动态生成(:ref="name"),如果新旧对应属性名称不同,则清理旧属性[prevRef]}}这个实现对吗?简洁呢?现在我们把注意力转到上下文对象(Context)的构造上//file./src/context.tsexportconstcreateScopedContext=(ctx:Context,data={})=>{onstparentScope=ctx.scopeconstmergedScope=Object.create(parentScope)Object.defineProperties(mergedScope,Object.getOwnPropertyDescriptors(data))//$refs构成$refs对象的原型链mergedScope.$refs=Object.create(parentScope.$refs)//......}$refs构成了$refs对象的原型链,那么我们可以引用元素实例createApp({App:{$template:`
