赞
踩
<!-- 场景设置 -->
<!-- 父组件 -->
<div>
<test>我是放在组件中的slot: {{name}}</test>
</div>
data() {
return { name: 11 };
}
<!-- 子组件 -->
<main>
我在子组件中
<slot></slot>
</main>
插槽的作用域是父组件实例的作用域,比如上面的父组件会被解析成如下的渲染函数
with(this) {
return _c('div', {}, [
_c('test', [
'我是放在组件中的slot' + name
])
])
}
上面this即指代的是父组件的实例,name就会去父组件上获取
当父组件渲染完毕,会得到一个完整的VNode,上面存储着描述DOM的所有信息
{
tag: 'div',
children: [{
tag: 'test',
children: '我是放在组件中的slot:11'
}]
}
从上面的VNode信息可以看出,slot其实被当做了test组建的子组件。
接下来的异步就是patch(创建DOM并插入到页面
),当Vue遍历到上面vnode的children是,遇到了test这个节点,发现没有test这种标签,认定它是一个组件后,会当做一个组件去解析
Slot转存会经过以下步骤
['我是放在组件中的slot:11']
, 并传递给组件选项_renderChildren
_renderChildren
放在$slot
中_t()
函数。_t实际上是renderSlot
函数function installRenderHelpers(target) {
target._t = renderSlot;
}
function renderSlot(name) {
return this.$slots[name]
}
最后_t('default')
执行完毕,返回插槽节点,于是test组件渲染成了下面
with(this) {
return _c('main', {
"我在子组件里面",
['我是放在组件的 slot 11']
})
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。