React Native实现进度条弹框的示例代码
本文介绍了ReactNative实现进度条弹框,分享给大家
我们在上传或者下载文件时候,希望有一个进度条弹框去提醒用户取当前正在上传或者下载,也允许用去取点击取消上传或者下载。
首先实现进度条。
importReact,{ PureComponent }from'react'; import{ StyleSheet, View, Animated, Easing, }from'react-native'; classBarextendsPureComponent{ constructor(props){ super(props); this.progress=newAnimated.Value(this.props.initialProgress||0); } staticdefaultProps={ style:styles, easing:Easing.inOut(Easing.ease) } componentWillReceiveProps(nextProps){ if(this.props.progress>=0&&this.props.progress!==nextProps.progress){ this.update(nextProps.progress); } } shouldComponentUpdate(){ returnfalse; } update(progress){ Animated.spring(this.progress,{ toValue:progress }).start(); } render(){ return(); } } varstyles=StyleSheet.create({ background:{ backgroundColor:'#bbbbbb', height:5, overflow:'hidden' }, fill:{ backgroundColor:'rgba(0,122,255,1)', height:5 } }); exportdefaultBar;
进度条的值我们用动画实现,避免使用state不断去重新render渲染界面,同时设置shouldComponentUpdate返回值为false,避免重新render。
实现进度条弹框。
importReact,{ PropTypes, PureComponent }from'react'; import{ View, StyleSheet, Modal, Text, Dimensions, TouchableOpacity }from'react-native'; importBarfrom'./Bar'; const{ width }=Dimensions.get('window'); classProgressBarDialogextendsPureComponent{ constructor(props){ super(props); } staticpropTypes={ ...Modal.propTypes, title:PropTypes.string, canclePress:PropTypes.func, cancleText:PropTypes.string, needCancle:PropTypes.bool }; staticdefaultProps={ animationType:'none', transparent:true, progressModalVisible:false, onShow:()=>{}, onRequestClose:()=>{}, onOutSidePress:()=>{}, title:'上传文件', cancleText:'取消是', canclePress:()=>{}, needCancle:true } render(){ const{ animationType, transparent, onRequestClose, progress, title, canclePress, cancleText, needCancle, progressModalVisible }=this.props; return(); } } conststyles=StyleSheet.create({ progressBarView:{ flex:1, justifyContent:'center', alignItems:'center', backgroundColor:'rgba(0,0,0,0.2)' }, barStyle:{ marginLeft:10, marginRight:10, width:width-80 }, progressLeftText:{ fontSize:14 }, cancleContainer:{ justifyContent:'center', alignItems:'flex-end' }, progressRightText:{ fontSize:14, color:'#666666' }, barBackgroundStyle:{ backgroundColor:'#cccccc' }, progressContainer:{ flexDirection:'row', padding:10, justifyContent:'space-between' }, subView:{ marginLeft:30, marginRight:30, backgroundColor:'#fff', alignSelf:'stretch', justifyContent:'center' }, progressView:{ flexDirection:'row', padding:10, paddingBottom:5, justifyContent:'space-between' }, title:{ textAlign:'left', padding:10, fontSize:16 }, cancleButton:{ padding:10 }, cancleText:{ textAlign:'right', paddingTop:0, fontSize:16, color:'rgba(0,122,255,1)' } }); exportdefaultProgressBarDialog; {title} {`${progress}`}% {`${progress}`}/100 {needCancle&& {cancleText} }
props
- modal的props-这些都是modal的属性
- animationType-动画类型
- transparent-是否透明
- progressModalVisible-是否可见
- onShow-弹框出现
- onRequestClose-弹框请求消失(比如安卓按返回键会触发这个方法)
- onOutSidePress-点击弹框外部动作
- title-弹框的标题
- cancleText-取消的文字
- canclePress-取消动作
- needCancle-是否需要取消按钮
使用代码
importReact,{ PureComponent }from'react'; import{ View }from'react-native'; importProgressBarDialogfrom'./ProgressBarDialog'; classUploadextendsPureComponent{ constructor(props){ this.state={ progress:0, progressModalVisible:false }; } refProgressBar=(view)=>{ this.progressBar=view; } showProgressBar=()=>{ this.setState({ progressModalVisible:true }); } dismissProgressBar=()=>{ this.setState({ progress:0, progressModalVisible:false }); } setProgressValue=(progress)=>{ this.setState({ progress }); } onProgressRequestClose=()=>{ this.dismissProgressBar(); } canclePress=()=>{ this.dismissProgressBar(); } render(){ return() } } exportdefaultUpload;
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。