【问题标题】:React Native: How to switch page without using NavigatorIOS component?React Native:如何在不使用 NavigatorIOS 组件的情况下切换页面?
【发布时间】:2015-12-09 16:32:11
【问题描述】:

我是 react js 和 react native 的新手,我想知道如何在不依赖 navigatorIOS 或 navigator 组件的情况下从一个页面(组件)导航到另一个页面(组件)?在 Hybrid 开发模式下,很简单,只需添加带有 href 属性的 html 元素 A 就可以了,但在 React Native 中,不使用 NavigatorIOS 怎么办?

【问题讨论】:

    标签: javascript reactjs react-native


    【解决方案1】:

    一种方法是创建一个函数来呈现您希望在单击时显示的组件,基本上复制了 href 的功能:

      changeComponent: function(component) {
        this.setState({
            componentSelected: component    
        })
      },
    
      renderComponent: function(component) {
            if(component == 'One') {
            return <ComponentOne changeComponent={this.changeComponent} />
          } else if(component == 'Two') {
            return <ComponentTwo changeComponent={this.changeComponent} />
          } else if(component == 'Three') {
            return <ComponentThree changeComponent={this.changeComponent} />
          }
      },
    
      render: function() {
        return (
          <View style={styles.container}>
            {this.renderComponent(this.state.componentSelected)}
          </View>
        );
      }
    

    然后像这样调用函数:

    <TouchableHighlight onPress={() => this.props.changeComponent('Two') } style={styles.button}><Text>Two</Text></TouchableHighlight>
    

    我建立了一个完整的项目here

    https://rnplay.org/apps/HbqJpA

    'use strict';
    
    var React = require('react-native');
    var {
      AppRegistry,
      StyleSheet,
      Text,
      View,
      TouchableHighlight
    } = React;
    
    var SampleApp = React.createClass({
    
      getInitialState: function() {
            return {
                componentSelected: 'One'
            }
        },
    
      changeComponent: function(component) {
        this.setState({
            componentSelected: component    
        })
      },
    
      renderComponent: function(component) {
            if(component == 'One') {
            return <ComponentOne changeComponent={this.changeComponent} />
          } else if(component == 'Two') {
            return <ComponentTwo changeComponent={this.changeComponent} />
          } else if(component == 'Three') {
            return <ComponentThree changeComponent={this.changeComponent} />
          }
      },
    
      render: function() {
        return (
          <View style={styles.container}>
            {this.renderComponent(this.state.componentSelected)}
          </View>
        );
      }
    });
    
    var ComponentOne = React.createClass({
        render: function() {
        return (
            <View style={{backgroundColor: 'red', paddingTop:60, flex:1}}>
            <Text style={{color: 'white', marginBottom:150, fontSize:20}}>Hello From Component One</Text>
            <TouchableHighlight onPress={() => this.props.changeComponent('Two') } style={styles.button}><Text>Two</Text></TouchableHighlight>
            <TouchableHighlight onPress={() => this.props.changeComponent('Three') } style={styles.button}><Text>Three</Text></TouchableHighlight>
          </View>
        )
      }
    })
    
    var ComponentTwo = React.createClass({
        render: function() {
        return (
            <View style={{backgroundColor: 'orange', paddingTop:60, flex:1}}>
            <Text style={{color: 'white', marginBottom:150, fontSize:20}}>Hello From Component Two</Text>
            <TouchableHighlight onPress={() => this.props.changeComponent('One') } style={styles.button}><Text>One</Text></TouchableHighlight>
            <TouchableHighlight onPress={() => this.props.changeComponent('Three') } style={styles.button}><Text>Three</Text></TouchableHighlight>
          </View>
        )
      }
    })
    
    
    var ComponentThree = React.createClass({
        render: function() {
        return (
            <View style={{backgroundColor: 'purple', paddingTop:60, flex:1}}>
            <Text style={{color: 'white', marginBottom:150, fontSize:20}}>Hello From Component Three</Text>
            <TouchableHighlight onPress={() => this.props.changeComponent('One') } style={styles.button}><Text>One</Text></TouchableHighlight>
            <TouchableHighlight onPress={() => this.props.changeComponent('Two') } style={styles.button}><Text>Two</Text></TouchableHighlight>
          </View>
        )
      }
    })
    
    var styles = StyleSheet.create({
      container: {
        flex: 1,
      },
      button: {
        flexDirection: 'row',
        height: 60,
        justifyContent: 'center',
        alignItems: 'center',
        backgroundColor: '#ededed'
      }
    });
    
    AppRegistry.registerComponent('SampleApp', () => SampleApp);
    

    【讨论】:

    • 非常感谢你的回答,我一开始就是靠setState来改变组件的,但是我还是觉得很不方便。这是一个例子:
    • 页面1有两个按钮,一个重定向到Page1.a,另一个重定向到Page1.b,Page1.a有一个按钮,这个按钮应该重定向到Page1.b,想象一下如果我们有一个像这样的深层页面树,那么使用 setState 和 switch 组件会非常不方便和痛苦,我真的怀疑为什么 react native 没有重定向到另一个页面的功能:(
    • Navigator tbh 中涵盖了大部分内容,是的,以这种方式处理复杂/嵌套状态将是一个巨大的痛苦,哈哈!
    【解决方案2】:

    这里是 nader 的代码,但是更新到最新版本的 react-native

    import React, { Component } from 'react';
    import {
      AppRegistry,
      StyleSheet,
      Text,
      View,
      Image,
      WebView,
      Dimensions,
      Modal,
      TouchableHighlight
    } from 'react-native';
    
    class test extends Component {
      constructor(props)
      {
        super(props);
        this.state =
        {
          componentSelected: 'One',
        }
      }
    
      changeComponent = (component) =>{
        this.setState({componentSelected: component});
      }
    
      renderComponent(component) {
            if(component == 'One') {
            return <ComponentOne changeComponent={this.changeComponent} />
          } else if(component == 'Two') {
            return <ComponentTwo changeComponent={this.changeComponent} />
          } else if(component == 'Three') {
            return <ComponentThree changeComponent={this.changeComponent} />
          }
      }
    
      render() {
        return (
          <View style={styles.container}>
            {this.renderComponent(this.state.componentSelected)}
          </View>
        );
      }
    }
    
    class ComponentOne extends Component {
        render() {
        return (
            <View style={{backgroundColor: 'red', paddingTop:60, flex:1}}>
            <Text style={{color: 'white', marginBottom:150, fontSize:20}}>Hello From Component One</Text>
            <TouchableHighlight onPress={() => this.props.changeComponent('Two') } style={styles.button}><Text>Two</Text></TouchableHighlight>
            <TouchableHighlight onPress={() => this.props.changeComponent('Three') } style={styles.button}><Text>Three</Text></TouchableHighlight>
          </View>
        )
      }
    }
    
    class ComponentTwo extends Component {
        render() {
        return (
            <View style={{backgroundColor: 'orange', paddingTop:60, flex:1}}>
            <Text style={{color: 'white', marginBottom:150, fontSize:20}}>Hello From Component Two</Text>
            <TouchableHighlight onPress={() => this.props.changeComponent('One') } style={styles.button}><Text>One</Text></TouchableHighlight>
            <TouchableHighlight onPress={() => this.props.changeComponent('Three') } style={styles.button}><Text>Three</Text></TouchableHighlight>
          </View>
        )
      }
    }
    
    
    class ComponentThree extends Component {
        render() {
        return (
            <View style={{backgroundColor: 'purple', paddingTop:60, flex:1}}>
            <Text style={{color: 'white', marginBottom:150, fontSize:20}}>Hello From Component Three</Text>
            <TouchableHighlight onPress={() => this.props.changeComponent('One') } style={styles.button}><Text>One</Text></TouchableHighlight>
            <TouchableHighlight onPress={() => this.props.changeComponent('Two') } style={styles.button}><Text>Two</Text></TouchableHighlight>
          </View>
        )
      }
    }
    
    const styles = StyleSheet.create({
      container: {
        flex: 1,
      },
      button: {
        flexDirection: 'row',
        height: 60,
        justifyContent: 'center',
        alignItems: 'center',
        backgroundColor: '#ededed'
      }
    });
    
    AppRegistry.registerComponent('test', () => test);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-21
      • 1970-01-01
      • 2020-04-20
      • 2015-05-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多