基础篇章:关于 React Native 之 Modal 组件的讲解
qcpp4096
8年前
<p>Modal是模态视图,它的作用是可以用来覆盖 React Native中根视图的原生视图,Modal模态视图是一种覆盖包围当前内容视图的一个简单方法。</p> <p>注意:如果你需要如何在您的应用程序的其余部分呈现模态的更多控制,那么可以考虑使用顶级导航(top-level Navigator)。</p> <h3>Modal 属性</h3> <p>照例,我想大家都知道我的习惯了,毕竟官网也是这个顺序,那就是在用人之前,先要了解人,毕竟疑人不用,用人不疑嘛,要想相信一个人,首先得了解一个人嘛。来,看看 Modal 的相关属性。</p> <ul> <li>animated bool 是否有动画效果,不过这个属性已经被抛弃了,取之代替的是:animationType</li> <li> <p>animationType ([‘none’, ‘slide’, ‘fade’]) 这个animationType属性作用就是如何控制模态动画,有一下三个类型:</p> <ul> <li>none 出现的时候不带动画效果</li> <li>fade 带有淡入动画的效果</li> <li>slide 从底部滑动出来的动画效果</li> </ul> </li> <li> <p>onRequestClose Platform.OS === ‘android’ ? PropTypes.func.isRequired : PropTypes.func 这是一个 Android 平台需要的属性,它的作用是当这个模态视图取消或者关闭消失的时候回调这个函数</p> </li> <li>onShow function 当模态视图显示的时候调用此函数</li> <li>transparent bool 布尔值,是否透明,true 将使得在一个透明背景的模式</li> <li>visible bool 布尔值,是否可见</li> <li>onOrientationChange func ios 当在显示模态的方向变化时回调此函数</li> <li>supportedOrientations ios ([‘portrait’, ‘portrait-upside-down’, ‘landscape’, ‘landscape-left’, ‘landscape-right’]))</li> </ul> <h3>实例演示</h3> <p>来,我们大家一起看看这个效果的实现,看完效果就更加直观的能够感受到这个组件的作用和功能了。动态效果图如下:</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/d053fd3ffc1b17d0043b62330c9a2d5a.gif"></p> <p>实例代码</p> <pre> <code class="language-javascript">import React, { Component } from 'react'; import { AppRegistry, StyleSheet, Modal, Picker, Switch, TouchableHighlight, Text, View } from 'react-native'; classButtonextendsComponent{ state = { active: false, }; _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"> <Textstyle={[styles.buttonText,colorStyle]}>{this.props.children}</Text> </TouchableHighlight> ); } } export default classModalDemoextendsComponent{ state = { animationType: 'none', modalVisible: false, transparent: false, }; _setModalVisible = (visible) => { this.setState({modalVisible: visible}); }; _setAnimationType = (type) => { this.setState({animationType: type}); }; _toggleTransparent = ()=> { this.setState({transparent: !this.state.transparent}); }; render() { var modalBackgroundStyle = { backgroundColor: this.state.transparent ? 'rgba(0, 0, 0, 0.5)' : '#f5fcff', }; var innerContainerTransparentStyle = this.state.transparent ? {backgroundColor: '#fff', padding: 20} : null; var activeButtonStyle = { backgroundColor: '#ddd' }; return ( <View> <Modal animationType={this.state.animationType} transparent={this.state.transparent} visible={this.state.modalVisible} onRequestClose={() => this._setModalVisible(false)} > <Viewstyle={[styles.container,modalBackgroundStyle]}> <Viewstyle={[styles.innerContainer,innerContainerTransparentStyle]}> <Text>This modal was presented {this.state.animationType === 'none' ? 'without' : 'with'} animation.</Text> <Button onPress={this._setModalVisible.bind(this, false)} style={styles.modalButton}> Close </Button> </View> </View> </Modal> <Viewstyle={styles.row}> <Textstyle={styles.rowTitle}>Animation Type</Text> <ButtononPress={this._setAnimationType.bind(this,'none')}style={this.state.animationType==='none'?activeButtonStyle:{}}> none </Button> <ButtononPress={this._setAnimationType.bind(this,'slide')}style={this.state.animationType==='slide'?activeButtonStyle:{}}> slide </Button> <ButtononPress={this._setAnimationType.bind(this,'fade')}style={this.state.animationType==='fade'?activeButtonStyle:{}}> fade </Button> </View> <Viewstyle={{marginTop:50,flexDirection:'row',alignItems:'center',justifyContent:'center'}}> <Textstyle={{color:'grey',fontWeight:'bold',marginRight:20}}>Transparent</Text> <Switchvalue={this.state.transparent}onValueChange={this._toggleTransparent}/> </View> <ButtononPress={this._setModalVisible.bind(this,true)}> Present </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, }, pickerItem: { fontSize: 16, }, }); AppRegistry.registerComponent('ModalDemo', () => ModalDemo); </code></pre> <p>这个例子内容比较多,大家仔细看看,最好动手实践一下,这样才能掌握的更加熟练。</p> <p> </p> <p>来自:http://godcoder.me/2017/01/04/基础篇章:关于 React Native 之 Modal 组件的讲解/</p> <p> </p>