В какой-то момент вам нужно будет использовать навигацию в вашем родном приложении для реагирования, и подход к этой задаче зависит от того, что вы хотите, но большинство приложений имеют навигацию по стеку, навигацию с вкладками и навигацию по ящику, и хотя это прямо вперед, чтобы настроить навигацию с вкладками, то же самое нельзя сказать о навигации в ящиках.

В этой статье мы узнаем, как сделать пользовательскую навигацию по ящику в React Native.

после того, как вы установите собственное приложение для реагирования, вам нужно установить ящик @react-navigation/drawer, следуйте документации, чтобы установить его.

вы можете использовать навигацию по ящику следующим образом:

import React, { useContext, useState, useEffect } from 'react';
import { View, Button, ActivityIndicator, Text } from 'react-native';
import { NavigationContainer, useNavigation, useRoute } from '@react-navigation/native';

import { createStackNavigator, TransitionPresets } from '@react-navigation/stack';
// Before rendering any navigation stack
import { enableScreens } from 'react-native-screens';


import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
import { createDrawerNavigator } from '@react-navigation/drawer';
import { Feather, FontAwesome, Ionicons } from '@expo/vector-icons';

import SideBar from '../components/SideBar';
const Stack = createStackNavigator();
const Tab = createBottomTabNavigator();
const Drawer = createDrawerNavigator();

function NavDrawer() {
  enableScreens();
  const navigation = useNavigation();
  // const [settings, setSettings] = useState([]);
  // const [initialScreen, setInitialScreen] = useState('Welcome');


  return (
    <Drawer.Navigator
      drawerContent={(props) => <SideBar {...props} />}
      initialRouteName="InitialSettings"
      screenOptions={{ headerShown: false, headerBackTitleVisible: false }}
    >
      <Drawer.Screen
        name="InitialSettings"
        component={OnboardingScreen}
        options={{
          title: 'Initial Setting',
        }}
      />

      <Drawer.Screen
        name="home"
        component={NavStack}
        options={{
          title: 'home',
        }}
      />

      <Drawer.Screen
        name="Customers"
        component={CustomerListScreen}
        options={{
          headerShown: true,
        }}
      />

      <Drawer.Screen
        name="Suppliers"
        component={SupplierListScreen}
        options={{
          headerShown: true,
        }}
      />
      <Drawer.Screen
        name="Insights"
        component={SummaryReportScreen}
        options={{
          headerShown: true,
        }}
      />
    </Drawer.Navigator>
  );
}
function NavTab() {
  enableScreens();
  const navigation = useNavigation();

  return (
    <Tab.Navigator initialRouteName="HomeScreen">
      <Tab.Screen
        name="HomeScreen"
        component={WelcomeScreen}
        options={{
          tabBarLabel: '',
          tabBarActiveTintColor: 'green',
          tabBarIcon: ({ color, size }) => <Ionicons name="md-home" size={size} color={color} />,
        }}
      />

      <Tab.Screen
        name="Items List"
        component={ItemListScreen}
        options={{
          title: 'Stock Items',
          tabBarLabel: '',
          tabBarActiveTintColor: 'green',
          tabBarIcon: ({ color, size }) => (
            <FontAwesome name="list-alt" size={size} color={color} />
          ),
        }}
      />

      <Tab.Screen
        name="Orders"
        component={OrderScreen}
        options={{
          title: 'Orders',
          tabBarLabel: '',
          tabBarActiveTintColor: 'green',
          tabBarIcon: ({ color, size }) => (
            <Ionicons
              name="md-add-circle"
              size={36}
              color={color}
              onPress={() =>
                navigation.navigate('Orders', {
                  order_type: 'sale',
                })
              }
            />
          ),
        }}
      />

      {/* <Tab.Screen name="Order Details" component={OrderDetailsSCreen} />  */}

      <Tab.Screen
        name="Clients"
        component={CustomerListScreen}
        options={{
          title: 'Customers',
          tabBarLabel: '',
          tabBarActiveTintColor: 'green',
          tabBarIcon: ({ color, size }) => <Ionicons name="person" size={24} color={color} />,
        }}
      />

      <Tab.Screen
        name="General Settings"
        component={SettingGeneralScreen}
        options={{
          title: 'General Settings',
          tabBarLabel: '',
          tabBarActiveTintColor: 'green',
          tabBarIcon: ({ color, size }) => <Feather name="settings" size={size} color={color} />,
        }}
      />
    </Tab.Navigator>
  );
}

export function NavStack() {
  enableScreens();
  const navigation = useNavigation();

  return (
    <Stack.Navigator initialRouteName="Welcome">
      <Stack.Screen name="InitialSettings" component={OnboardingScreen} />
      <Stack.Screen name="Welcome" component={NavTab} options={{ headerShown: false }} />
      {/** Orders*/}
    </Stack.Navigator>
  );
}

