【问题标题】:React Navigation changing tab icons on tab navigator dynamicallyReact Navigation 动态更改选项卡导航器上的选项卡图标
【发布时间】:2017-10-10 21:01:40
【问题描述】:

所以我是新来的反应原生和redux。该应用程序已(由其他人)配置为具有react-navigationredux。现在我们使用TabNavigator(底部)作为我们的菜单,这个TabNavigator 还包含登录按钮。现在我要做的是当用户登录时,登录按钮(带有文本和图标)变为注销。

有没有办法做到这一点?我的TabNavigator 也在一个单独的文件中。

我想要的是这样的:

TabNavigator(
  {
    ...other screens,
    //show this only if not logged in
    Login: {
      screen: LoginScreen
    },
    //show this only if logged in
    Logout: {
      screen: //There should be no screen here just the logout functionality
    }
  },
  {...options here}
)

提前致谢。

【问题讨论】:

    标签: react-native redux react-redux react-navigation


    【解决方案1】:

    你可以使用 Redux 做到这一点:

    AuthIcon.js:

    const LOGGED_IN_IMAGE = require(...)
    const LOGGED_OUT_IMAGE = require(...)
    
    class AuthIcon extends React.Component {
      render() {
        const { loggedIn, focused, tintColor } = this.props
         // loggedIn is what tells your app when the user is logged in, you can call it something else, it comes from redux
        return (
           <View>
             <Image source={loggedIn ? LOGGED_IN_IMAGE : LOGGED_OUT_IMAGE} resizeMode='stretch' style={{ tintColor: focused ? tintColor : null, width: 21, height: 21 }} />
          </View>
        )
      }
    }
    
    const ConnectedAuthIcon = connect(state => {
       const { loggedIn } = state.auth
       return { loggedIn }
    })(AuthIcon)
    
    export default ConnectedAuthIcon;
    

    然后在您的 TabNavigator 文件中:

    import ConnectedAuthIcon from './AuthIcon.js'
    
    export default TabNavigator({
      Auth: {
        screen: Auth,
        navigationOptions: ({ navigation }) => ({
          tabBarLabel: null,
          tabBarIcon: ({ tintColor, focused }) => <ConnectedAuthIcon tintColor={tintColor} focused={focused} />,
          title: "Auth"
        })
      }
    })
    

    编辑:

    在您的 Auth.js 中:

    class Auth extends React.Component {
    
      render() {
        const { loggedIn } = this.props
        if (loggedIn) {
          return <Profile />
        } else {
          return <Login />
        }
      }
    
    }
    
    export default connect(state => {
      const { loggedIn } = state.auth
      return { loggedIn }
    })(Auth)
    

    【讨论】:

    • 那个图标对应的屏幕怎么样?我的意思是登录时的操作和注销时的操作。
    • 简单。您的 Auth 组件也将连接到 redux,如果 loggedIn 为 true,它将呈现配置文件,否则将登录。 Profile 和 Login 可以是单独的组件,您可以在 Auth 中有条件地呈现相应的组件
    • 对不起,我是 redux 和反应导航的新手,所以我不知道你刚才说了什么。如果您能举个例子,将不胜感激。 :) 给您带来的麻烦,我深表歉意。
    • 我的问题与您的示例有所不同,即当用户登录时,应该没有屏幕,而只有“注销”选项卡,这就是为什么我无法在线找到确切示例的原因。当用户登录时,您的示例中有一个配置文件屏幕。
    • 另外,我还需要选项卡上的文本是登录或注销,在您的示例中,您只是更改图标。
    猜你喜欢
    • 2018-10-30
    • 1970-01-01
    • 2020-06-30
    • 1970-01-01
    • 2018-03-07
    • 1970-01-01
    • 1970-01-01
    • 2020-03-30
    • 1970-01-01
    相关资源
    最近更新 更多