博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
React Native]React Native组件之Navigator
阅读量:4086 次
发布时间:2019-05-25

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

1.简介

导航组件Navigator可以让app在不同页面进行切换。为达到这样的功能,Navigator提供了路由对象功能进行区分每个页面。 
我们可以通过renderScene方法,Navaigator根据指定的路由进行渲染指定的界面。 
除了以上功能之外,为了改变页面切换的动画或者页面的手势,该组件还提供configureScene属性来进行获取指定路由页面的配置对象信息。 
对于页面切换动画或者更多的屏幕配置选项信息详情可以查看Navigator.SceneConfigs

2.动画手势属性

PushFromRight 
FloatFromRight 
FloatFromLeft 
FloatFromBottom 
FloatFromBottomAndroid 
FadeAndroid 
HorizontalSwipeJump 
HorizontalSwipeJumpFromRight 
VertivalUpSwipeJump 
VertivalDownSwipeJump 
更多属性,可以去修改NavigatorSceneConfigs.js这个文件。

3.Navigator方法

在使用导航器的时候,如果你已经获取了导航器对象的引用,我们可以进行调用以下一些方法来实现页面导航功能:getCurrentRoutes() 该进行返回存在的路由列表信息 
getCurrentRoutes() 返回存在的路由列表信息 
jumpBack() 回退操作,但是不会卸载(删除)当前页面 
jumpForward() 跳转到相对于当前页面的下一个页面 
jumpTo(route) 根据传入的路由信息,跳转到一个指定的页面(该页面不会卸载删除) 
push(route) 导航切换到一个新的页面,新的页面进行压入栈。通过jumpForward()方法可以回退过去 
pop 当前页面弹出来,跳转到栈中下一个页面,并且卸载删除掉当前的页面 
replace(route) 只用传入的路由的指定页面进行替换掉当前的页面 
replaceAtIndex(route, index) 传入路由以及位置索引,使用该路由指定的页面跳转到指定位置的页面 
replacePrevious(route) 传入路由,通过指定路由的页面替换掉前一个页面 
resetTo(route) 进行导航到新的界面,并且重置整个路由栈 
immediatelyResetRouteStack(routeStack) 该通过一个路由页面数组来进行重置路由栈 
popToRoute(route) 进行弹出相关页面,跳转到指定路由的页面,弹出来的页面会被卸载删除 
popToTop() 进行弹出页面,导航到栈中的第一个页面,弹出来的所有页面会被卸载删除

4.Navigator属性风格

configureScene -- function 方法, 该为可选的方法进行配置页面切换动画和手势。该会通过路由和路由栈两个参数调用,进行返回一个页面参数配置对象:(route, routeStack) => Navigator.SceneConfigs.FloatFromRight 
initialRoute -- object 参数对象, 进行设置导航初始化的路由页面。路由是标识导航器渲染标识每一个页面的对象。initialRoute必须为initialRouteStack中的路由。同时initialRoute默认为initialRouteStack中路由栈的最后一项 
initialRouteStack -- [object] 参数对象数组 该是一个初始化的路由数组进行初始化。如果initalRoute属性没有设置的话,那么就必须设置initialRouteStack属性,使用该最后一项作为初始路由。 如果initalRouteStack属性没有设置的话,该会生成只包含initalRoute值的数组 
navigationBar -- node 该为可选的参数,在页面切换中用来提供一个导航栏 
navigator -- object 该为可选参数,可以从父类导航器中获取导航器对象 
onDidFoucs -- function 该方法已经废弃,我们可以使用navigationContext.addListener(‘didfocus’,callback)方法进行替代。该会在每次页面切换完成或者初始化之后进行调用该方法。该参数为新页面的路由 
onWillFocus --function 该方法已经废弃,我们可以使用navigationContext.addListener(‘willfocus’,callback)方法进行替代。该会页面每次进行切换之前调用 
renderScene -- function 该为必须调用的方法,该用来渲染每一个路由指定的页面。参数为路由以及导航器对象两个参数,具体是方法如下:

(route, navigator) =>
1
1

sceneStyle -- 样式风格,该继承了View视图的所有样式风格。该设置用于每个页面容器的风格

5.实例

