wip: transition group root compat

This commit is contained in:
Evan You 2021-04-07 15:54:36 -04:00
parent 1c2c77eb9f
commit cf6bcdf895
4 changed files with 54 additions and 15 deletions

View File

@ -32,7 +32,10 @@ export const enum DeprecationTypes {
V_ON_KEYCODE_MODIFIER = 'V_ON_KEYCODE_MODIFIER', V_ON_KEYCODE_MODIFIER = 'V_ON_KEYCODE_MODIFIER',
PROPS_DEFAULT_THIS = 'PROPS_DEFAULT_THIS', PROPS_DEFAULT_THIS = 'PROPS_DEFAULT_THIS',
CUSTOM_DIR = 'CUSTOM_DIR', CUSTOM_DIR = 'CUSTOM_DIR',
WATCH_ARRAY = 'WATCH_ARRAY' WATCH_ARRAY = 'WATCH_ARRAY',
TRANSITION_CLASSES = 'TRANSITION_CLASSES',
TRANSITION_GROUP_ROOT = 'TRANSITION_GROUP_ROOT'
} }
type DeprecationData = { type DeprecationData = {
@ -213,11 +216,28 @@ const deprecationData: Record<DeprecationTypes, DeprecationData> = {
message: message:
`"watch" option or vm.$watch on an array value will no longer ` + `"watch" option or vm.$watch on an array value will no longer ` +
`trigger on array mutation unless the "deep" option is specified. ` + `trigger on array mutation unless the "deep" option is specified. ` +
`If current usage is intended, you can suppress this warning with:` + `If current usage is intended, you can disable the compat behavior and ` +
`suppress this warning with:` +
`\n\n configureCompat({ ${ `\n\n configureCompat({ ${
DeprecationTypes.WATCH_ARRAY DeprecationTypes.WATCH_ARRAY
}: { mode: 3 }})\n`, }: { enabled: false }})\n`,
link: `https://v3.vuejs.org/guide/migration/watch.html` link: `https://v3.vuejs.org/guide/migration/watch.html`
},
[DeprecationTypes.TRANSITION_CLASSES]: {
message: `` // this feature cannot be runtime-detected
},
[DeprecationTypes.TRANSITION_GROUP_ROOT]: {
message:
`<TransitionGroup> no longer renders a root <span> element by ` +
`default if no "tag" prop is specified. If you do not rely on the span ` +
`for styling, you can disable the compat behavior and suppress this ` +
`warning with:` +
`\n\n configureCompat({ ${
DeprecationTypes.TRANSITION_GROUP_ROOT
}: { enabled: false }})\n`,
link: `https://v3.vuejs.org/guide/migration/transition-group.html`
} }
} }
@ -250,7 +270,7 @@ export function warnDeprecation(key: DeprecationTypes, ...args: any[]) {
hasWarned[dupKey] = true hasWarned[dupKey] = true
const { message, link } = deprecationData[key] const { message, link } = deprecationData[key]
warn( warn(
`(DEPRECATION ${key}) ${ `(deprecation ${key}) ${
typeof message === 'function' ? message(...args) : message typeof message === 'function' ? message(...args) : message
}${link ? `\n Details: ${link}` : ``}` }${link ? `\n Details: ${link}` : ``}`
) )

View File

@ -288,12 +288,13 @@ export { LegacyConfig } from './compat/globalConfig'
import { warnDeprecation } from './compat/deprecations' import { warnDeprecation } from './compat/deprecations'
import { createCompatVue } from './compat/global' import { createCompatVue } from './compat/global'
import { isCompatEnabled } from './compat/compatConfig' import { isCompatEnabled, softAssertCompatEnabled } from './compat/compatConfig'
const _compatUtils = { const _compatUtils = {
warnDeprecation, warnDeprecation,
createCompatVue, createCompatVue,
isCompatEnabled isCompatEnabled,
softAssertCompatEnabled
} }
export const compatUtils = (__COMPAT__ export const compatUtils = (__COMPAT__

View File

@ -3,7 +3,9 @@ import {
BaseTransitionProps, BaseTransitionProps,
h, h,
warn, warn,
FunctionalComponent FunctionalComponent,
compatUtils,
DeprecationTypes
} from '@vue/runtime-core' } from '@vue/runtime-core'
import { isObject, toNumber, extend } from '@vue/shared' import { isObject, toNumber, extend } from '@vue/shared'
@ -99,10 +101,13 @@ export function resolveTransitionProps(
} = rawProps } = rawProps
// legacy transition class compat // legacy transition class compat
const legacyClassEnabled =
__COMPAT__ &&
compatUtils.isCompatEnabled(DeprecationTypes.TRANSITION_CLASSES)
let legacyEnterFromClass: string let legacyEnterFromClass: string
let legacyAppearFromClass: string let legacyAppearFromClass: string
let legacyLeaveFromClass: string let legacyLeaveFromClass: string
if (__COMPAT__) { if (__COMPAT__ && legacyClassEnabled) {
const toLegacyClass = (cls: string) => cls.replace(/-from$/, '') const toLegacyClass = (cls: string) => cls.replace(/-from$/, '')
if (!rawProps.enterFromClass) { if (!rawProps.enterFromClass) {
legacyEnterFromClass = toLegacyClass(enterFromClass) legacyEnterFromClass = toLegacyClass(enterFromClass)
@ -148,7 +153,7 @@ export function resolveTransitionProps(
hook && hook(el, resolve) hook && hook(el, resolve)
nextFrame(() => { nextFrame(() => {
removeTransitionClass(el, isAppear ? appearFromClass : enterFromClass) removeTransitionClass(el, isAppear ? appearFromClass : enterFromClass)
if (__COMPAT__) { if (__COMPAT__ && legacyClassEnabled) {
removeTransitionClass( removeTransitionClass(
el, el,
isAppear ? legacyAppearFromClass : legacyEnterFromClass isAppear ? legacyAppearFromClass : legacyEnterFromClass
@ -166,7 +171,7 @@ export function resolveTransitionProps(
onBeforeEnter(el) { onBeforeEnter(el) {
onBeforeEnter && onBeforeEnter(el) onBeforeEnter && onBeforeEnter(el)
addTransitionClass(el, enterFromClass) addTransitionClass(el, enterFromClass)
if (__COMPAT__) { if (__COMPAT__ && legacyClassEnabled) {
addTransitionClass(el, legacyEnterFromClass) addTransitionClass(el, legacyEnterFromClass)
} }
addTransitionClass(el, enterActiveClass) addTransitionClass(el, enterActiveClass)
@ -174,7 +179,7 @@ export function resolveTransitionProps(
onBeforeAppear(el) { onBeforeAppear(el) {
onBeforeAppear && onBeforeAppear(el) onBeforeAppear && onBeforeAppear(el)
addTransitionClass(el, appearFromClass) addTransitionClass(el, appearFromClass)
if (__COMPAT__) { if (__COMPAT__ && legacyClassEnabled) {
addTransitionClass(el, legacyAppearFromClass) addTransitionClass(el, legacyAppearFromClass)
} }
addTransitionClass(el, appearActiveClass) addTransitionClass(el, appearActiveClass)
@ -184,7 +189,7 @@ export function resolveTransitionProps(
onLeave(el, done) { onLeave(el, done) {
const resolve = () => finishLeave(el, done) const resolve = () => finishLeave(el, done)
addTransitionClass(el, leaveFromClass) addTransitionClass(el, leaveFromClass)
if (__COMPAT__) { if (__COMPAT__ && legacyClassEnabled) {
addTransitionClass(el, legacyLeaveFromClass) addTransitionClass(el, legacyLeaveFromClass)
} }
// force reflow so *-leave-from classes immediately take effect (#2593) // force reflow so *-leave-from classes immediately take effect (#2593)
@ -192,7 +197,7 @@ export function resolveTransitionProps(
addTransitionClass(el, leaveActiveClass) addTransitionClass(el, leaveActiveClass)
nextFrame(() => { nextFrame(() => {
removeTransitionClass(el, leaveFromClass) removeTransitionClass(el, leaveFromClass)
if (__COMPAT__) { if (__COMPAT__ && legacyClassEnabled) {
removeTransitionClass(el, legacyLeaveFromClass) removeTransitionClass(el, legacyLeaveFromClass)
} }
addTransitionClass(el, leaveToClass) addTransitionClass(el, leaveToClass)

View File

@ -20,7 +20,9 @@ import {
createVNode, createVNode,
onUpdated, onUpdated,
SetupContext, SetupContext,
toRaw toRaw,
compatUtils,
DeprecationTypes
} from '@vue/runtime-core' } from '@vue/runtime-core'
import { extend } from '@vue/shared' import { extend } from '@vue/shared'
@ -99,7 +101,18 @@ const TransitionGroupImpl = {
return () => { return () => {
const rawProps = toRaw(props) const rawProps = toRaw(props)
const cssTransitionProps = resolveTransitionProps(rawProps) const cssTransitionProps = resolveTransitionProps(rawProps)
const tag = rawProps.tag || Fragment let tag = rawProps.tag || Fragment
if (
__COMPAT__ &&
!rawProps.tag &&
compatUtils.softAssertCompatEnabled(
DeprecationTypes.TRANSITION_GROUP_ROOT
)
) {
tag = 'span'
}
prevChildren = children prevChildren = children
children = slots.default ? getTransitionRawChildren(slots.default()) : [] children = slots.default ? getTransitionRawChildren(slots.default()) : []