使用 React Native 實現自定義 Dialog

CindiLeveri 7年前發布 | 13K 次閱讀 ReactNative 移動開發 React Native

前言

最近在項目中的RN模塊遇到一個需求,彈出一個Dialog,但是原生的Alert滿足不了需求,只能自己去寫一個,最后決定使用Modal去實現,話不多說,介紹開始,效果圖如下:

1.Modal介紹

Modal視圖在iOS原生開發中熟稱:"模態視圖",Modal進行封裝之后,可以彈出來覆蓋包含React Native跟視圖的原生界面(例如:UiViewControllView,Activity)。在使用React Native開發的混合應用中使用Modal組件,該可以讓你使用RN開發的內功呈現在原生視圖的上面。

屬性: 1.animationType enum('none', 'slide', 'fade') 動畫類型 可選項為:none、slide、fade 2.onRequestClose function Android系統必須實現的方法 當modal隱藏時觸發 3.onShow function 顯示完回調方法 4.transparent bool 是否透明,默認不透明 5.visible bool modal狀態,隱藏還是顯示</code></pre>

2.實現

在此是將modal封裝成為一個組件以便后續在別的地方引用。
組件ModalDialog.js代碼如下
/**

  • Created by peixuan.xie on 2017/2/28. */ import React, { Component } from 'react'; import { Modal, Text, TouchableHighlight, View , StyleSheet, BackAndroid } from 'react-native';

let Dimensions = require('Dimensions'); let SCREEN_WIDTH = Dimensions.get('window').width;//寬 let SCREEN_HEIGHT = Dimensions.get('window').height;//高

export default class ModalDialog extends Component {

// 構造
constructor(props) {
    super(props);
}

static propTypes = {
    _dialogTitle: React.PropTypes.string, //標題
    _dialogContent: React.PropTypes.string, //內容
    _dialogLeftBtnTitle: React.PropTypes.string,    //左按鍵標題
    _dialogRightBtnTitle: React.PropTypes.string,   //右按鍵標題
    _dialogLeftBtnAction: React.PropTypes.func.isRequired,  //左點擊方法
    _dialogRightBtnAction: React.PropTypes.func.isRequired, //右點擊方法
    _dialogVisible: React.PropTypes.bool,       //顯示還是隱藏
}

static defaultProps = {
    _dialogTitle: '溫馨提示',
    _dialogContent: '是否退出',
    _dialogLeftBtnTitle: '取消',
    _dialogRightBtnTitle: '確定',
    _dialogVisible: false,
}

render() {
    // onPress事件直接與父組件傳遞進來的屬性掛接
    return (
        <Modal
            visible={this.props._dialogVisible}
            transparent={true}
            onRequestClose={() => {}} //如果是Android設備 必須有此方法
            >
            <View style={styles.bg}>
                <View style={styles.dialog}>
                    <View style={styles.dialogTitleView}>
                        <Text style={styles.dialogTitle}>
                            {this.props._dialogTitle}
                        </Text>
                    </View>
                    <View style={styles.dialogContentView}>
                        <Text style={styles.dialogContent}>
                            {this.props._dialogContent}
                        </Text>
                    </View>

                    <View style={styles.dialogBtnView}>
                        <TouchableHighlight style={styles.dialogBtnViewItem} onPress={this.props._dialogLeftBtnAction}>
                            <Text style={styles.leftButton}>
                                {this.props._dialogLeftBtnTitle}
                            </Text>
                        </TouchableHighlight>
                        <TouchableHighlight style={styles.dialogBtnViewItem} onPress={this.props._dialogRightBtnAction}>
                            <Text style={styles.rightButton}>
                                {this.props._dialogRightBtnTitle}
                            </Text>
                        </TouchableHighlight>
                    </View>

                </View>
            </View>
        </Modal>
    );
}

}

const styles = StyleSheet.create({ bg: { //全屏顯示 半透明 可以看到之前的控件但是不能操作了 width: SCREEN_WIDTH, height: SCREEN_HEIGHT, backgroundColor: 'rgba(52,52,52,0.5)', //rgba a0-1 其余都是16進制數 justifyContent: 'center', alignItems: 'center', }, dialog: { width: SCREEN_WIDTH 0.8, height: SCREEN_HEIGHT 0.28, backgroundColor: 'white', borderRadius: 8, }, dialogTitleView: { width: SCREEN_WIDTH 0.8, height: SCREEN_HEIGHT 0.08, justifyContent: 'center', alignItems: 'center', backgroundColor: '#EEEEEE', borderTopLeftRadius: 8, borderTopRightRadius: 8 }, dialogTitle: { textAlign: 'center', fontSize: 18, color: '#000000', }, dialogContentView: { width: SCREEN_WIDTH 0.8, height: SCREEN_HEIGHT 0.12, justifyContent: 'center', alignItems: 'center', }, dialogContent: { textAlign: 'center', fontSize: 16, color: '#4A4A4A', }, dialogBtnView: { width: SCREEN_WIDTH 0.8, height: SCREEN_HEIGHT 0.08, flexDirection: 'row', }, dialogBtnViewItem: { flex: 1, justifyContent: 'center', alignItems: 'center', backgroundColor: '#E5F2FF', borderBottomLeftRadius: 8, borderBottomRightRadius: 8, }, leftButton: { fontSize: 18, color: '#007AFF', borderBottomLeftRadius: 8, }, rightButton: { fontSize: 18, color: '#007AFF', borderBottomRightRadius: 8, } });</code></pre>

調用代碼如下:

ModalDialog.js

/**

  • Created by peixuan.xie on 2017/2/28. */ import React,{Component} from 'react'; import { Modal, Text, TouchableOpacity, View, StyleSheet }from 'react-native';

import ModalDialog from '../component/ModalDialog.js'

export default class ModalDemo extends Component {

// 構造 constructor(props) { super(props); // 初始狀態 this.state = { isDialogVisible: false }; }

showDialog(){
    this.setState({isDialogVisible:true});
}

hideDialog(){
    this.setState({isDialogVisible:false});
}

render() {
    return (
        <View style={styles.container}>
            <ModalDialog
                _dialogVisible={this.state.isDialogVisible}
                _dialogLeftBtnAction={()=> {this.hideDialog()}}
                _dialogRightBtnAction={()=>{this.hideDialog()}}
                />
            <TouchableOpacity onPress={()=>this.showDialog()}>
                <Text style={styles.hello}>dialog</Text>
            </TouchableOpacity>

        </View>
    );
}

}

var styles = StyleSheet.create({ container: { flex: 1, justifyContent: 'center', }, hello: { fontSize: 20, margin: 10, textAlign:'left' }, });</code></pre>

 

參考:

【1】 http://非死book.github.io/react-native/docs/modal.html

【2】 http://reactnative.cn/docs/0.42/modal.html#content

【3】 http://blog.csdn.net/jj120522/article/details/52051226

【4】 http://www.baiduhome.net/lib/view/open1462870341406.html

 

來自:http://blog.csdn.net/qq_27082837/article/details/60143572

 

 本文由用戶 CindiLeveri 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!