'use strict';import React, { Component }  from 'react';import {    AppRegistry,    StyleSheet,    Text,    View,    Navigator,    TouchableHighlight,} from 'react-native';class NavButton extends Component {
render() { return (
{
this.props.text}
); }}class HomeScene extends Component {
render() { return(
{ this.props.navigator.push({ component: ConfigsScene, name: '手势属性', }); }} text='手势属性' />
{ this.props.navigator.push({ component: MethodsScene, name: '方法', }); }} text='方法' />
); }}class ConfigsScene extends Component {
render() { return (
{
this.props.message}
{ this.props.navigator.pop(); }} text="返回上一页" />
{ this.props.navigator.push({ component: EndScene, sceneConfig: Navigator.SceneConfigs.PushFromRight, }); }} text="PushFromRight default" />
{ this.props.navigator.push({ component: EndScene, sceneConfig: Navigator.SceneConfigs.FloatFromRight, }); }} text="FloatFromRight" />
{ this.props.navigator.push({ component: EndScene, sceneConfig: Navigator.SceneConfigs.FloatFromLeft, }); }} text="FloatFromLeft" />
{ this.props.navigator.push({ component: EndScene, sceneConfig: Navigator.SceneConfigs.FloatFromBottom, }); }} text="FloatFromBottom" />
{ this.props.navigator.push({ component: EndScene, sceneConfig: Navigator.SceneConfigs.FloatFromBottomAndroid, }); }} text="FloatFromBottomAndroid" />
{ this.props.navigator.push({ component: EndScene, sceneConfig: Navigator.SceneConfigs.FadeAndroid, }); }} text="FadeAndroid" />
{ this.props.navigator.push({ component: EndScene, sceneConfig: Navigator.SceneConfigs.HorizontalSwipeJump, }); }} text="HorizontalSwipeJump" />
{ this.props.navigator.push({ component: EndScene, sceneConfig: Navigator.SceneConfigs.HorizontalSwipeJumpFromRight, }); }} text="HorizontalSwipeJumpFromRight" />
{ this.props.navigator.push({ component: EndScene, sceneConfig: Navigator.SceneConfigs.VerticalUpSwipeJump, }); }} text="VerticalUpSwipeJump" />
{ this.props.navigator.push({ component: EndScene, sceneConfig: Navigator.SceneConfigs.VerticalDownSwipeJump, }); }} text="VerticalDownSwipeJump" />
); }}class MethodsScene extends Component {
render() { return (
Current Routes length: {
this.props.navigator.getCurrentRoutes().length}
{ this.props.navigator.jumpBack(); }} text='jumpBack' />
{ }} text='jumpForward' />
{ }} text='jumpTo' />
); }}class EndScene extends Component {
render() { return (
{ this.props.navigator.pop(); }} text="返回上一页" />
{ this.props.navigator.popToTop(); }} text="退到栈中第一个页面" />
); }}export default class NavigatorMazouri extends Component {
render() { return (
{ let Component = route.component; if(route.component) { return
} }} configureScene={
(route) => { if (route.sceneConfig) { return route.sceneConfig; } return Navigator.SceneConfigs.PushFromRight; }} /> ); }}const styles = StyleSheet.create({ container: { flex: 1, justifyContent: 'center', backgroundColor: '#F5FCFF', }, messageText: { fontSize: 17, fontWeight: '500', padding: 15, marginTop: 50, marginLeft: 15, }, button: { backgroundColor: 'white', padding: 15, borderBottomWidth: StyleSheet.hairlineWidth, borderBottomColor: '#CDCDCD', },});
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
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
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
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253

 
 

你可能感兴趣的文章
GMTC2019会后:做一场冷门的技术专场是什么体验
查看>>
python的文件打开
查看>>
javascript继承--原型链继承
查看>>
IE奇怪报错
查看>>
能源项目xml文件 -- app-datasource.xml
查看>>
Tarjan
查看>>
WebSocket
查看>>
[Debug记录]Xcode4.6 CBTarget error
查看>>
[交流]百度在从六月开始的收录清零行动中的新算法
查看>>
recv send 阻塞和非阻塞
查看>>
《Effective C++》读书摘要
查看>>
Effective Java 36 Consistently use the Override annotation
查看>>
Ext选项卡tabpanel切换动态加载数据
查看>>
Mysql的安装
查看>>
python第一课
查看>>
SpringBoot返回date日期格式化,解决返回为TIMESTAMP时间戳格式或8小时时间差
查看>>
Android网络编程之一个Android下菜单系统模块的实现(服务器端—更新菜单)
查看>>
[zz]字符串转换成整数
查看>>
WebForm——浏览器兼容、旋转、缩放、倾斜、移动
查看>>
【TDS学习文档4】IBM Directory schema的管理2——object class
查看>>