Как выполнить две анимации последовательно, используя Reaction-Spring? - PullRequest
2 голосов
/ 11 апреля 2020

Я попытался связать две пружины (используя useChain), чтобы одна запускалась только после окончания другой, но они анимировались одновременно. Что я делаю не так?

import React, { useRef, useState } from 'react'
import { render } from 'react-dom'
import { useSpring, animated, useChain } from 'react-spring'

function App() {
  const [counter, setCounter] = useState(0)
  const topRef = useRef()
  const leftRef = useRef()
  const { top } = useSpring({ top: (window.innerHeight * counter) / 10, ref: topRef })
  const { left } = useSpring({ left: (window.innerWidth * counter) / 10, ref: leftRef })

  useChain([topRef, leftRef])

  return (
    <div id="main" onClick={() => setCounter((counter + 1) % 10)}>
      Click me!
      <animated.div id="movingDiv" style={{ top, left }} />
    </div>
  )
}

render(<App />, document.getElementById('root'))

Вот коды и окно, демонстрирующее проблему: https://codesandbox.io/s/react-spring-usespring-hook-m4w4t

Ответы [ 2 ]

1 голос
/ 11 апреля 2020

Я немного покопался, так как это меня тоже озадачило, и наткнулся на этот спектральный чат .

Я не уверен, что полностью понимаю, что происходит, но, похоже, current значение ссылок в вашем коде читается только один раз, и поэтому, когда компонент монтируется, цепочка завершается мгновенно и никогда не сбрасывается. Ваш код работает, если вы вставляете жестко закодированные значения для двух пружин, а затем управляете ими с помощью поворотников, но, очевидно, вы ищете решение dymani c.

Я проверил это и, похоже, job:

const topCurrent = !topRef.current ? topRef : {current: topRef.current};
const leftCurrent = !leftRef.current ? leftRef : {current: leftRef.current};

useChain([topCurrent, leftCurrent]);

Это заставляет цепочку каждый раз ссылаться на текущее значение ссылки. Турнир здесь, потому что значение ref on mount undefined - может быть более элегантный способ объяснить это.

0 голосов
/ 13 апреля 2020

Я только что узнал, что есть гораздо более простое решение, использующее только useSpring:

function App() {
  const [counter, setCounter] = useState(0)

  const style = useSpring({
    to: [
      { top: (window.innerHeight * counter) / 5 },
      { left: (window.innerWidth * counter) / 5 }
    ]
  })

  return (
    <div id="main" onClick={() => setCounter((counter + 1) % 5)}>
      Click me!
      <animated.div id="movingDiv" style={style} />
    </div>
  )
}

Пример: https://codesandbox.io/s/react-spring-chained-animations-8ibpi

...