ReactNative学习笔记--基于Modal的多步弹窗的封装
来源:互联网 发布:php抓取网页ajax 编辑:程序博客网 时间:2024/05/16 17:51
效果
弹窗的封装
此组件只针对有输入框,然后点击确定进行网络请求,伴随菊花转,请求返回的时候在现实请求结果的,如上图显示
和直接显示菊花转,然后显示网络请求结果的。很简单直接上代码。
import React from 'react';import { View, Text, ActivityIndicator, TextInput, TouchableOpacity, Modal,} from 'react-native';import Const from '../../util/const';import System_styles from '../../util/system_styles';import { Button,} from '../../common';export default class AlertView_NetRequest extends React.Component { /** * 组件介绍:本组件只针对直接有网络请求过程和结果显示的情况,和有输入再进行 * 网络请求过程 然后显示结果的情况 * 组件显示:菊花转----- 请求结果 & 输入框 确定 ------ 菊花转-----请求结果 * */ static defaultProps = { firstItem:{ title:'', subTitle:'', cancleBtn:undefined, confirmBtn:'确定', unit:'',////输入框的单位 placeHolder:'',///占位符 }, secondItem:{ title:'', subTitle:'', cancleBtn:undefined, confirmBtn:'查看详情', }, firstConfirmBtnClicked:undefined, secondConfirmBtnClicked:undefined, top:140, type:0,///默认直接请求 }; constructor(){ super(); this.state = { text:'', visible:false, step:0,///请求步骤 }; } ///显示 show = ()=>{ this.setState({ step:0, visible:true }) }; ///隐藏 _hide = ()=>{ this.setState({ visible:false, }) }; showNetResult = ()=>{ const {step} = this.state; this.setState({ step:step+1, }) }; ///确定按钮点击 _confirmBtnClicked = ()=>{ const {firstItem,secondItem,type,firstConfirmBtnClicked,secondConfirmBtnClicked} = this.props; const {step}= this.state; var btnClicked = type == 0 ? secondConfirmBtnClicked : (step == 0 ? firstConfirmBtnClicked : secondConfirmBtnClicked); btnClicked&&btnClicked(this.state.text); if(type == 0){ this._hide(); }else { if(step == 0){ this.setState({ step:step+1, }) }else { this._hide(); } } } render() { const {firstItem,secondItem,type} = this.props; const {visible,step}= this.state; var item = type == 0 ? secondItem : (step == 0 ? firstItem : secondItem); let cancleBtnView = item.cancleBtn == undefined ? null : ( <Button style={{flex:1}} title={item.cancleBtn} onPress={this._hide} > </Button> ); let bottomBtns = ( <View style={{height:53,flexDirection:'row'}}> {cancleBtnView} <View style={{height:53,backgroundColor:System_styles.hei_12,width:1}}/> <Button style={{flex:1}} title={item.confirmBtn} onPress={this._confirmBtnClicked} > </Button> </View> ); let textInput = type == 0 ? null :( step == 0 ? ( <View style={{height:64,paddingLeft:16,paddingRight:16,flexDirection:'row'}}> <View style={{flexDirection:'row',height:40,borderRadius:3,backgroundColor:System_styles.hei_12,paddingLeft:10,paddingRight:7,flex:1,alignItems:'center'}}> <TextInput style={{height:40,flex:7}} placeholder = {item.placeHolder} onChangeText={(text) => this.setState({text})} keyboardType='numeric' > </TextInput> <Text style={[{flex:1},System_styles.getChanggui(15,System_styles.hei_32)]}> {item.unit} </Text> </View> </View> ):null); let normalContent = (type == 0&&step == 0)||(type == 1 && step == 1) ? ( <View style={[{justifyContent:'center', alignItems:'center',borderRadius:6 ,backgroundColor:System_styles.white,width:Const.screen_width/3.0,height:Const.screen_width/3.0},this.props.style]}> <ActivityIndicator size = 'large' color={System_styles.hei_56} /> </View> ):( <View style={[{justifyContent:'center', alignItems:'center',borderRadius:6 ,backgroundColor:System_styles.white,},this.props.style]}> <View style={[{borderTopLeftRadius:3,borderTopRightRadius:3,alignItems:'center',paddingBottom:26,paddingTop:23}]}> <Text style={System_styles.getChanggui(17,System_styles.hei_84)}> {item.title} </Text> <Text style={System_styles.getChanggui(13,System_styles.hei_56)}> {item.subTitle} </Text> </View> {textInput} <View style={{height:1,backgroundColor:System_styles.hei_12,width:Const.screen_width-64}}/> {bottomBtns} </View> ); return ( <Modal animationType={'fade'} transparent={true} visible={visible} > <View style={{flex:1,backgroundColor:'rgba(0,0,0,0.5)',alignItems:'center',paddingHorizontal:32}} > {normalContent} </View> </Modal> ) }}
使用方法:
导入后直接放到render()里,AlertView_NetRequest,注意使用位置,一定是最上层,同时设置标记 ref={ref=>{this.netRequestAlert=ref}},便于显示组件,开始请求,结果返回的显示
render() { var sub = '最低起购金额'+this.max+'万'; var firstItem ={ title:'申请额度', subTitle:sub, cancleBtn:undefined, confirmBtn:'确定', unit:'万',////输入框的单位 placeHolder:'请输入申请金额',///占位符 }; var secondItem={ title:'您的额度申请已提交', subTitle:'在额度申请查询中查看审核结果', cancleBtn:'取消', confirmBtn:'额度申请查询', }; return( <View style={{flex:1,backgroundColor:'white'}} > <View style={{flex:1,}}> {this._renderHeader()} {this._renderSalesInfoView()} {this._renderContents()} </View> <HorizontalButtons style={{borderTopColor:System_styles.hei_12,borderTopWidth:0.5,paddingHorizontal:8}} buttons = {items} callBack={this._bottomBtnClicked} /> <AlertView_NetRequest ref={ref=>{this.netRequestAlert=ref}} style={{marginTop:Const.screen_height/3.0}} firstItem = {firstItem} secondItem = {secondItem} firstConfirmBtnClicked = {this._alertConfirmBtnClicked} secondConfirmBtnClicked = {this._alertConfirmBtnClicked} type = {1} > </AlertView_NetRequest> </View> ) }
1.开始显示
this.netRequestAlert.show();
2.点击弹出框上的确定按钮,开始网络请求
_alertConfirmBtnClicked = (text)=>{ dispatch(ProductListsActions.requestApplyTrustCount(proItem.getIn(['productId']),Const.userInfo.id,text,this._requestCallBak)); };
3.请求结果返回的时候调用显示结果
this.netRequestAlert.showNetResult();
注意:上面的组件研究明白了,就能封装简单的弹出窗,前一部分是全部代码,里面有个组件Button记得用自己项目里的按钮组件替换掉。喜欢的请点
链接:http://www.imooc.com/article/16793 0 0
- ReactNative学习笔记--基于Modal的多步弹窗的封装
- ReactNative学习笔记--基于Modal的多步弹窗的封装
- ReactNative学习笔记--基于Modal的多步弹窗的封装
- ReactNative 组件封装---Modal
- 基于Bootstrap的Modal二次封装
- 基于boostrap的modal二次封装
- ReactNative学习笔记--下拉选择菜单的简单封装
- ReactNative学习笔记--下拉选择菜单的简单封装
- Bootstrap的Modal源码学习
- ReactNative进阶之评分控件的封装
- 第四章、ReactNative组件的封装
- ReactNative:学习props的使用
- 类的封装学习笔记
- Bootstrap的一些笔记——modal
- ReactNative学习笔记一
- Bootstrap插件modal源码的学习
- react-native Modal的学习与使用
- ReactNative进阶之react-native-storage的使用及封装
- C语言位扩展
- centos 6.5 docker安装
- 前端面试的总结
- Linux常用默认文件&默认路径
- unetlab
- ReactNative学习笔记--基于Modal的多步弹窗的封装
- scala学习(3)--map
- Hibernate的基本开发流程
- 第七届蓝桥杯【省赛试题4】快速排序
- 当访问共享文件夹时需输入用户名和密码的解决办法
- 线程小问题
- 从需求出发来看关系模型与非关系模型--时代的变革1
- oj2519: 可爱的数字序列
- SSM集成Shiro:实现登录认证