【问题标题】:react-native: How to combine react-native-router-flux and react-native-drawer?react-native:如何结合 react-native-router-flux 和 react-native-drawer?
【发布时间】:2017-03-13 12:53:04
【问题描述】:

我正在尝试将 react-native-router-fluxreact-native-drawer 集成

我的主要组件实际上是 App.js 。我只复制/粘贴相关的部分。

import AppRoutes from './Router';
...
constructor(props) {
    firebase.auth().onAuthStateChanged((user) => {
      if (user) {
        Actions.mainBucket({ type: 'reset' });
      } else {
        Actions.authBucket({ type: 'reset' });
      }
    });
    super(props);
  }
}
...
  render() {
    const store = createStore(
      reducers, 
      {}, 
      applyMiddleware(ReduxThunk)
    );

    return (
      <Provider store={store}>
        <AppRoutes />
      </Provider>
    );
  }

这是 Router.js

const scenes = Actions.create(
  <Scene key="root" hideNavBar open={false} >
    <Scene key="splashBucket">
      <Scene key="splashScene" component={SplashScreen} title="Splash Screen Title" hideNavBar />
    </Scene>
    <Scene key="authBucket">
      <Scene key="authScene" component={AuthForm} title="Accesso" hideNavBar={false} />
    </Scene>
    <Scene key="mainBucket" hideNavBar={false}>
      <Scene key="schedule" component={Schedule} title="Impegni"  />
      <Scene key="peopleList" component={PeopleList} title="Lista pesone"/>
    </Scene>
  </Scene>
);

const AppRoutes = () => (
  <Router 
    sceneStyle={{ paddingTop: 65 }} 
    scenes={scenes}
  />
);

export default AppRoutes;

我的目标是使用键“mainBucket”将 SideDrawer 添加到场景存储桶中。,因为如您所见,这是/将是我的应用程序的主要部分,而用户是使用 firebase 自动重定向到这个实现自动登录的存储桶。

自动登录和mainBucket的打开工作。

要开始添加 sidedrawer,我认为 sidedrawer 内容组件最初只会渲染一个 &lt;Text&gt; usingn SideMenu 组件

我该怎么做?

我创建了以下两个文件。

第一个是NavigationDrawer.js

export default class NavigationDrawer extends Component {
  render() {
    const state = this.props.navigationState;
    const children = state.children;
    return (
      <Drawer
        ref="navigation"
        open={state.open}
        onOpen={() => Actions.refresh({ key: state.key, open: true })}
        onClose={() => Actions.refresh({ key: state.key, open: false })}
        type="displace"
        content={<SideMenu />}
        tapToClose
        openDrawerOffset={0.2}
        panCloseMask={0.2}
        negotiatePan
        tweenHandler={(ratio) => ({
          main: { opacity: Math.max(0.54, 1 - ratio) }
        })}
      >
        <DefaultRenderer navigationState={children[0]} onNavigate={this.props.onNavigate} />
      </Drawer>
    );
  }
}

第二个是近乎空的 SideMenu.js

import React from 'react';
import { View, Text } from 'react-native';

const SideMenu = () => (
  <View>
    <Text> 
      SideMenu
    </Text>
  </View>
);

export default SideMenu;

然后我尝试修改场景定义,将 NavigationDrawer 组件添加到 mainBucket 定义中

<Scene key="mainBucket" component={NavigationDrawer}>
  <Scene key="schedule" initital component={Schedule} title="Impegni" hideNavBar={false} />
  <Scene key="peopleList" component={PeopleList} title="Lista persone" hideNavBar={false} />
</Scene>

问题是我看不到带有标题的 react-native-router-flux 标题,所以我没有更多的顶部操作栏。

我做错了什么?

【问题讨论】:

    标签: react-native react-native-android react-native-router-flux react-native-drawer


    【解决方案1】:

    这行得通。我用另一个场景包裹了整个 mainBucket,在这个场景中我使用了抽屉作为组件。

    另请注意,我将样式移至单个场景

    const scenes = Actions.create(
      <Scene key="root">
    
        <Scene key="splashBucket">
          <Scene key="splashScene" component={SplashScreen} title="Splash Screen Title" hideNavBar />
        </Scene>
    
        <Scene key="authBucket" sceneStyle={{ paddingTop: 65 }}>
          <Scene key="authScene" component={AuthForm} title="Accesso" hideNavBar={false} />
        </Scene>
    
        <Scene key="mainBucket" component={NavigationDrawer}>
          <Scene key="mainBucketInternal">
            <Scene 
              initital
              key="schedule" 
              component={Schedule} 
              title="Impegni" 
              hideNavBar={false} 
              sceneStyle={{ paddingTop: 65 }} 
            />
            <Scene 
              key="peopleList" 
              component={PeopleList} 
              title="Lista persone" 
              hideNavBar={false} 
              sceneStyle={{ paddingTop: 65 }} 
            />
          </Scene>
        </Scene>
    
      </Scene>
    );
    
    const AppRoutes = () => (
      <Router 
        scenes={scenes}
      />
    );
    
    export default AppRoutes;
    

    【讨论】:

    • 嗨。感谢您的解释。你能解释一下如何为标签实现这一点吗?选项卡的数量会根据身份验证而变化。
    猜你喜欢
    • 1970-01-01
    • 2017-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    相关资源
    最近更新 更多