简体   繁体   English

React Native 产生多个 Animated.View 有时间延迟

[英]React Native spawn multiple Animated.View with a time delay

I have a Wave component that unmounts as soon as it goes out of bounds.我有一个Wave组件,一旦超出范围就会卸载。

This is my result so far: https://streamable.com/hmjo6k这是我到目前为止的结果: https://streamable.com/hmjo6k

I would like to have multiple Waves spawn every 300ms, I've tried implementing this using setInterval inside useEffect , but nothing behaves like expected and app crashes我希望每 300 毫秒产生多个Waves ,我尝试在useEffect中使用setInterval来实现它,但没有任何行为像预期的那样,并且应用程序崩溃

const Wave = ({ initialDiameter, onOutOfBounds }) => {
    const scaleFactor = useRef(new Animated.Value(1)).current,
          opacity = useRef(new Animated.Value(1)).current
    
    useEffect(() => {
        Animated.parallel(
            [
                Animated.timing(scaleFactor, {
                    toValue: 8,
                    duration: DURATION,
                    useNativeDriver: true
                }),
                Animated.timing(opacity, {
                    toValue: 0.3,
                    duration: DURATION,
                    useNativeDriver: true
                })
            ]
        ).start(onOutOfBounds)
    })

    return (
        <Animated.View
            style={
                {
                    opacity,
                    backgroundColor: 'white',
                    width: initialDiameter,
                    height: initialDiameter,
                    borderRadius: initialDiameter/2,
                    transform: [{scale: scaleFactor}]
                }
            }
        />
    )
}

export default Wave
const INITIAL_WAVES_STATE = [
    { active: true },
]

const Waves = () => {
    const [waves, setWaves] = useState(INITIAL_WAVES_STATE),
          /* When out of bounds, a Wave will set itself to inactive 
             and a new one is registered in the state. 

           Instead, I'd like to spawn a new Wave every 500ms */

          onWaveOutOfBounds = index => () => {
              let newState = waves.slice()
              newState[index].active = false
              newState.push({ active: true })
              setWaves(newState)
          }

    return (
        <View style={style}>
            {
                waves.map(({ active }, index) => {
                    if (active) return (
                        <Wave 
                            key={index} 
                            initialDiameter={BUTTON_DIAMETER} 
                            onOutOfBounds={onWaveOutOfBounds(index)}
                        />
                    )
                    else return null
                })
            }
        </View>
    )
}

export default Waves

I think the useEffect cause the app crashed.我认为 useEffect 导致应用程序崩溃。 Try to add dependencies for the useEffect尝试为 useEffect 添加依赖项

useEffect(() => {
        Animated.parallel(
            [
                Animated.timing(scaleFactor, {
                    toValue: 8,
                    duration: DURATION,
                    useNativeDriver: true
                }),
                Animated.timing(opacity, {
                    toValue: 0.3,
                    duration: DURATION,
                    useNativeDriver: true
                })
            ]
        ).start(onOutOfBounds)
    }, [])

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM