UNPKG

react-native-lib-cus-com

Version:

react-native 自定义辅助组件库,完美的网路请求,带加载条,可上传、下载文件,等等多种ui,可自定义删除;可节省应用级软件的开发时间

209 lines (186 loc) 5.94 kB
/** * Sample React Native App * https://github.com/facebook/react-native * @flow TextInput自动提示输入 */ import React, {Component} from 'react'; import PropTypes from 'prop-types'; import { View, } from 'react-native'; import { StyleSheetAdapt, Theme, MenuBottomApi, } from "./../api/api"; import {ButtonChange} from "./ButtonChange"; /** * 需要修改底层 * 将react的PropTypes换成 * import PropTypes from 'prop-types'; * **/ import CustomActionSheet from 'react-native-menu-action-cus'; import {Tools} from "../api/Tools"; /** * 底部菜单ui * **/ export class MenuBottom extends Component { //属性注释及类型,所有的属性对象都是句柄模式(类型时number),类似C语言中的指针 static propTypes = { frameStyle:PropTypes.oneOfType([ PropTypes.number, PropTypes.object, PropTypes.array ]),//按钮框样式 textStyle:PropTypes.oneOfType([ PropTypes.number, PropTypes.object, PropTypes.array ]),//文本样式 isTimeout:PropTypes.bool,//是否延迟 isVisibleClose:PropTypes.bool,//是否显示自动关闭 默认true /** * 数组成员: { text:'',文本按钮 onPress:func,点击事件,回传数组成员 若onPress属性存在此事件不执行 } 或是单成员字符串:"文本按钮" string * **/ btnList:PropTypes.array,//按钮数组 onPress:PropTypes.func,//点击事件 回传(item,i);item=>数据成员,i=》数组下标 } static self; static visible = false; constructor(props) { super(props); MenuBottom.self = this; this.state={ isVisible: false, //选择器显隐标记 } } /** * 设置默认属性 * **/ static defaultProps = { isTimeout:false, isVisibleClose:true, btnList:[], } /** * 是否显示底部菜单 * @param b bool;//true显示,false隐藏;不传采用内部默认 * **/ show(b){ b = b == undefined ? !this.state.isVisible : b; this.setState({ isVisible:b }); } renderItem = (item,i)=>{ const {isTimeout,isVisibleClose,onPress} = this.props; return( <ButtonChange key={i} text={item.text} type={"light"} style={[styles.btn,i == 0 ? styles.btnTop : {}]} onPress={()=>{ // console.info("item YYY",item); /* isTimeout ? setTimeout(()=>{ this.show(false); },2000) : null; item.onPress&&item.onPress(item,i);*/ isVisibleClose ? this.show(false) : null; isTimeout ? setTimeout(()=>{ onPress&&onPress(item,i)||item.onPress&&item.onPress(item,i); },500) : onPress&&onPress(item,i)||item.onPress&&item.onPress(item,i); }} textStyle={styles.btnTextStyle} frameStyle={styles.btnFrame}/> ); }; getFrameStyle(){ const {btnList} = this.props; const style = Tools.getStyle(styles.btn); const style2 = Tools.getStyle(styles.frameStyle); // console.info("btnList",btnList); return { height:style.height * (btnList ? btnList.length : 0) + style2.paddingBottom * 2 }; } getBtnList(){ const {btnList} = this.props; let btnL = []; btnList.forEach((v,i,a)=>{ if(typeof v == 'string'){ btnL.push({ text:v }); } else { btnL.push(v); } }); // console.info("btnList",btnList); return btnL; } render() { MenuBottom.self = this; const {isVisible} = this.state; const btnList = this.getBtnList(); const frameStyleHeight = this.getFrameStyle(); /* onCancel 点击取消按钮 触发事件*/ return( isVisible ? <CustomActionSheet frameStyle={[styles.frameStyle,frameStyleHeight]} buttonText={"取消"} modalVisible={isVisible} onCancel={()=>this.show()}> { btnList.map(this.renderItem) } </CustomActionSheet> : null ); } } const styles = StyleSheetAdapt.create({ frameStyle:{ // height:200, backgroundColor:Theme.Colors.foregroundColor, // flex: 1, borderRadius: 5, /*justifyContent: 'center', alignItems: 'center',*/ paddingBottom:30, paddingTop:30, // marginBottom: 0, }, btnFrame:{ // marginTop:10, // borderTopWidth:Theme.Border.borderWidth, borderBottomWidth:Theme.Border.borderWidth, borderColor:Theme.Colors.themeColor, }, btn:{ borderRadius: 0, height:50, // flex:1, // flexDirection:"row", // width:StyleSheetAdapt.getWidth() - StyleSheetAdapt.getWidth(10) backgroundColor:Theme.Colors.foregroundColor, }, btnTop:{ borderTopWidth:Theme.Border.borderWidth, borderColor:Theme.Colors.themeColor, }, btnTextStyle:{ color:Theme.Colors.themeColor, } });