为什么在 react-native 中使用 this.props.navigator.replace 再次渲染同一个场景?
Why in react-native does the same scene gets render again using this.props.navigator.replace?
我正在玩 react-native,特别是 navigator
组件。我有一个简单的登录场景,在按下按钮后我想被重定向到另一个页面。
我不明白为什么当我按下按钮时我再次渲染相同的场景。我没有去 MainScreen,而是再次被路由到 LoginScreen。
index.ios.js
'use strict';
var React = require('react-native');
var {
AppRegistry,
StyleSheet,
Text,
View,
Navigator,
} = React;
var MainScreen = require('./MainScreen');
var LoginScreen = require('./LoginScreen');
var App = React.createClass({
render: function () {
return (
<Navigator
style={styles.navigationContainer}
initialRoute={{id: 'LoginScreen', name:'Login'}}
renderScene={(route, navigator) =><LoginScreen navigator={navigator}/>}
/>
);
}
});
var styles = StyleSheet.create({
navigationContainer: {
flex: 1
}
});
AppRegistry.registerComponent('App', () => App);
LoginScreen.js
'use strict';
var React = require('react-native');
var Dimensions = require('Dimensions');
var windowSize = Dimensions.get('window');
var {
AppRegistry,
StyleSheet,
View,
Text,
TextInput,
Image,
TouchableHighlight
} = React;
var MainScreen = require("./MainScreen");
var LoginScreen = React.createClass({
getInitialState: function() {
return {
username: '',
password: ''
}
},
goToMainScreen: function () {
this.props.navigator.replace({
id: MainScreen
});
},
render: function() {
return (
<View style={styles.container}>
<View style={styles.header}>
<Image style={styles.mark} source={{uri: ''}} />
</View>
<View style={styles.usernameAndPasswordContainer}>
<View style={styles.inputContainer}>
<TextInput
style={styles.input}
enablesReturnKeyAutomatically={true}
onEndEditing={event => this.setState({username: event.nativeEvent.text})}
placeholder="Username"
placeholderTextColor="#002A32"
/>
</View>
<View style={styles.inputContainer}>
<TextInput
password={true}
style={styles.input}
placeholder="Password"
placeholderTextColor="#002A32"
onEndEditing={event => this.setState({password: event.nativeEvent.text})}
/>
</View>
</View>
<TouchableHighlight
style={styles.signin}
onPress={this.goToMainScreen.bind(this)}
>
<Text>Sign in!</Text>
</TouchableHighlight>
</View>
);
}
});
var styles = StyleSheet.create({ ... });
问题是您的 renderScene
方法需要知道要呈现哪个组件,但您总是向它发送 LoginScreen 组件。做这样的事情:
renderScene: (route, navigator) {
Component = route.component
<Component navigator={navigator} route={route} />
}
这意味着您通过将组件键传递给导航器来移动到新场景。
this.props.navigator.replace({
component: MainScreen
});
我正在玩 react-native,特别是 navigator
组件。我有一个简单的登录场景,在按下按钮后我想被重定向到另一个页面。
我不明白为什么当我按下按钮时我再次渲染相同的场景。我没有去 MainScreen,而是再次被路由到 LoginScreen。
index.ios.js
'use strict';
var React = require('react-native');
var {
AppRegistry,
StyleSheet,
Text,
View,
Navigator,
} = React;
var MainScreen = require('./MainScreen');
var LoginScreen = require('./LoginScreen');
var App = React.createClass({
render: function () {
return (
<Navigator
style={styles.navigationContainer}
initialRoute={{id: 'LoginScreen', name:'Login'}}
renderScene={(route, navigator) =><LoginScreen navigator={navigator}/>}
/>
);
}
});
var styles = StyleSheet.create({
navigationContainer: {
flex: 1
}
});
AppRegistry.registerComponent('App', () => App);
LoginScreen.js
'use strict';
var React = require('react-native');
var Dimensions = require('Dimensions');
var windowSize = Dimensions.get('window');
var {
AppRegistry,
StyleSheet,
View,
Text,
TextInput,
Image,
TouchableHighlight
} = React;
var MainScreen = require("./MainScreen");
var LoginScreen = React.createClass({
getInitialState: function() {
return {
username: '',
password: ''
}
},
goToMainScreen: function () {
this.props.navigator.replace({
id: MainScreen
});
},
render: function() {
return (
<View style={styles.container}>
<View style={styles.header}>
<Image style={styles.mark} source={{uri: ''}} />
</View>
<View style={styles.usernameAndPasswordContainer}>
<View style={styles.inputContainer}>
<TextInput
style={styles.input}
enablesReturnKeyAutomatically={true}
onEndEditing={event => this.setState({username: event.nativeEvent.text})}
placeholder="Username"
placeholderTextColor="#002A32"
/>
</View>
<View style={styles.inputContainer}>
<TextInput
password={true}
style={styles.input}
placeholder="Password"
placeholderTextColor="#002A32"
onEndEditing={event => this.setState({password: event.nativeEvent.text})}
/>
</View>
</View>
<TouchableHighlight
style={styles.signin}
onPress={this.goToMainScreen.bind(this)}
>
<Text>Sign in!</Text>
</TouchableHighlight>
</View>
);
}
});
var styles = StyleSheet.create({ ... });
问题是您的 renderScene
方法需要知道要呈现哪个组件,但您总是向它发送 LoginScreen 组件。做这样的事情:
renderScene: (route, navigator) {
Component = route.component
<Component navigator={navigator} route={route} />
}
这意味着您通过将组件键传递给导航器来移动到新场景。
this.props.navigator.replace({
component: MainScreen
});