function enter({ el, cb }) {
  const {
    css,
    type,
    enterClass,
    enterToClass,
    enterActiveClass,
    appearClass,
    appearToClass,
    appearActiveClass,
    onBeforeEnter,
    onEnter,
    onAfterEnter,
    onEnterCancelled,
    onBeforeAppear,
    appear,
    onAppear,
    onAfterAppear,
    onAppearCancelled,
    duration,
  } = this.transitionResolved

  const isAppear = this.isAppear

  if (isUndef(el)) {
    return
  }

  if (isAppear && !appear && appear !== '') {
    return
  }

  if (isDef(el._enterCb) || el.nodeType !== 1) {
    return
  }

  const startClass = isAppear && appearClass ? appearClass : enterClass
  const activeClass =
    isAppear && appearActiveClass ? appearActiveClass : enterActiveClass
  const toClass = isAppear && appearToClass ? appearToClass : enterToClass

  const beforeEnterHook = isAppear
    ? onBeforeAppear || onBeforeEnter
    : onBeforeEnter
  const enterHook = isAppear ? onAppear || onEnter : onEnter
  const afterEnterHook = isAppear ? onAfterAppear || onAfterEnter : onAfterEnter
  const enterCancelledHook = isAppear
    ? onAppearCancelled || onEnterCancelled
    : onEnterCancelled

  const explicitEnterDuration = toNumber(
    isObject(duration) ? duration.enter : duration,
  )

  if (process.env.NODE_ENV !== 'production' && explicitEnterDuration != null) {
    checkDuration(explicitEnterDuration, 'enter')
  }

  const expectsCSS = css !== false && !isIE9
  const userWantsControl = getHookArgumentsLength(enterHook)

  const _cb = (el._enterCb = once(() => {
    if (expectsCSS) {
      removeTransitionClass(el, activeClass)
      removeTransitionClass(el, toClass)
    }
    cb && cb()
    if (_cb.cancelled) {
      if (expectsCSS) {
        removeTransitionClass(el, startClass)
      }
      enterCancelledHook && enterCancelledHook(el)
    } else {
      afterEnterHook && afterEnterHook(el)
    }
    el._enterCb = null
  }))

  beforeEnterHook && beforeEnterHook(el)

  if (expectsCSS) {
    addTransitionClass(el, startClass)
    addTransitionClass(el, activeClass)

    nextFrame(() => {
      removeTransitionClass(el, startClass)
      addTransitionClass(el, toClass)
      if (!_cb.cancelled && !userWantsControl) {
        if (isValidDuration(explicitEnterDuration)) {
          setTimeout(_cb, explicitEnterDuration)
        } else {
          whenTransitionEnds(el, type || getTransitionInfo(el).type, _cb)
        }
      }
    })
  }

  nextFrame(() => enterHook && enterHook(el, _cb))

  if (!expectsCSS && !userWantsControl) {
    _cb()
  }
}
check whether animation should be updated
for performance it does not used for under component
but in the future we would be used
@param {Object} prev props
@param {Object} next props