React Native 控件之 Modal 详解 - Android/iOS 双平台通用
uoem2280
8年前
<h2>(一)前言</h2> <p>今天我们来看一下React Native控件Modal具体介绍以及实际使用方法,该适配Android、iOS双平台。</p> <p>刚创建的React Native技术交流4群( 458982758 ),欢迎各位大牛,React Native技术爱好者加入交流!同时博客右侧欢迎微信扫描关注订阅号,移动技术干货,精彩文章技术推送!</p> <p>Modal视图在iOS原生开发中熟称:"模态视图",Modal进行封装之后,可以弹出来覆盖包含React Native跟视图的原生界面(例如:UiViewControllView,Activity)。在使用React Native开发的混合应用中使用Modal组件,该可以让你使用RN开发的内功呈现在原生视图的上面。</p> <p>如果你使用React Native开发的应用,从跟视图就开始开发起来了,那么你应该是Navigator导航器进行控制页面弹出,而不是使用Modal模态视图。通过顶层的Navigator,你可以使用configureScene属性进行控制如何在你开发的App中呈现一个Modal视图。</p> <h2>(二)属性方法</h2> <p>1.animated bool 控制是否带有动画效果</p> <p>2.onRequestClose Platform.OS==='android'? PropTypes.func.isRequired : PropTypes.func</p> <p>3.onShow function方法</p> <p>4.transparent bool 控制是否带有透明效果</p> <p>5.visible bool 控制是否显示</p> <h2>(三)实例</h2> <p>上面我们已经对于Modal组件做了相关介绍,下面我们使用一个实例具体来演示一下Modal组件的基本用法。首先来看一下具体代码:</p> <pre> <code class="language-javascript">/** * Sample React Native App * https://github.com/非死book/react-native * @flow */ import React, { AppRegistry, Component, StyleSheet, Text, View, TouchableHighlight, Modal, Switch, } from 'react-native'; class Button extends React.Component { constructor(props){ super(props); this.state={ active: false, }; this._onHighlight = this.onHighlight.bind(this); this._onUnhighlight = this.onUnhighlight.bind(this); } onHighlight() { this.setState({active: true,}); } onUnhighlight() { this.setState({active: false,}); } render() { var colorStyle = { color: this.state.active ? '#fff' : '#000', }; return ( <TouchableHighlight onHideUnderlay={this._onUnhighlight} onPress={this.props.onPress} onShowUnderlay={this._onHighlight} style={[styles.button, this.props.style]} underlayColor="#a9d9d4"> <Text style={[styles.buttonText, colorStyle]}>{this.props.children}</Text> </TouchableHighlight> ); } } class ModalDemo extends Component { constructor(props){ super(props); this.state={ animationType: false, modalVisible: false, transparent: false, }; this._toggleTransparent = this.toggleTransparent.bind(this); } _setModalVisible(visible) { this.setState({modalVisible: visible}); } _setAnimationType(type) { this.setState({animationType: type}); } toggleTransparent() { this.setState({transparent: !this.state.transparent}); } render() { const modalBackgroundStyle = { backgroundColor: this.state.transparent ? 'rgba(0, 0, 0, 0.5)' : '#f5fcff', } const innerContainerTransparentStyle = this.state.transparent ? {backgroundColor: 'red', padding: 20} : null return ( <View style={{paddingTop:20,paddingLeft:10,paddingRight:10}}> <Text style={{color:'red'}}>Modal实例演示</Text> <Modal animated={this.state.animationType} transparent={this.state.transparent} visible={this.state.modalVisible} onRequestClose={() => {this._setModalVisible(false)}} > <View style={[styles.container, modalBackgroundStyle]}> <View style={[styles.innerContainer, innerContainerTransparentStyle]}> <Text>Modal视图被显示:{this.state.animationType === false ? '没有' : '有',this.state.animationType}动画效果.</Text> <Button onPress={this._setModalVisible.bind(this, false)} style={styles.modalButton}> 关闭Modal </Button> </View> </View> </Modal> <View style={styles.row}> <Text style={styles.rowTitle}>动画类型</Text> <Button onPress={this._setAnimationType.bind(this,false)} style={this.state.animationType === false ? {backgroundColor:'red'}: {}}> 无动画 </Button> <Button onPress={this._setAnimationType.bind(this, true)} style={this.state.animationType === true ? {backgroundColor:'yellow'} : {}}> 滑动效果 </Button> </View> <View style={styles.row}> <Text style={styles.rowTitle}>透明</Text> <Switch value={this.state.transparent} onValueChange={this._toggleTransparent} /> </View> <Button onPress={this._setModalVisible.bind(this, true)}> 显示Modal </Button> </View> )} } const styles = StyleSheet.create({ container: { flex: 1, justifyContent: 'center', padding: 20, }, innerContainer: { borderRadius: 10, alignItems: 'center', }, row: { alignItems: 'center', flex: 1, flexDirection: 'row', marginBottom: 20, }, rowTitle: { flex: 1, fontWeight: 'bold', }, button: { borderRadius: 5, flex: 1, height: 44, alignSelf: 'stretch', justifyContent: 'center', overflow: 'hidden', }, buttonText: { fontSize: 18, margin: 5, textAlign: 'center', }, modalButton: { marginTop: 10, }, }); AppRegistry.registerComponent('ModalDemo', () => ModalDemo);</code></pre> <p>运行效果如下:</p> <p>iOS平台运行效果</p> <p><img src="https://simg.open-open.com/show/cf798e5482e3b5cac93693c19521ccf5.gif"></p> <p>Android平台运行效果:</p> <p><img src="https://simg.open-open.com/show/cfd60c5cbd5bbc381aa5dc1ca8664175.gif"></p> <p> </p> <p>来自: http://www.lcode.org/react-native-控件之modal详解-androidios双平台通用56/</p> <p> </p>