博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用React Native 实现自定义Dialog
阅读量:4086 次
发布时间:2019-05-25

本文共 7496 字,大约阅读时间需要 24 分钟。

前言

最近在项目中的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、fade2.onRequestClose function Android系统必须实现的方法  当modal隐藏时触发3.onShow function    显示完回调方法4.transparent bool 是否透明,默认不透明5.visible  bool modal状态,隐藏还是显示

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 (
{}} //如果是Android设备 必须有此方法 >
{
this.props._dialogTitle}
{
this.props._dialogContent}
{ this.props._dialogLeftBtnTitle}
{ this.props._dialogRightBtnTitle}
); }}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, }});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147

调用代码如下: 
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 (
{
this.hideDialog()}} _dialogRightBtnAction={()=>{
this.hideDialog()}} />
this.showDialog()}>
dialog
); }}var styles = StyleSheet.create({ container: { flex: 1, justifyContent: 'center', }, hello: { fontSize: 20, margin: 10, textAlign:'left' },});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61

项目源码地址:

参考: 
【1】 
【2】 
【3】 
【4】

你可能感兴趣的文章
cookie
查看>>
总结vue知识体系之实用技巧
查看>>
PM2 入门
查看>>
掌握 TS 这些工具类型,让你开发事半功倍
查看>>
前端如何搭建一个成熟的脚手架
查看>>
Flutter ListView如何添加HeaderView和FooterView
查看>>
Flutter key
查看>>
Flutter 组件通信(父子、兄弟)
查看>>
Flutter Animation动画
查看>>
Flutter 全局监听路由堆栈变化
查看>>
Android 混合Flutter之产物集成方式
查看>>
Flutter混合开发二-FlutterBoost使用介绍
查看>>
Flutter 混合开发框架模式探索
查看>>
Flutter 核心原理与混合开发模式
查看>>
Flutter Boost的router管理
查看>>
Android Flutter混合编译
查看>>
微信小程序 Audio API
查看>>
[React Native]react-native-scrollable-tab-view(进阶篇)
查看>>
Vue全家桶+Mint-Ui打造高仿QQMusic,搭配详细说明
查看>>
React Native for Android 发布独立的安装包
查看>>