/**
 * App Root Navigation
 */
export default function RootNavigation() {

  return (
    <>
      {user ? (
        <>
          <NavigationContainer>
            <NavDrawer />
          </NavigationContainer>
        </>
      ) : (
        <NavigationContainer>
          <AuthStackNavigator />
        </NavigationContainer>
      )}
    </>
  );
}

сосредоточьтесь на компоненте навигатора ящиков, где я указал это:

      drawerContent={(props) => <SideBar {...props} />}

этот параметр не позволит нам передать реквизиты из другого компонента, который мы собираемся создать, вызовите SideBar.

import { AntDesign, FontAwesome5, Ionicons, MaterialCommunityIcons, MaterialIcons } from "@expo/vector-icons";
import { useEffect, useState } from "react";
import { View, Text, Image, StyleSheet, TouchableOpacity } from "react-native";
import { FlatList } from "react-native-gesture-handler";




export default function SideBar() {
    useEffect(() => {
        retrieveSetting();
    })
    const SupplierIcon = (<MaterialCommunityIcons name="truck-delivery-outline" size={24} color="#10b981" />)
    const ReportInsightsIcon = (<MaterialIcons name="insights" size={24} color="#10b981" />);
    const PurchasesIcon = (<AntDesign name="shoppingcart" size={24} color="#10b981" />);
    const ReceiptsIcon = (<FontAwesome5 name="receipt" size={24} color="#10b981" />);
    const ShareIcon = (<AntDesign name="sharealt" size={24} color="#10b981" />);
    const FeedBackIcon = (<MaterialIcons name="feedback" size={24} color="#10b981" />);

    const [selectedId, setSelectedId] = useState(null);
    const [businessName, setBusinessName] = useState(null);
    const [currency, setCurrency] = useState(null);

    const listArrayItem = [
        { icon: SupplierIcon, title: 'Suppliers' },
        { icon: ReportInsightsIcon, title: 'Report Insights' },
        { icon: PurchasesIcon, title: 'Purchases' },
        { icon: ReceiptsIcon, title: 'Receipts' }
    ]

    const bottomListItems = [
        { icon: ShareIcon, title: 'Tell a Friend' },
        { icon: FeedBackIcon, title: 'Help and FeedBack' },
    ]
    const Item = ({ title, icon, handlePress, backgroundColor, color }) => (
        <TouchableOpacity onPress={handlePress} style={[styles.item, { backgroundColor: backgroundColor }]}>
            <View>
                <Text>{icon}</Text>
            </View>
            <Text style={[styles.title, { color: color }]}>{title}</Text>
        </TouchableOpacity>
    );
    const renderItem = ({ item }) => {
        const backgroundColor = item.title === selectedId ? "#6e3b6e" : "white";
        const color = item.title === selectedId ? 'white' : 'black';
        return (
            <Item
                onPress={() => setSelectedId(item.title)}
                title={item.title}
                backgroundColor={backgroundColor}
                textColor={color}
                icon={item.icon} />
        );
    }

    return (

        <View style={{ flex: 1 }}>
            <View style={{ justifyContent: "center", flex: 0.3, paddingHorizontal: 20 }}>
                <Image source={require('./../../assets/snack-icon.png')} style={{ marginLeft: 50, width: 120, height: 70 }} />
                <Text style={{ fontWeight: "bold", fontSize: 20, color: "#47a67f" }}>{businessName}</Text>
                <Text style={{ fontSize: 12, marginTop: 5, color: "green", flexDirection: "row", justifyContent: "space-between" }}><Ionicons name="md-cash-outline" size={24} color="green" /> {currency}</Text>
                <Text style={{ fontSize: 12, marginTop: 5, color: "green" }}>{`6000 Products`}</Text>
            </View>
            <View style={{ flex: 0.55 }}>
                <FlatList
                    data={listArrayItem}
                    renderItem={renderItem}
                />
            </View>
            <View style={{ flex: 0.35 }}>
                <FlatList
                    data={bottomListItems}
                    renderItem={renderItem}
                />
            </View>
        </View >

    )

}
const styles = StyleSheet.create({
    item: {
        // padding: 20,
        backgroundColor: "",
        paddingVertical: 10,
        marginVertical: 8,
        marginHorizontal: 16,
        flexDirection: "row",
        justifyContent: "flex-start"
    },
    title: {
        fontSize: 18,
        marginLeft: 20,
        paddingLeft: 20
    },
});

Теперь, если вы перезагрузите свое приложение, это должно дать вам пользовательскую боковую панель, которая выглядит примерно так:

Я надеюсь, что это поможет вам в создании пользовательской боковой панели в вашем проекте.

вы можете добавить навигацию для перехода к другим страницам стека, если хотите. однако я не буду освещать это в этом уроке.

Спасибо за ваше время