【问题标题】:Native Base Footer Nav Tabs原生基本页脚导航选项卡
【发布时间】:2017-05-27 01:03:51
【问题描述】:

我是 React Native 的新手,我创建了一个带有三个按钮选项卡的页脚。我现在想知道如何通过单击按钮来呈现不同的屏幕。我的代码:

export default class Uptown extends Component {
render() {
  return (
    <Container>
      <Header>
        <Title>Uptown</Title>
      </Header>

      <Content>
        <App />
      </Content>

            <Footer>
                <FooterTab>
                  <Button>
                    Contact
                  </Button>
                  <Button>
                    Here
                  </Button>
                  <Button>
                    Me
                  </Button>
                </FooterTab>
            </Footer>
        </Container>
  );
 }
}

按下按钮时如何切换屏幕?

【问题讨论】:

    标签: react-native navigation


    【解决方案1】:

    您可以添加条件渲染而不是静态&lt;App/&gt; 标签。您可以使用以下代码根据选定的页脚有条件地呈现。 (我使用状态变量来存储选定的页面索引。当索引更改时,引擎会自动调用渲染函数)

    import First from './Home' // your first screen
    import Next from './Next' // your second screen
    
    class Updown extends Component {
       constructor(props) {
          super(props)
          this.state = {index: 0} // default screen index
       }
    
       switchScreen(index) {
          this.setState({index: index})
       }
    
       render() {
          let AppComponent = null;
    
          if (this.state.index == 0) {
             AppComponent = First
          } else {
             AppComponent = Second
          }
    
          return (
             <Container>
               <Header><Title> Header... </Title></Header>
               <Content> <AppComponent/> </Content>
               <Footer>
                   <Button onPress={() => this.switchScreen(0) }> First </Button>
                   <Button onPress={() => this.switchScreen(1) }> Second </Button>
               </Footer>
             </Container>
           )
       }
    }
    

    【讨论】:

    • 你应该在构造函数中使用:this.state = {index: 0} 而不是:this.setState({...})
    • @HosseinMobasher 。我能够显示这样的内容,但问题是来自另一个选项卡的内容不可滚动。当我查看标签而不从外部渲染时,它是可滚动的。我做错了什么?
    • @Somename 你使用的是哪个标签的库?
    • @HosseinMobasher 感谢队友。我整理好了我在两个页面中都定义了content。我从导入选项卡和它的工作中删除了它。不知道你说的标签库是什么意思。请详细说明。
    • stackoverflow.com/q/53774572/5498065 你能看看这个我正在尝试做同样的事情,但我找不到解决方案
    【解决方案2】:

    我认为从 native-base v2.3.1(2017 年 8 月)开始,推荐的方法是关注 documentation on React Navigation / TabNavigator。当然,这只是在你真正打算使用 TabNavigator(我这样做)和 React Navigation 的好处(我没有足够的知识来说明它们是什么)的情况下。

    但是,如果您希望页脚选项卡成为应用主导航结构的一部分,而不是一个页面的临时机制,这似乎是可行的方法。

    import React, { Component } from "react";
    import LucyChat from "./LucyChat.js";
    import JadeChat from "./JadeChat.js";
    import NineChat from "./NineChat.js";
    import { TabNavigator } from "react-navigation";
    import { Button, Text, Icon, Footer, FooterTab } from "native-base";
    export default (MainScreenNavigator = TabNavigator(
      {
        LucyChat: { screen: LucyChat },
        JadeChat: { screen: JadeChat },
        NineChat: { screen: NineChat }
      },
      {
        tabBarPosition: "bottom",
        tabBarComponent: props => {
          return (
            <Footer>
              <FooterTab>
                <Button
                  vertical
                  active={props.navigationState.index === 0}
                  onPress={() => props.navigation.navigate("LucyChat")}>
                  <Icon name="bowtie" />
                  <Text>Lucy</Text>
                </Button>
                <Button
                  vertical
                  active={props.navigationState.index === 1}
                  onPress={() => props.navigation.navigate("JadeChat")}>
                  <Icon name="briefcase" />
                  <Text>Nine</Text>
                </Button>
                <Button
                  vertical
                  active={props.navigationState.index === 2}
                  onPress={() => props.navigation.navigate("NineChat")}>
                  <Icon name="headset" />
                  <Text>Jade</Text>
                </Button>
              </FooterTab>
            </Footer>
          );
        }
      }
    ));
    

    【讨论】:

    • 请问,如何定位我们要在页脚标签按下时显示屏幕的元素?
    【解决方案3】:

    您需要创建一个当前索引并绑定功能以从一个选项卡切换到另一个选项卡。 要做到这一点,请使用:

    import First from './First' 
    import Second from './Second' 
    
    class Updown extends Component {
       constructor(props) {
          super(props)
          this.setState({currentIndex: 0}) // default screen index
       }
    
       switchScreen(index) {
          this.setState({currentIndex: index})
       }
    
       render() {
          let AppComponent = null;
    //Here you can add as many tabs you need
          if (this.state.currentIndex == 0) {
             AppComponent = First
          } else {
             AppComponent = Second
          }
    
          return (
             <Container>
               <Header><Title> Header... </Title></Header>
               <Content> 
               {AppComponent}  // Load the component like this
              </Content>
               <Footer>
    //HERE don't forget the bind function and pass the appropriate number
                   <Button onPress={() => this.switchScreen.bind(this,0) }> First </Button>
                   <Button onPress={() => this.switchScreen.bind(this,1) }> Second </Button>
               </Footer>
             </Container>
           )
       }
    }
    

    希望对你有帮助:)

    【讨论】:

    • 这对我来说根本不起作用。它抛出错误`对象作为反应子项无效(找到:带有键 {} 的对象)。如果您打算渲染一组子项,请改用数组。
    • @msqar 可能是因为它不是字符串格式。使用 toString() 函数将其转换为字符串或将其解析为字符串。此外,您错误地导入了某些内容或将其作为未识别的对象提供
    【解决方案4】:

    我认为我们可以检查@Hossein Mobasher 代码的某些部分

    import First from './Home' // your first screen
    import Next from './Next' // your second screen
    
    class Updown extends Component {
       constructor(props) {
          super(props)
          this.state = {index: 0} // default screen index
       }
    
       switchScreen(index) {
          this.setState({index: index})
       }
    
       render() {
          let AppComponent = null;
    
          if (this.state.index == 0) {
             AppComponent = First
          } else {
             AppComponent = Second
          }
    
          return (
             <Container>
               <Header><Title> Header... </Title></Header>
               <Content> 
                <AppComponent/> // you can write like this
               </Content>
               <Footer>
                   <Button onPress={() => this.switchScreen(0) }> First </Button>
                   <Button onPress={() => this.switchScreen(1) }> Second </Button>
               </Footer>
             </Container>
           )
       }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-19
      • 2018-02-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      相关资源
      最近更新 更多