React Native 弹窗(三)自定义(使用Modal实现)
针对弹窗之前已讨论过两种
1、系统的Alert、
2、Ant Design React Native库中的Modal.alert
但这两种都各有自己的局限性,所以现在我么就使用用Modal来自定义实现弹窗
一、Modal
Modal组件可以用来覆盖包含React Native根视图的原生视图(如UIViewController,Activity),用它可以实现遮罩的效果。
Modal提供的属性有:
animationType(动画类型) PropTypes.oneOf([‘none’, ‘slide’, ‘fade’]
- none:没有动画
- slide:从底部滑入
- fade:淡入视野
onRequestClose(被销毁时会调用此函数)
- 在 ‘Android’ 平台,必需调用此函数(文档上这样讲,不调用也可以,该属性主要是监听安卓返回键)
- 详解:React Native Modal的onRequestClose属性详解
onShow(模态显示的时候被调用)
transparent (透明度) bool
- 为true时,使用透明背景渲染模态。
visible(可见性) bool
onOrientationChange(方向改变时调用)
- 在模态方向变化时调用,提供的方向只是 ” 或 ”。在初始化渲染的时候也会调用,但是不考虑当前方向。
supportedOrientations(允许模态旋转到任何指定取向)[‘portrait’, ‘portrait-upside-down’, ‘landscape’,’landscape-left’,’landscape-right’])
- 在iOS上,模态仍然受 info.plist 中的 UISupportedInterfaceOrientations字段中指定的限制。
export interface ModalBaseProps { // Only `animated` is documented. The JS code says `animated` is // deprecated and `animationType` is preferred. animated?: boolean; /** * The `animationType` prop controls how the modal animates. * * - `slide` slides in from the bottom * - `fade` fades into view * - `none` appears without an animation */ animationType?: "none" | "slide" | "fade"; /** * The `transparent` prop determines whether your modal will fill the entire view. * Setting this to `true` will render the modal over a transparent background. */ transparent?: boolean; /** * The `visible` prop determines whether your modal is visible. */ visible?: boolean; /** * The `onRequestClose` prop allows passing a function that will be called once the modal has been dismissed. * _On the Android platform, this is a required function._ */ onRequestClose?: () => void; /** * The `onShow` prop allows passing a function that will be called once the modal has been shown. */ onShow?: (event: NativeSyntheticEvent<any>) => void; }
二、项目实际使用
效果图:

代码:
ValueSingleAlertModal弹窗组件
import React, { Component } from "react";
import { Modal, Text, View, TouchableOpacity, StyleSheet, } from "react-native";
import { IBasePageProp, IBaseRenderItem } from '../../../../utils/face/base'
import { DeviceHelp } from "../../../../utils/define/helper";
export interface IProps extends IBasePageProp {
title: string,
message: string,
btntiltle: string,
}
// 弹出菜单组件
export default class ValueSingleAlertModal extends React.Component<IProps> {
state = {
modalVisible: false,
};
setModalVisible(visible: any) {
this.setState({ modalVisible: visible });
}
render() {
return (
<Modal
animationType="slide"
transparent={true}
visible={this.state.modalVisible}
onRequestClose={() => {
this.setModalVisible(false)
}}
>
<View style={{
flex: 1, backgroundColor: 'rgba(0, 0, 0, 0.6)', justifyContent: 'center',
alignItems: 'center'
}}>
<View style={style.bg}>
{/* 标题 */}
<Text style={style.toptext}>{this.props.title}</Text>
{/* 内容 */}
<Text style={style.centerText}>{this.props.message}</Text>
{/* 分割线 */}
<View style={style.line}></View>
{/* 取消按钮 */}
<TouchableOpacity onPress={() => {
this.setModalVisible(false);
}}>
<Text style={style.btnText}>{this.props.btntiltle}</Text>
</TouchableOpacity>
</View>
</View>
</Modal>
);
}
}
const style = StyleSheet.create({
bg: {
backgroundColor: '#FFFFFF',
borderRadius: 10,
width: DeviceHelp.screenW - 100,
},
toptext: {
fontWeight: 'bold',
color: '#333333',
marginTop: 20,
textAlign: 'center',
fontSize: DeviceHelp.fontSize(17)
},
centerText: {
color: '#333333',
textAlign: 'center',
paddingTop: 15,
paddingLeft: 15,
paddingRight: 15,
fontSize: DeviceHelp.fontSize(15)
},
line: {
marginTop: 20,
backgroundColor: '#99999955',
height: 1,
},
btnText: {
marginTop: 15,
marginBottom: 15,
color: "#3498FE",
fontWeight: "bold",
textAlign: "center",
fontSize: DeviceHelp.fontSize(18),
},
})
使用:
1、引用文件
import ValueSingleAlertModal from '../valuedataview/cptvaluesiglealert'
2、声明singleAlert
export default class extends UtilsRootPage<IBasePageProp, valueDataStates> { // 成员变量 private singleAlert!: ValueSingleAlertModal;
3、render方法中渲染
<ValueSingleAlertModal ref={(c) => { if (c != null) { this.singleAlert = c; } }} title='我是标题' message='我是内容我是内容我是内容' btntiltle='知道了' />
4、调用弹窗
this.singleAlert.setModalVisible(true)
备注:
官方文档:https://docs.nativebase.io/modal
Ant Design React Native的Modal对话框:https://rn.mobile.ant.design/components/modal-cn/
参考资料:https://blog.csdn.net/qianzhihe1992110/article/details/77291407

浙公网安备 33010602011771号