Реагируйте нативно, как открыть ящик по значку

#javascript #reactjs #react-native #navigation-drawer

Вопрос:

Я хочу открыть ящик с помощью значка, но я не знаю, как это работает, не могли бы вы мне помочь, пожалуйста? Я использовал реквизит, но не знаю, лучшая ли это идея или хорошая. Кроме того, если это возможно, как я могу не видеть имя «главная» в своем ящике, но иметь главную страницу, когда я загружаю свое приложение?(Этот вопрос является дополнительным)

 import React from 'react'
import MainPage from '../Components/MainPage'
import { createDrawerNavigator } from '@react-navigation/drawer';
import { NavigationContainer } from '@react-navigation/native';

const Drawer = createDrawerNavigator();

function _MainPage({ navigation }) {
    return (
        <MainPage onPress={() => navigation.openDrawer()}/>
    );
}

class Navigation extends React.Component {
    
    render() {
          return (
              <NavigationContainer>
                    <Drawer.Navigator initialRouteName="Home">
                        <Drawer.Screen name="Home" component={_MainPage}/>
                    </Drawer.Navigator>
              </NavigationContainer>
          );
      }
  }

export default Navigation
 
 import React from 'react'
import { View, Text, Image, StyleSheet, Touchable, TouchableOpacity } from 'react-native'
import Mode from './Mode'
import AppLoading from 'expo-app-loading';
import * as Font from 'expo-font'

let customFonts = {
    'bungee': require ('../assets/fonts/Bungee-Regular.ttf')
}

class MainPage extends React.Component {
    
    _goToDrawer() {
        return(
            <TouchableOpacity 
                style={styles.image}
                onPress={ () => this.props.onPress}>
                <Image source={require('../Images/menu.png')} />
            </TouchableOpacity>
        )
    }

    state = {
        fontsLoaded: false,
    };

    async _loadFontsAsync() {
        await Font.loadAsync(customFonts);
        this.setState({ fontsLoaded: true });
    }

    componentDidMount() {
        this._loadFontsAsync();
    }
    
    render() {
        if (this.state.fontsLoaded) {
            return (
                <View style={styles.main_container}>
                    {this._goToDrawer()}
                    <View style={styles.title_container}>
                        <Text style={styles.title}>Roadeo</Text>
                    </View>
                    <View style={styles.normal_container}>
                        <Mode style={styles.mode} title="NORMAL" />
                        <Mode style={styles.mode} title="AVANCÉ" />
                        <Mode style={styles.mode} title="HOT"    />
                        <Mode style={styles.mode} title="PREMIUM"/>
                    </View>
                </View>
            )
        } else {
            return <AppLoading/>
        }
    }
}

const styles = StyleSheet.create({
    main_container: {
        flex: 1,
        alignItems: 'center',
        backgroundColor: "#E1D6D6",
    },
    title_container: {
        position: 'absolute',
        top: 130
    },
    title: {
        fontSize: 45,
        color: "#FE5858",
        fontFamily: 'bungee'
    },
    normal_container: {
        position: 'absolute',
        top: 250,
        height: 450,
        flexDirection: 'column',
        justifyContent: 'space-between'
    },
    mode: {
        color: '#FFFFFF',
        fontSize: 25,
        fontFamily: 'bungee',
        backgroundColor: "#B2ADAD",
        height: 70,
        width: 300,
        borderRadius: 25,
        textAlign: 'center',
        textAlignVertical: 'center'
    },
    image: {
        position: 'absolute',
        top: 40,
        left: 20
    }
})

export default MainPage
 

Спасибо всем

Ответ №1:

Ваш подход кажется правильным, но здесь, в _goToDrawer функции, есть опечатка, которая приводит к navigation.openDrawer тому, что она не вызывается:

 onPress={ () => this.props.onPress}>
// should be:
onPress={ () => this.props.onPress() }>
// or:
onPress={this.props.onPress}>
 

Комментарии:

1. Большое спасибо, и мне пришлось добавить в свою функцию _goToDrawer({навигация})

2. Не похоже, что передача навигации функции _goToDrawer должна быть необходимой, потому onPress что используемая вами опора вообще не зависит от опоры навигации — вы уверены, что вам это нужно?

3. Я не уверен, но если я не поставлю функцию таким function _MainPage({navigation}) { return ( <MainPage onPress={() => navigation.openDrawer()}/> ); } образом, она не будет работать

4. Знаете ли вы, как я могу скрыть кнопку «домой» из ящика, но иметь домашнюю страницу (мою главную страницу) в качестве первой страницы, когда я открываю приложение?

5. Вам нужно будет использовать drawerContent реквизит в вашем <Drawer.Navigator /> — см. Документы здесь: reactnavigation.org/docs/drawer-navigator#drawercontent