您的位置:首页 > Web前端 > React

react-native--Navigator

2016-04-07 21:10 405 查看
'use strict';
import React, {
AppRegistry,
Component,
Navigator,
} from 'react-native';

import SplashScreen from './splash.js'

class AwesomeProject extends Component {
render() {
let defaultName = 'Splash';
let defaultComponent = SplashScreen;
return (
<Navigator
initialRoute={{ name: defaultName, component: defaultComponent }}
configureScene={(route) => {
return Navigator.SceneConfigs.HorizontalSwipeJumpFromRight;
} }
renderScene={(route, navigator) => {
let Component = route.component;
return <Component {...route.params} navigator={navigator} />
} }
/>
);
}
}

AppRegistry.registerComponent('AwesomeProject', () => AwesomeProject);


//代码分析:

initialRoute–定义启动时加载的路由。路由是导航栏用来识别渲染场景的一个对象。initialRoute必须是initialRouteStack中的一个路由。initialRoute默认为initialRouteStack中最后一项!

initialRoute={{ name: defaultName, component: defaultComponent }} 这个指定了默认的页面,也就是启动app之后会看到界面的第一屏。 需要填写两个参数: name 跟 component。

configureScene

可选的函数,用来配置场景动画和手势。会带有两个参数调用,一个是当前的路由,一个是当前的路由栈。然后它应当返回一个场景配置对象!

(route, routeStack) => Navigator.SceneConfigs.FloatFromRight

configureScene={(route) => {
return Navigator.SceneConfigs.HorizontalSwipeJumpFromRight;
} }


renderScene function

必要参数。用来渲染指定路由的场景。调用的参数是路由和导航器。

(route, navigator) =>
<MySceneComponent title={route.title} navigator={navigator} />

renderScene={(route, navigator) => {
let Component = route.component;
return <Component {...route.params} navigator={navigator} />
}


…route.params—-数据传递来源

route传递的是component和name,navigator传递的Navigator对象,navigator作为props传递给component!

如果你得到了一个navigator对象的引用,则可以调用许多方法来进行导航:

● getCurrentRoutes() - 获取当前栈里的路由,也就是push进来,没有pop掉的那些。

● jumpBack() - 跳回之前的路由,当然前提是保留现在的,还可以再跳回来,会给你保留原样。

● jumpForward() - 上一个方法不是调到之前的路由了么,用这个跳回来就好了。

● jumpTo(route) - 跳转到已有的场景并且不卸载。

● push(route) - 跳转到新的场景,并且将场景入栈,你可以稍后跳转过去

● pop() - 跳转回去并且卸载掉当前场景

● replace(route) - 用一个新的路由替换掉当前场景

● replaceAtIndex(route, index) - 替换掉指定序列的路由场景

● replacePrevious(route) - 替换掉之前的场景

● immediatelyResetRouteStack(routeStack) - 用新的路由数组来重置路由栈

● popToRoute(route) - pop到路由指定的场景,其他的场景将会卸载。

● popToTop() - pop到栈中的第一个场景,卸载掉所有的其他场景。

//页面进行跳转
'use strict'
import React, {
Component,
TouchableOpacity,
View,
Text,
} from 'react-native'

import OnepageCompent from './index.one.js'

export default class SecondPageComponent extends Component {
constructor(props) {
super(props);
this.state = {};
}

_pressButton() {
const { navigator } = this.props;
if(navigator) {
//进入
navigator.push({
name: 'OnepageCompent',
component: OnepageCompent,
})
}
}

render() {
return(
<View>
<TouchableOpacity onPress={this._pressButton.bind(this)}>
<Text>点我</Text>
</TouchableOpacity>
</View>
);
}
}

'use strict'
import React, {
Component,
TouchableOpacity,
View,
Text,
} from 'react-native'

export default class OnepageCompent extends Component {
constructor(props) {
super(props);
this.state = {};
}

_pressButton() {
const { navigator } = this.props;
if(navigator) {
//跳转回去并且卸载掉当前场景<显示前一个页面>
navigator.pop();
}
}

render() {
return(
<View>
<TouchableOpacity onPress={this._pressButton.bind(this)}>
<Text>点我跳回去</Text>
</TouchableOpacity>
</View>
);
}
}


这个语法是把 route.params 里的每个key 作为props的一个属性:

<其他参数也是作为KEY>

navigator.push({
name: 'OnepageCompent',
component: OnepageCompent,
})


这里的route,最基本的route就是:
var route = {
component: LoginComponent
}


参数传递:

constructor(props) {
super(props);
this.state = {
id:2
};
}

_pressButton() {
const { navigator } = this.props;
if(navigator) {
navigator.push({
name: 'OnepageCompent',
component: OnepageCompent,
params:{
id:this.state.id
}
})
}
}


参数获取:

constructor(props) {
super(props);
this.state = {
id:null
};
}

componentDidMount(){
this.setState({
id: this.props.id
});
}


特殊需求:当然页面跳转到下一个页面,下一个页面处理玩数据,返回到前一个页面<当前页面>处理数据

<概念:上一个页面的实例或者回调方法,作为参数传递到当前页面来,在当前页面操作上一个页面的state>

'use strict'
import React, {
Component,
TouchableOpacity,
View,
Text,
ToastAndroid,
} from 'react-native'

import OnepageCompent from './index.one.js'

export default class SecondPageComponent extends Component {
constructor(props) {
super(props);
this.state = {
id:1,
user:null,
};
}

_pressButton() {
let _this = this;
const { navigator } = this.props;
if(navigator) {
navigator.push({
name: 'OnepageCompent',
component: OnepageCompent,
params: {
id: this.state.id,
getUser: function(user) {
_this.setState({
user: user
})
}
}
});
}
}

render() {
if( this.state.user ) {
return(
<View>
<Text>用户信息: { JSON.stringify(this.state.user) }</Text>
</View>
);
}else {
return(
<View>
<TouchableOpacity onPress={this._pressButton.bind(this)}>
<Text>查询ID为{ this.state.id }的用户信息</Text>
</TouchableOpacity>
</View>
);
}
}
}

'use strict'
import React, {
Component,
TouchableOpacity,
View,
Text,
ToastAndroid,
} from 'react-native'

const USER_MODELS = {
1: { name: 'mot', age: 23 },
2: { name: '晴明大大', age: 25 }
};

export default class OnepageCompent extends Component {
constructor(props) {
super(props);
this.state = {
id: null
};
}

componentDidMount() {
this.setState({
id: this.props.id
});

}
_pressButton() {
const { navigator } = this.props;

if(this.props.getUser) {
let user = USER_MODELS[this.props.id];
this.props.getUser(user);
}
if(navigator) {
navigator.pop();
}
}

render() {
return (
<View>
<TouchableOpacity onPress={this._pressButton.bind(this) }>
<Text>点我跳回去</Text>
</TouchableOpacity>
</View>
);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: