export default {
// 函数式组件可以节省性能,缺点是没有实例了,不能使用this
functional: true,
name: 'router-view',
/*
data 传递给组件的整个数据对象
parent 对父组件的引用
*/
render(h, {data, parent}) {
let route = parent.$route // 会做依赖收集
let depth = 0
// 获取匹配的路由,如地址栏输入:/about/info 输出 [{path:'/about',...}, {path: '/about/history',...}]
let records = route.matched
data.routerView = true // 渲染router-view时标记它是一个router-view
while(parent){ // 根据matched 渲染对应的router-view
if (parent.$vnode && parent.$vnode.data.routerView){
depth++;
}
parent = parent.$parent;
}
let record = route.matched[depth];
// 如果没有匹配的记录渲染空值
if(!record){
return h();
}
// records[depth].component 渲染第几个路由
return h(records[depth].component, data)
}
}
/*
$vonde 和 _vnode 的区别?
$vnode 指的是组件
_vnode 表示组件中的内容
*/