0

目前,我的React Native動畫只發生一次,而不再發生。每當我的某個組件的道具發生變化時,我都需要它。當新的道具數據進入時,我的數據顯示會發生變化,但它只是第一次動畫。每當道具改變/組件更新時,我有沒有辦法讓動畫再次發生?如何使React原生動畫再次發生?

這是我到目前爲止有:

import React from 'react'; 
 
import {Animated, Easing, StyleSheet, Text, View} from 'react-native'; 
 

 

 

 

 
//Animation 
 
class FadeInView extends React.Component { 
 
    state = { 
 
    yAnimation: new Animated.Value(21), 
 
    } 
 

 
    componentDidMount() { 
 
    Animated.timing(
 
     this.state.yAnimation, 
 
     { 
 
     //easing: Easing.bounce, 
 
     toValue: 0, 
 
     duration: 150, 
 
     } 
 
    ).start(); 
 
    } 
 

 
    render() { 
 
    let { yAnimation } = this.state; 
 

 
    return (
 
     <Animated.View 
 
     style={{ 
 
      ...this.props.style, 
 
      transform: [{translateY: this.state.yAnimation}], 
 
     }} 
 
     > 
 
     {this.props.children} 
 
     </Animated.View> 
 
    ); 
 
    } 
 
} 
 

 
//Price Component 
 
export default class Price extends React.Component { 
 

 
constructor(props) { 
 
    super(props); 
 

 
    this.animateNow = false; 
 
} 
 

 
shouldComponentUpdate(nextProps, nextState) { 
 
    if (this.props.price !== nextProps.price) { 
 
    console.log('true'); 
 
    return true; 
 
    } else { 
 
    return false; 
 
    } 
 
} 
 

 
componentWillUpdate() { 
 
    if (this.props.price != this.localPrice) { 
 
    this.animateNow = true; 
 
    } 
 
} 
 

 
componentDidUpdate() { 
 
this.localPrice = this.props.price; 
 
this.animateNow = false; 
 

 
console.log(this.props.price); 
 
} 
 

 
render() { 
 
if (this.animateNow) { 
 
    return (
 
    <FadeInView> 
 
     <Text style={styles.price}>{this.props.price}</Text> 
 
    </FadeInView> 
 
); 
 
} else { 
 
    return (
 
    <View> 
 
     <Text style={styles.price}>{this.props.price}</Text> 
 
    </View> 
 
); 
 
} 
 

 
} 
 
} 
 

 
const styles = StyleSheet.create({ 
 
price: { 
 
fontFamily: 'Avenir', 
 
fontSize: 21, 
 
color: '#606060', 
 
textAlign: 'right', 
 
marginRight: 20, 
 
backgroundColor: 'transparent' 
 

 
} 
 
});

回答

1

如果你想獲得的道具,當再次動畫,你應該再次調用裏面componentWillReceiveProps()

playAnimation() { 
    Animated.timing(
     this.state.yAnimation, 
     { 
      toValue: 0, 
      duration: 150, 
     } 
    ).start(); 
} 

componentWillReceiveProps(next) { 
    if (next.props.changed) { 
     this.playAnimation(); 
    } 
}