动画不触发重新渲染

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动画不触发重新渲染相关的知识,希望对你有一定的参考价值。

我有以下React Native代码。我在android上运行它,但还没有尝试其他设备。当它运行时,我按下按钮运行动画,可以看到参考值正在更新,并在我的addListener回调中打印到控制台。但似乎从来没有触发我的组件的重新渲染,即使endAngle被更新。所以,我的组件只渲染了一次,然后再也没有随着动画的变化而变化。我是否有什么明显的遗漏?

export default AnimatedDonutWrapper = (props) => {
  let AnimatedDonut = Animated.createAnimatedComponent(DonutChart);
  var endAngle = useRef(new Animated.Value(0.1)).current;

  endAngle.addListener((data) => {
    console.log(
      'data: ' + JSON.stringify(data) + ' ' + JSON.stringify(endAngle),
    );
  });

  function animate() {
    Animated.timing(endAngle, {
      toValue: 2 * Math.PI,
      duration: 2000,
      useNativeDriver: true,
    }).start();
  }

  return (
    <View
      style={{flex: 1, justifyDirection: 'column', justifyContent: 'center'}}>
      <View style={{flex: 1}}>
        <AnimatedDonut
          data={[2, 4, 6, 8]}
          chartTranslate={[useWindowDimensions().width / 2, 150]}
          innerRadius={70}
          outerRadius={100}
          startAngle={0}
          endAngle={endAngle}
        />
      </View>
      <View
        style={{
          flex: 1,
          alignItems: 'center',
        }}>
        <View style={{flex: 1, width: '50%'}}>
          <Button title="Refresh" color="red" onPress={animate} />
        </View>
      </View>
    </View>
  );
};
答案

在我的例子中,一开始我就收到了需要将useNativeDriver设置为true的警告,所以我就这么做了。当我让代码 "工作 "的时候,useNativeDriver: True让它无法运行。我把它换成了false,然后我的动画就能正常运行了。我需要更多地研究这个问题,以更好地了解发生了什么,但现在它已经运行了。

以上是关于动画不触发重新渲染的主要内容,如果未能解决你的问题,请参考以下文章

为啥 useState 不触发重新渲染?

Redux 状态发生了变化,为啥不触发重新渲染? (Redux 传奇)

React parent pass children 将触发重新渲染而不更改 state/props

React 子组件在重新渲染时失去动画

thymeleaf 片段渲染后重新加载 javascript

Vue 组件 prop 更改不会触发重新渲染