You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
122 lines
2.7 KiB
122 lines
2.7 KiB
|
|
export default { |
|
name: 'NuxtChild', |
|
functional: true, |
|
props: { |
|
nuxtChildKey: { |
|
type: String, |
|
default: '' |
|
}, |
|
keepAlive: Boolean, |
|
keepAliveProps: { |
|
type: Object, |
|
default: undefined |
|
} |
|
}, |
|
render (_, { parent, data, props }) { |
|
const h = parent.$createElement |
|
|
|
data.nuxtChild = true |
|
const _parent = parent |
|
const transitions = parent.$nuxt.nuxt.transitions |
|
const defaultTransition = parent.$nuxt.nuxt.defaultTransition |
|
|
|
let depth = 0 |
|
while (parent) { |
|
if (parent.$vnode && parent.$vnode.data.nuxtChild) { |
|
depth++ |
|
} |
|
parent = parent.$parent |
|
} |
|
data.nuxtChildDepth = depth |
|
const transition = transitions[depth] || defaultTransition |
|
const transitionProps = {} |
|
transitionsKeys.forEach((key) => { |
|
if (typeof transition[key] !== 'undefined') { |
|
transitionProps[key] = transition[key] |
|
} |
|
}) |
|
|
|
const listeners = {} |
|
listenersKeys.forEach((key) => { |
|
if (typeof transition[key] === 'function') { |
|
listeners[key] = transition[key].bind(_parent) |
|
} |
|
}) |
|
if (process.client) { |
|
// Add triggerScroll event on beforeEnter (fix #1376) |
|
const beforeEnter = listeners.beforeEnter |
|
listeners.beforeEnter = (el) => { |
|
// Ensure to trigger scroll event after calling scrollBehavior |
|
window.$nuxt.$nextTick(() => { |
|
window.$nuxt.$emit('triggerScroll') |
|
}) |
|
if (beforeEnter) { |
|
return beforeEnter.call(_parent, el) |
|
} |
|
} |
|
} |
|
|
|
// make sure that leave is called asynchronous (fix #5703) |
|
if (transition.css === false) { |
|
const leave = listeners.leave |
|
|
|
// only add leave listener when user didnt provide one |
|
// or when it misses the done argument |
|
if (!leave || leave.length < 2) { |
|
listeners.leave = (el, done) => { |
|
if (leave) { |
|
leave.call(_parent, el) |
|
} |
|
|
|
_parent.$nextTick(done) |
|
} |
|
} |
|
} |
|
|
|
let routerView = h('routerView', data) |
|
|
|
if (props.keepAlive) { |
|
routerView = h('keep-alive', { props: props.keepAliveProps }, [routerView]) |
|
} |
|
|
|
return h('transition', { |
|
props: transitionProps, |
|
on: listeners |
|
}, [routerView]) |
|
} |
|
} |
|
|
|
const transitionsKeys = [ |
|
'name', |
|
'mode', |
|
'appear', |
|
'css', |
|
'type', |
|
'duration', |
|
'enterClass', |
|
'leaveClass', |
|
'appearClass', |
|
'enterActiveClass', |
|
'enterActiveClass', |
|
'leaveActiveClass', |
|
'appearActiveClass', |
|
'enterToClass', |
|
'leaveToClass', |
|
'appearToClass' |
|
] |
|
|
|
const listenersKeys = [ |
|
'beforeEnter', |
|
'enter', |
|
'afterEnter', |
|
'enterCancelled', |
|
'beforeLeave', |
|
'leave', |
|
'afterLeave', |
|
'leaveCancelled', |
|
'beforeAppear', |
|
'appear', |
|
'afterAppear', |
|
'appearCancelled' |
|
]
|
|
|