mirror of https://github.com/vuejs/vue.git
[weex] handle enter transition property fallback and warn edge cases
This commit is contained in:
parent
a0d43d332f
commit
a18a301892
|
|
@ -72,9 +72,9 @@ function enter (_, vnode) {
|
||||||
|
|
||||||
const stylesheet = vnode.context.$options.style || {}
|
const stylesheet = vnode.context.$options.style || {}
|
||||||
const startState = stylesheet[startClass]
|
const startState = stylesheet[startClass]
|
||||||
const endState = stylesheet[toClass] || stylesheet[activeClass]
|
|
||||||
const transitionProperties = (stylesheet['@TRANSITION'] && stylesheet['@TRANSITION'][activeClass]) || {}
|
const transitionProperties = (stylesheet['@TRANSITION'] && stylesheet['@TRANSITION'][activeClass]) || {}
|
||||||
const expectsCSS = startState && endState
|
const endState = getEnterTargetState(el, stylesheet, startClass, toClass, activeClass, vnode.context)
|
||||||
|
const needAnimation = Object.keys(endState).length > 0
|
||||||
|
|
||||||
const cb = el._enterCb = once(() => {
|
const cb = el._enterCb = once(() => {
|
||||||
if (cb.cancelled) {
|
if (cb.cancelled) {
|
||||||
|
|
@ -99,7 +99,7 @@ function enter (_, vnode) {
|
||||||
}
|
}
|
||||||
enterHook && enterHook(el, cb)
|
enterHook && enterHook(el, cb)
|
||||||
|
|
||||||
if (endState) {
|
if (needAnimation) {
|
||||||
const animation = vnode.context._requireWeexModule('animation')
|
const animation = vnode.context._requireWeexModule('animation')
|
||||||
animation.transition(el.ref, {
|
animation.transition(el.ref, {
|
||||||
styles: endState,
|
styles: endState,
|
||||||
|
|
@ -121,7 +121,7 @@ function enter (_, vnode) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!expectsCSS && !userWantsControl) {
|
if (!needAnimation && !userWantsControl) {
|
||||||
cb()
|
cb()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -165,7 +165,6 @@ function leave (vnode, rm) {
|
||||||
const startState = stylesheet[leaveClass]
|
const startState = stylesheet[leaveClass]
|
||||||
const endState = stylesheet[leaveToClass] || stylesheet[leaveActiveClass]
|
const endState = stylesheet[leaveToClass] || stylesheet[leaveActiveClass]
|
||||||
const transitionProperties = (stylesheet['@TRANSITION'] && stylesheet['@TRANSITION'][leaveActiveClass]) || {}
|
const transitionProperties = (stylesheet['@TRANSITION'] && stylesheet['@TRANSITION'][leaveActiveClass]) || {}
|
||||||
const expectsCSS = startState && endState
|
|
||||||
|
|
||||||
const cb = el._leaveCb = once(() => {
|
const cb = el._leaveCb = once(() => {
|
||||||
if (el.parentNode && el.parentNode._pending) {
|
if (el.parentNode && el.parentNode._pending) {
|
||||||
|
|
@ -216,7 +215,7 @@ function leave (vnode, rm) {
|
||||||
}
|
}
|
||||||
|
|
||||||
leave && leave(el, cb)
|
leave && leave(el, cb)
|
||||||
if (!expectsCSS && !userWantsControl) {
|
if (!endState && !userWantsControl) {
|
||||||
cb()
|
cb()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -262,3 +261,43 @@ const autoCssTransition = cached(name => {
|
||||||
appearActiveClass: `${name}-enter-active`
|
appearActiveClass: `${name}-enter-active`
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// determine the target animation style for an entering transition.
|
||||||
|
function getEnterTargetState (el, stylesheet, startClass, endClass, activeClass, vm) {
|
||||||
|
const targetState = {}
|
||||||
|
const startState = stylesheet[startClass]
|
||||||
|
const endState = stylesheet[endClass]
|
||||||
|
const activeState = stylesheet[activeClass]
|
||||||
|
// 1. fallback to element's default styling
|
||||||
|
if (startState) {
|
||||||
|
for (const key in startState) {
|
||||||
|
targetState[key] = el.style[key]
|
||||||
|
if (
|
||||||
|
targetState[key] == null &&
|
||||||
|
(!activeState || activeState[key] == null) &&
|
||||||
|
(!endState || endState[key] == null)
|
||||||
|
) {
|
||||||
|
console.log(
|
||||||
|
`transition property "${key}" is declared in enter starting class (.${startClass}), ` +
|
||||||
|
`but not declared anywhere in enter ending class (.${endClass}), ` +
|
||||||
|
`enter active cass (.${activeClass}) or the element's default styling. ` +
|
||||||
|
`Note in Weex, CSS properties need explicit values to be transitionable.`
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 2. if state is mixed in active state, extract them while excluding
|
||||||
|
// transition properties
|
||||||
|
if (activeState) {
|
||||||
|
for (const key in activeState) {
|
||||||
|
if (key.indexOf('transition') !== 0) {
|
||||||
|
targetState[key] = activeState[key]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 3. explicit endState has highest priority
|
||||||
|
if (endState) {
|
||||||
|
extend(targetState, endState)
|
||||||
|
}
|
||||||
|
return targetState
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue