Маршрут в другом месте на перейдите к маршруту

#react-native #expo #react-navigation

Вопрос:

С помощью React-Navigation , чтобы перейти на определенную страницу, я бы сделал это:

 navigation.navigate('ProgramNav', {
  screen: "Programs"
});
navigation.navigate('ProgramNav', {
  screen: "Class List",
  params: {
    programId,
  }
});
navigation.navigate('ProgramNav', {
  screen: "Student Items",
  params: {
    programId,
    studentId,
  }
});
navigation.navigate('ProgramNav', {
  screen: "Student Item View",
  params: {
    programId,
    studentId,
    itemId
  }
});
 

До сих пор это не было большой проблемой, но я хочу сделать так, чтобы при переходе к "Programs" экрану он проверял, есть ли одна программа. Если это так, он автоматически переходит к "Class List" этой программе (в идеале удаляя себя из стека). НО я хочу, чтобы эта логика была в ProgramsScreen компоненте, а не там, где я это делаю navigation.navigate .

Я также хочу убедиться , что, когда я нажму Back , он также пропустит экран.

Я думаю, что это что-то вроде navigation.replace() того, когда есть что-то вроде useFocusEffect

Ответ №1:

Я заставил его работать с useFocusEffect и replace , НО он делает анимацию. Есть ли способ избежать этой анимации?

   useFocusEffect(useCallback(() => {
    if (programs.length === 1) {
      navigation.replace('Class List', {
        ...route.params,
        programId: programs[0].programID
      })
    }
  }, []))
 

Чтобы обойти проблему с анимацией, по крайней мере, когда я перемещаюсь с панели вкладок. Мне пришлось создать новый маршрут и сделать его новым начальным маршрутом, чтобы, если я перейду на корневую страницу, я направился бы к нужной странице, используя useFocuseEffect , как указано выше, и применялся к комбинациям, ведущим к экрану, который мне также нужен null , и headerShown: false чтобы предотвратить отображение любого содержимого.