【发布时间】:2018-05-17 18:17:09
【问题描述】:
假设我的动画被迭代 20 次,但我不希望所有动画同时播放。我将如何触发一个值为1 的特定动画。如果我点击了1,那么除了1之外,其他19个不应该触发。
export default class AnimateScreen extends React.PureComponent {
constructor(props){
super(props);
this.forceUpdateHandler = this.forceUpdateHandler.bind(this);
this.state = {
dataSource: '',
progress: new Animated.Value(0),
};
animate = (id) => {
Animated.timing(this.state.progress, {
toValue: 1,
duration: 5000,
easing: Easing.linear,
}).start([id]); <!-- Here is my attempt in trying to animate that one specific animation.
render(){
return(
<FlatList
data={this.state.dataSource}
renderItem={({item}) =>
<View>
<View>
<Text>Work in progress</Text>
<View>
<TouchableHighlight
onPress={this.animate.bind(this, item.id)}>
<Animation
progress={this.state.progress}
source={require('../tools/animations/heart_icon.json')}
/>
</TouchableHighlight>
<Text> Hello</Text>
</View>
</View>
</View>
}
keyExtractor={(item, index) => index.toString()}
/>
);
}
}
我试过了,仍然触发了所有动画。有没有办法专门触发它们?
数据源:
"dataSource":[{"id":"10","images":"Emerson live in the sunshine swim in the sea drink the wild air.jpg","note":"Hello","tag":"sunshine"}
componentDidUpdate(prevProps, prevState) {
if (!prevState.dataSource) {
return fetch(`https://www.website.com/React/json-data.php` , {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
}
})
.then((response) => response.json())
.then((responseJson) => {
this.setState({
dataSource: responseJson,
},function() {
// In this block you can do something with new state.
});
})
.catch((error) => {
console.error(error);
});
}
}
【问题讨论】:
-
看起来 this.state.progress 可能会传递给您的所有项目。我建议将进度/动画部分移动到动画组件中,或者在每个项目上设置一个进度键并让动画调整该值。
-
我不确定你的第一个建议是什么意思,但第二个建议是不是这样的:
progress={this.state.progress(this, item.id)}? @MattAft -
不,一个例子是一旦你得到项目,你将进度键映射到它们
items = items.map(item => ({ ...item, progress: 0 })所以每个项目都会有它自己的进度设置为 0 然后而不是使用 this.state.progress,您将使用每个项目唯一的 item.progress。 -
@MattAft 这似乎是一种有趣的方法,一个问题,我将把代码的 sn-p 放在哪里?抱歉,我刚接触 React Native。
-
不用担心,您能发布更多代码吗?我会设置它并将其作为答案发布在下面
标签: reactjs react-native react-animated lottie react-animations