React Native сброс навигации не работает

#react-native #react-navigation #react-native-navigation #react-navigation-v5 #react-navigation-bottom-tab

#react-native #react-навигация #react-native-navigation #react-navigation-v5 #реакция-навигация-нижняя вкладка

Вопрос:

В моем приложении есть два стека

  • Навигатор вкладок (основной стек)
  • Навигатор стека (стек приложений)

Элементы стекового навигатора

  • Начальный экран
  • Подробный экран
  • Экран входа в систему

Элементы навигатора вкладок

  • Начальный экран (Stack Navigor)
  • Экономические новости
  • Политические новости
  • Социальные новости

Я хочу перейти к подробному экрану из экономических новостей, политических новостей и социальных новостей, потому что я отображаю все новости на этих экранах, и когда пользователь нажимает на любой новый, он должен перейти к подробному экрану с новым, который щелкнул. Я использовал navigate(‘Home’, {screen: ‘Detail’, params: {id: new.ID }}); Но он всегда отображает предыдущую новую деталь.

Также я пытался

 navigation.dispatch(
  CommonActions.reset({
    routes: [
      {
        name: 'Home',
      },
      {
        name: 'Detail',
        params: {
          id: new.ID,
        },
      },
    ],
  }),
);  

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

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

1. можете ли вы опубликовать больше кода, потому что navigate(‘Home’, {screen: ‘Detail’, params: {id: new. ID}}); должен сбросить ваш параметр

2. конечно, я напишу ответ, которым поделюсь там

Ответ №1:

Это моя домашняя навигация по стеку

 <Stack.Navigator
  initialRouteName="Home"
  headerMode="none"
  transitionConfig={transitionConfig}
>
  <Stack.Screen
    name="Detail"
    component={DetailScreen}
    initialParams={props.route.params}
  />
  <Stack.Screen name="Home" component={HomeScreen} />
  <Stack.Screen name="Profile" component={ProfileScreen} />
  <Stack.Screen name="Login" component={LoginPage} />
  <Stack.Screen name="Settings" component={SettingsScreen} />
</Stack.Navigator>
  

и это моя основная вкладка nav

      <Tab.Navigator
        tabBar={props => <Footer {...props} />}
        transitionConfig={transitionConfig}
      >
        <Tab.Screen name="Home" component={StackNavigator} />
        <Tab.Screen name="EconomyNews" component={ContentScreen} />
        <Tab.Screen name="PoliticNews" component={ContentScreen} />
        <Tab.Screen name="SocialNews" component={ContentScreen} />
      </Tab.Navigator>
  

Я хочу перейти к подробному экрану с экранов EconomyNews, PoliticNews или SocialNews с новыми значениями, такими как id, но он всегда отображает предыдущий экран

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

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

2. я не могу поделиться всем кодом, потому что, когда я делюсь, модератор удаляет мой ответ, но я могу поделиться немного.

3. const Detail = React.memo(props => { const [content, setContent] = useState(null); const dispatch = useDispatch(); const contentProps = useSelector(state => state.contentReducer); const { loading, error, detail } = contentProps; useEffect(() => {function fetchData() {dispatch(getDetail({endpoint: URL }));}fetchData();}, []);return (<Container><Image source={{uri:'URL'}}/><View style={styles.content_container}><Title>{content.title}</Title><OverView style={styles.content}>{content.overview}</OverView></Container>);});

4. Экран содержимого> const Content = React.memo(props => {const { item, navigation } = props; return ( <View> <TouchableWithoutFeedback /n onPress={() => { navigation.navigate('Home', {screen: 'Detail', params: {id: item.ID}});}}> <Container> <Image source={{uri: 'URL'}}/> <Title>{item.original_title} ({item.title})</Title> <OverView numberOfLines={5}>{item.overview}</OverView> </Container></View>); });

Ответ №2:

Трудно следовать вашему коду, но я не вижу, чтобы вы подробно использовали компонент id, поэтому невозможно, чтобы у вас были другие данные. В вашем случае memo не нужен …

 const Detail = props => { 
const [content, setContent] = useState(null); 
const dispatch = useDispatch(); 
const contentProps = useSelector(state => state.contentReducer); 
const { loading, error, detail } = contentProps; 
const URL = `URL/${props.navigation?.route?.params?.id}`
useEffect(() => {
function fetchData() {
dispatch(getDetail({endpoint: URL}));}
fetchData();
}, [dispatch, props.navigation?.route?.params?.id]);
return (<Container><Image source={{uri:'URL'}}/><View style={styles.content_container}><Title>{content.title}</Title><OverView style={styles.content}>{content.overview}</OverView></Container>);};
  

Ответ №3:

Я использую идентификатор в URL, который используется в функции выборки. Я использую его для получения данных из сервиса, поэтому я не написал точный URL. Основная цель — открыть подробный экран с помощью сброса. Сегодня я также попробовал другой способ, и он не сработал;

 import {useNavigation} from '@react-navigation/native';
const Content = (props => {
   const _nav = useNavigation();
   const goToRoute = () => {
      _nav.reset({
         index: 1,
         routes: [
         {
           name: 'Home',
         },
         {
           name: 'Detail',
           params: {
             id: item.ID,
           },
         },
      ],
   });
 };
});
  

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

1. не могли бы вы перекусить, потому что вам не нужно использовать сброс. Для сброса параметров что-то не так, и я этого не вижу. Вот готовый шаблон с react navigation v5 snack.expo.io/@anthowm/41a9b3

2. snack.expo.io/ye !rF6rv6 это мой код закуски, похожий

3. На этой выставке все рабочие параметры постоянно обновляются.

4. Я исправил проблему 🙂 спасибо за любую помощь. Я только что понял, что сохраняю свои параметры, но не реагирую на состояние, я немного изменил код о своих параметрах. Пока я получаю параметры, я назначил состояние реакции и начал использовать эти переменные состояния реакции в своей функции useEffect, и это работает. Все дело в инструкции react и виртуальном dom. Я не понял эту проблему. Теперь это работает: D : D