В настоящее время я использую useTransition, чтобы моя мобильная навигация отображалась:

const MobileNav = ({show, toggle, styles}) => {
  let transition = useTransition(show, null, {
    from: {transform: 'translateY(-100%) scale(0.7)', ...styles},
    enter: {transform: 'translateY(0) scale(1)'},
    leave: {transform: 'translateY(100%) scale(0.7)'}
  })

  return (
    <>
      {transition.map(({item, props, key}) => {
        return item ? (
          <animated.div className="navbar__menu_mob" key={key} style={props}>
            ...someHtml
          </animated.div>
        ) : null
      })}
    </>
  )
}

С помощью этого кода масштаб и перевод анимируются одновременно. Моя конечная цель - связать их в цепочку, чтобы scale был первым, а translateY - после. Из примеров с помощью react-spring кажется, что лучший способ — это обернуть мой первый animated.div в другой animated.div и связать их с помощью useChain.

Кажется, я изо всех сил пытаюсь понять, как лучше всего связать мои анимации. В идеале мне не нужно было бы оборачивать то, что у меня сейчас есть, в другой animated.div. Я мог бы сделать с некоторым руководством.

1
Jake 1 Апр 2020 в 18:17

1 ответ

Мне удалось понять это без использования useChain().

Я использовал многоступенчатые переходы:

let transition = useTransition(show, null, {
    from: {translate: '-100%', scale: 0.7, ...styles},
    enter: item => async(next) => {
      await next({translate: '0%'})
      await next({scale: 1})
    },
    leave: item => async(next) => {
      await next({scale: 0.7})
      await next({translate: '100%'})
    }
  })

Затем мне пришлось интерполировать стили следующим образом:

{transition.map(({item, props, key}) => {
        return item ? (
          <animated.div className="navbar__menu_mob" key={key} style={{
            transform: interpolate([
              props.translate.interpolate(v => `translateY(${v})`),
              props.scale.interpolate(v => `scale(${v})`)
            ], (translate, scale) => `${translate} ${scale}`),
            ...props
            }}></animated.div> )
        : null })}
0
Jake 6 Апр 2020 в 16:38