Щелкните значок заголовка справа на экране стека, чтобы перейти к другому экрану в react native

#javascript #reactjs #react-native

#javascript #reactjs #react-native

Вопрос:

Я хочу перейти к экрану корзины, когда я нажимаю на значок корзины справа от заголовка экрана стека. Пожалуйста, подскажите мне, как выполнить это требование. Ниже приведен мой код.

App.js

 import Feather from 'react-native-vector-icons/Feather';
import { NavigationContainer } from '@react-navigation/native';
import { createStackNavigator } from '@react-navigation/stack';
import Home from './screens/Home';
import CartScreen from './screens/Cart';


const { width: WIDTH } = Dimensions.get('window')


const Stack = createStackNavigator();

function CartIcon() {
  return (
    <Feather name={'shopping-cart'}/>
  );
}

function App() {
  return (
    <NavigationContainer>
      <Stack.Navigator initialRouteName="Home">

        <Stack.Screen name="Home"
          component={Home}
          options={{
           headerRight: props => <CartIcon  {...props} />,
            ),
            title: 'Shop',
            headerStyle: {
              backgroundColor: 'black',
            },
          }} />


        <Stack.Screen
          name="Cart Screen"
          component={CartScreen}
          options={{
            title: 'Cart Items',
            headerStyle: {
              backgroundColor: 'black',
            },
          }} />
      </Stack.Navigator>
    </NavigationContainer>
  );
}
export default App;
  

Пожалуйста, помогите мне.. Заранее большое спасибо! 🙂

Ответ №1:

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

 <Stack.Screen
  name="Home"
  component={Home}
  options={({route, navigation}) => ({
    headerRight: (props) => <CartIcon {...props} navigation={navigation} />,
    title: 'Shop',
    headerStyle: {
      backgroundColor: 'black',
    },
  })}
/>;

function CartIcon({navigation}) {
  return (
    <Feather
      name={'shopping-cart'}
      onPress={() => navigation.navigate('Cart Screen')}
    />
  );
}

  

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

1. Этот ответ более лаконичен … Мне это нравится больше

Ответ №2:

Сначала импортируйте useNavigation , @react-navigation/native как показано ниже :

 import { useNavigation } from '@react-navigation/native';
  

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

 function CartIcon() {
  const navigation = useNavigation();

  const navigateToCart = () => {
    navigation.navigate("CartScreen");
  }

  return (
    <Feather name={'shopping-cart'} onPress={navigateToCart}/>
  );
}
  

И если у вашего Feather компонента нет onPress метода, вы можете обернуть свой Feather компонент, TouchableOpacity как показано ниже :

 import { TouchableOpacity } from 'react-native';

function CartIcon() {
  const navigation = useNavigation();

  const navigateToCart = () => {
    navigation.navigate("CartScreen");
  }

  return (
    <TouchableOpacity onPress={navigateToCart}>
      <Feather name={'shopping-cart'}/>
    </TouchableOpacity>
  );
}
  

Более того, примените свой соответствующий стиль к TouchableOpacity.

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

 <Stack.Screen
  // name="Cart Screen" don't use white space character in screen name
  name="CartScreen"
  component={CartScreen}
  options={{
    title: 'Cart Items',
    headerStyle: {
      backgroundColor: 'black',
    },
  }}
/>;
  

Ответ №3:

Я поддержал ответ @Venkat Sai, поскольку он был более кратким. Но после использования его в моей реализации я понял, что его можно сократить еще больше. Вот оно, меньше строк кода

    <Stack.Screen
      name="Home"
      component={Home}
      options={({ route, navigation }) => ({
        headerRight: (props) => (
          <Feather
            {...props}
            name={"shopping-cart"}
            onPress={() => navigation.navigate("CartScreen", route)}
          />
        ),
        title: "Shop",
        headerStyle: {
          backgroundColor: "black",
        },
      })}
    />