是否可以在反应弹簧中将动画设置为100%?

时间:2018-10-17 11:19:37

标签: reactjs react-spring

我正在使用react-spring尝试为AJAX内容加载动画。

我有一个容器组件,有时我希望将其动画设置为从0到“自动”,有时我希望根据传入的道具进行动画设置为100%。

我有一个设置的const,然后将其传递到Transition组件中的namedHeight属性中。然后,我用它在已安装的子组件的style属性中设置height属性。

const Container = ({ data, children, stretchHeight }) => {
  const loaded = data.loadStatus === 'LOADED';
  const loading = data.loadStatus === 'LOADING';

  const animationHeight = stretchHeight ? '100%' : 'auto';

  return (
    <div
      className={classnames({
        'data-container': true,
        'is-loading': loading,
        'is-loaded': loaded,
        'stretch-height': stretchHeight
      })}
      aria-live="polite"
    >
      {loading &&
        <div style={styles} className='data-container__spinner-wrapper'>
          <LoadingSpinner />
        </div>
      }

      <Transition
        from={{ opacity: 0, calculatedHeight: 0 }}
        enter={{ opacity: 1, calculatedHeight: animationHeight }}
        leave={{ opacity: 0, calculatedHeight: 0 }}
        config={config.slow}
      >
        {loaded && (styles => {
          return (
            <div style={{ opacity: styles.opacity, height: styles.calculatedHeight }}>
              {children}
            </div>
          )
        }
        )}
      </Transition>
    </div>
  )
}

问题在于这会导致最大调用堆栈超出错误,因为我认为react-spring无法理解'100%'字符串值,而只能理解'auto'。

有没有解决的办法?

3 个答案:

答案 0 :(得分:2)

问题是您切换了类型,您从0变为自动到0%。它可以自动插值,但是会以数字形式插值,您需要通过将数字与某个百分比混合来混淆它。

PS。也许您可以使用CSS进行一些欺骗:https://codesandbox.io/embed/xolnko178q

答案 1 :(得分:0)

感谢@hpalu帮助我了解问题所在:

  

问题是您切换了类型,您从0变为自动到0%。它   可以自动插值,但是作为一个数字插值,   通过将数字与一个百分比混合来混淆它。

为解决此问题,我为起点 创建了consts。

  const containerHeightAnimationStart = stretchHeight ? '0%' : 0;
  const containerHeightAnimationEnd = stretchHeight ? '100%' : 'auto';

然后我在动画中使用了这些:

<Transition
  native
  from={{ opacity: 0, height: containerHeightAnimationStart }}
  enter={{ opacity: 1, height: containerHeightAnimationEnd }}
  leave={{ opacity: 0, height: containerHeightAnimationStart }}
>
  {loaded && (styles => {
    return (
      <animated.div style={styles}>
        {children}
      </animated.div>
    )
  }
  )}
</Transition>

答案 2 :(得分:0)

从&需要相同的单位(数字或字符串)

const [percentage, setPercentage] = useState(100);

// wrong
const animationState2 = useSpring({
    from:{width: 0},
    to: {width: `${percentage}%`}
});

// right
const animationState2 = useSpring({
    from:{width: '0%'},
    to: {width: `${percentage}%`}
});