如何在单击按钮时动态呈现元素

时间:2019-08-16 07:25:39

标签: reactjs react-native react-native-android

“我想在单击按钮时呈现动画。但是在单击时将不呈现动画。您可以从https://lottiefiles.com获取动画。或者我在下面共享了它,只需复制粘贴即可”。此外,动画应在上一个视图上渲染。

代码:

import React, {Component} from 'react';
import {Button,Text,Platform, StyleSheet, View} from 'react-native';
import LottieView from 'lottie-react-native';

export default class App extends Component<Props> {
    constructor() {
    super();
    this.state = {
      flag:false,
      x: ''
    } 
    this.fun = this.fun.bind(this); 
  }

fun(){  
    return React.createElement(LottieView, {
  style: {
    flex: 1
  }, 
  source: require('./animation.json'),
  autoPlay:true,  
  loop: true,      
}); 
  } 
  render(){ 
    this.x=this.fun()
    return(  
      <View style={{flex: 1}}> 
        <Button            
            title="Reject"  
            color="#FF0000" 
            onPress ={()=>this.setState({flag:true})}  
          />  
      {this.flag?<View style={{flex: 1}}>{this.x}</View>:<Text>hello</Text>}  
       </View>
    );
  }
}

这是动画json文件

{"v":"4.10.1","fr":48,"ip":0,"op":48,"w":56,"h":56,"nm":"录入声纹 tick","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"对勾","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[28,28,0],"ix":2},"a":{"a":0,"k":[0.988,5.188,0],"ix":1},"s":{"a":0,"k":[66.824,66.824,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-13.398,3.94],[-1.702,13.989],[20.038,-8.302]],"c":false},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"描边 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"形状 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.446],"y":[1]},"o":{"x":[0.078],"y":[0.582]},"n":["0p446_1_0p078_0p582"],"t":19,"s":[0],"e":[86]},{"t":31}],"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":21,"s":[0],"e":[60]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":26,"s":[60],"e":[0]},{"t":31}],"ix":3},"m":1,"ix":2,"nm":"修剪路径 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":12,"op":468,"st":-12,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"形状图层 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[28,28,0],"ix":2},"a":{"a":0,"k":[-0.121,0.371,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.706,0.706,0.333],"y":[0.004,0.004,0]},"n":["0p667_1_0p706_0p004","0p667_1_0p706_0p004","0p667_1_0p333_0"],"t":0,"s":[0,0,100],"e":[111.445,111.445,100]},{"i":{"x":[0.105,0.105,0.667],"y":[0.984,0.984,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"n":["0p105_0p984_0p333_0","0p105_0p984_0p333_0","0p667_1_0p333_0"],"t":12,"s":[111.445,111.445,100],"e":[100,100,100]},{"t":19}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[48.469,48.469],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"椭圆路径 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.462745098039,0.443137254902,0.737254901961,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-0.121,0.371],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"椭圆 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":144,"st":0,"bm":0}]} 

2 个答案:

答案 0 :(得分:1)

您需要更改变量检查:

render() { 
  this.x = this.fun();
  return(  
    <View style={{flex: 1}}> 
      <Button            
        title="Reject"  
        color="#FF0000" 
        onPress={() => this.setState({flag:true})}  
      />  
      {this.state.flag ?
        <View style={{flex: 1}}>{this.x}</View> :
        <Text>hello</Text>
      }  
   </View>
  );
}

没有'this.flag',因此您需要将其更改为this.state.flag-然后代码应该起作用。我会说将onPress更改为onClick,但我知道onPress是本机反应-您需要使用TouchableOpacity,TouchableHighlight,TouchableNativeFeedback而不是Button吗?

您还需要添加一些代码,以应对多次按下。例如,如果有人在动画过程中再次按下该按钮,您不希望它再次开始。

答案 1 :(得分:0)

我有这样的解决方案。 与{x && component}中的组件一起使用状态(例如x),并将状态初始设置为false,然后单击按钮将状态x设置为true,将呈现组件

export default class App extends React.Component {
constructor(props){
super(props);
this.state={
 state1:false
}
}

render(){
return(
<Button onPress={()=>this.setState({state1:true})/>
{ this.state.state1 && <your component that you want to render> }
});
}