为什么在react native中使用this.props.navigator.replace再次渲染同一场景

Why in react-native does the same scene gets render again using this.props.navigator.replace?

本文关键字:一场 replace native react navigator props this 为什么      更新时间:2023-09-26

我使用的是react native,尤其是navigator组件。我有一个简单的登录场景,按下按钮后,我想重定向到另一个页面。

我不明白为什么当我按下按钮时,我会再次渲染相同的场景。我没有转到主屏幕,而是再次转到登录屏幕。

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);  

登录屏幕.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
});