petite-vue源码剖析-ref的工作原理
【petite-vue源码剖析-ref的工作原理】ref
内部的工作原理十分简单,其实就是将指令ref
、:ref
或v-bind:ref
标识的元素实例存储到当前作用域的$refs
对象中,那么我们就可以通过this.$refs
获取对应的元素实例。但由于作用域继承上有点小窍门,所以我们能从this.$refs
获取的元素实例还是需要注意一下。下面让我为你一一道来吧!
深入ref
工作原理
//文件 ./src/directives/ref.tsexport const ref: Directive = ({
el,
ctx: {
scope: { $refs }
},
get,
effect
}) => {
let prevRef: any
effect(() => {
// 获取指向元素的属性名称
const ref = get()
$refs[ref] = el
// 由于属性名称是可以动态生成的(:ref="name"),若新旧对应的属性名称不同,则清理旧属性
if (prevRef && ref != prevRef) {
delete $refs[prevRef]
}
prevRef = ref
})return () => {
prevRef && delete $refs[prevRef]
}
}
这段实现是不是言简意赅呢?现在让我们把目光转向上下文对象(Context)的构建吧
//文件 ./src/context.tsexport const createScopedContext = (ctx: Context, data = https://www.it610.com/article/{}) => {
onst parentScope = ctx.scope
const mergedScope = Object.create(parentScope)
Object.defineProperties(mergedScope, Object.getOwnPropertyDescriptors(data))
// $refs构成$refs对象的原型链
mergedScope.$refs = Object.create(parentScope.$refs)
// ......
}
$refs构成$refs对象的原型链,那么我们就可以这样引用元素实例
createApp({
App: {
$template: ``,
Modal: {
$template: `
`,
handleHide() {
this.$refs.container.style.display = 'none'
}
}
}
}).mount('[v-scope]')
总结 下一篇《petite-vue源码剖析-优化手段template详解》我们将着手解决petite-vue在线模板和在线渲染造成用户体验待优化的问题,敬请期待。
尊重原创,转载请注明来自:https://www.cnblogs.com/fsjohnhuang/p/16006899.html 肥仔John
推荐阅读
- Apache hudi 源码分析 - 写时处理优化小文件问题(flink)
- type_traits源码阅读笔记
- react源码debugger之理解调度(使用react17版本)
- petite-vue源码剖析-双向绑定`v-model`的工作原理
- python|矩阵快速幂算法及相关应用(含python源码)
- 舒服,给Spring贡献一波源码。
- 基于matlab的捕食算法,【优化求解】基于matlab细菌觅食算法的函数优化分析【含Matlab源码 217期】...
- 走进开源项目|走进开源项目 - urlcat 源码分析
- Vue3响应式原理
- kube-scheduler源码分析(3)-抢占调度分析