【问题标题】:react-navigation drawer how to set props and style to route components?react-navigation 抽屉如何设置道具和样式来路由组件?
【发布时间】:2019-11-04 02:42:31
【问题描述】:

我正在使用抽屉进行导航,但不知道如何为路线中使用的组件设置样式/道具。

抽屉是这样创建的:

const navigator = createDrawerNavigator(
  {
    Home,
    OtherPage,
  }
);

const AppContainer = createAppContainer(navigator);

export default class App extends React.Component {
  constructor(props){
    super(props);
    this.state={displayDisclaimer:true};
    this.pressDisclaimer = this.pressDisclaimer.bind(this);
  }

  pressDisclaimer(){
    disclaimerPassed = true;
    this.setState({displayDisclaimer:false});
  }

  render(){
    // return <Drawer/>
    if(this.state.displayDisclaimer)
      return (
        <View style={styles.container}>
          <Disclaimer clickHandler={this.pressDisclaimer}/>
        </View>
      )
    else return <AppContainer/>;
  }  
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: '#fff',
    alignItems: 'center',
    justifyContent: 'center',
  },
});

因此,如果我想为某些页面添加样式,我通常会渲染组件,例如 &lt;MyComponent style = {this.style.moreStyle} otherProps={propsHere}/&gt;

由于 createDrawerNavigator 不将组件实现作为参数,我该如何设置?

【问题讨论】:

    标签: react-native routes react-navigation


    【解决方案1】:

    我不确定这是否正是您要查找的内容,但这是我在主文件中所做的:

    import Home from './components/home'
    import OtherPage from './components/otherpage'
    import DrawerScreen from './components/drawerscreen'
    import LoginScreen from './components/loginscreen'
    
    const navigator = createDrawerNavigator(
      {
        Home: {screen: Home},
        OtherPage: {screen: OtherPage},
        LoginScreen: { screen: LoginScreen },
      },
      {
        contentComponent:   ({ navigation }) => (
              <DrawerScreen navigation={navigation} />
            ),
        drawerWidth: 300,
          initialRouteName: "LoginScreen"
      }
    );
    
    const AppContainer = createAppContainer(DrawerNavigator);
    
     export default class App extends Component {
      render() {
       return (
    
           <AppContainer />
    
        );
      }
    }
    

    然后在我的抽屉组件文件中,我执行以下操作:

    import { DrawerActions, NavigationEvents, NavigationActions } from 'react-navigation';
    
    export default class DrawerScreen extends Component {
    
      navigateToScreen = (route) => () => {
     const navigateAction = NavigationActions.navigate({
       routeName: route
    });
    this.props.navigation.dispatch(navigateAction);
    this.props.navigation.dispatch(DrawerActions.closeDrawer())
    }
    
    
     render () {
    
      const { navigation } = this.props;
      const homeProps = navigation.getChildNavigation('Home');
    
        console.log(homeProps);
    console.log(navigation);
    return (
    <View>
      <ScrollView>
        <View>
    
    
                    <View>
                    <View>
                    <Button onPress={() => this.props.navigation.navigate('Home')} title="Home"/>
                    </View>
                    </View>
                    <View>
                    <View style={styles.myMargins}>
                    <Button onPress={() => this.props.navigation.navigate('OtherPage', {propsFromDrawer: "blahblahblah", styleprops: "blahblahblah"})} title="Other Page"/>
                    </View>
                    </View>
    
    
        </View>
    
      </ScrollView>
    </View>
     );
    }
    
    }
    

    这里的抽屉将从主页获取道具,并在单击其他页面按钮时将其他道具发送到其他页面。我不确定这是否适用于您正在做的结构,但它适用于我的应用程序。

    编辑:这是从其他页面导航的示例。

    import React, { Component } from 'react';
    
    import {
    View,
    Text,
     ScrollView,
     StyleSheet,
     ActivityIndicator,
     TouchableOpacity,
     BackHandler,
     } from 'react-native';
    
    import { NavigationEvents, NavigationActions } from 'react-navigation';
    
    import { Header } from 'react-native-elements';
    export default class OtherPage extends Component {
    
    static navigationOptions = {
    title: 'OtherPage',
    headerStyle: {
      backgroundColor: '#0000CD',
    },
    headerTintColor: '#fff',
    };
    
    
    
    constructor(props){
     super(props)
    
     this.state = {stuffInState: 'blahblahblah'}
    
    }
    
    
    componentDidMount() {
    
    this.backHandler = 
      BackHandler.addEventListener('hardwareBackPress', () => {
      this.props.navigation.navigate('Home');
      return true;
      });
    
       }
    
      componentWillUnmount() {
      this.backHandler.remove();
      }
    
      render(){
    
      const { navigation } = this.props;
      const propsFromDrawer = navigation.getParam('propsFromDrawer') || '';
      const styleProps = navigation.getParam('styleprops') || '';
    
      //console.log(this.state);
      //console.log(navigation);
    
    return(<View>
      <NavigationEvents
    onWillFocus={payload => {this.setState({stuff: stuffFromProps})}}
    />
     <Header
    leftComponent={{ icon: 'menu', color: '#fff', onPress: () => 
     this.props.navigation.openDrawer() }}
     centerComponent={{ text: this.state.title, style: { color: '#fff' } }}
    rightComponent={{ icon: 'home', color: '#fff', onPress: () => 
     this.props.navigation.navigate('Home')}}
    
     />
    
    <View>
    <TouchableOpacity
    
    onPress={() =>
    
    this.props.navigation.navigate('Home', {
     propsImSending: 'blahblahblah',
    
    })} title="Home"
    >
    <Text>Home</Text>
    </TouchableOpacity>
    
    </View>);
    }
    
    
    }
    

    【讨论】:

    • 谢谢,我一定会尝试并适应我的应用程序。问题,如果我从 OtherPage 中调用导航,它是否会起作用?即页面中的链接并使用抽屉链接作为快捷方式。
    • 您可以通过几种不同的方式在 OtherPage 中进行导航。我将编辑我的答案以包含一个示例。
    猜你喜欢
    • 2021-02-21
    • 1970-01-01
    • 2021-09-15
    • 1970-01-01
    • 1970-01-01
    • 2019-03-03
    • 2020-05-22
    • 1970-01-01
    • 2019-10-11
    相关资源
    最近更新 更多