@sasha_jarvi

Как обновить стейт одного компонента при переходе из другого компонента?

Имеется компонент RequestScreen, из которого по тапу на TouchableOpacity осуществляется переход в другой компонент - TasksMap и передаются координаты точки, на которой центрируется карта:

<TouchableOpacity
      style={styles.locationContainer}
      onPress={() =>
        navigation.navigate('TasksMap', {coords: route.params.latlng})
      }>
      <Mark />
      <Text style={styles.location}>{route.params.location}</Text>
</TouchableOpacity>


У TasksMap имеется стейт taskLatlng. Как изменить данный стейт на основе route.params.coords при переходе из RequestScreen на TasksMap?

const TasksMapScreen: React.FunctionComponent<Props> = () => {
  const route = useRoute();

  const tasks = [
    {
      id: 5602481,
      category: 'lights',
      text: 'задача 1',
      location: 'адрес 1',
      latlng: {
        latitude: 54.1925489,
        longitude: 37.6705917,
      },
      distance: 200,
      date: '08.06.2019',
      price: 300,
      isResolved: false,
      reworkings: 0,
    },
    {
      id: 5602482,
      category: 'garbage',
      text: 'задача 2',
      location: 'адрес 2',
      latlng: {
        latitude: 54.1541381,
        longitude: 37.5843054,
      },
      distance: 200,
      date: '08.06.2019',
      price: 0,
      deadline: '18.06.2019',
      isResolved: false,
      reworkings: 0,
    },
  ];

  const problems = [
    {key: 'all', text: 'Все проблемы'},
    {key: 'free', text: 'Новые'},
    {key: 'paid', text: 'На исполнении'},
  ];

  const initialMarkerLatlng = tasks[0].latlng;

  const [zoom, setZoom] = useState(14);
  const [taskLatlng, selectTask] = useState(initialMarkerLatlng);

  const region = {
    ...initialMarkerLatlng,
    latitudeDelta: 0.0922,
    longitudeDelta: 0.0421,
  };

  const mapView = useRef(null);

  useEffect(() => {
    if (mapView.current) {
      mapView.current?.animateCamera(
        {
          center: route.params?.coords,
          zoom: 15,
        },
        1000,
      );
    }
  }, []);

  return (
    <View style={styles.container}>
      <MapView
        ref={mapView}
        style={styles.map}
        minZoomLevel={zoom}
        maxZoomLevel={zoom}
        showsCompass={false}
        initialRegion={region}>
        {tasks.map((task) => (
          <Marker
            coordinate={task.latlng}
            title=""
            key={task.id}
            onPress={() => selectTask(task.latlng)}>
            <TaskMarker
              category={task.category}
              price={task.price}
              isResolved={task.isResolved}
              reworkings={task.reworkings}
            />
          </Marker>
        ))}
      </MapView>

      <View style={styles.buttonBlock}>
        <Button style={styles.buttonItem} rounded>
          <RouteIcon width={13} height={15} />
        </Button>
        <Button
          style={[styles.buttonItem, styles.semiRoundedTop]}
          rounded
          onPress={() => setZoom(zoom + 1)}>
          <Text style={styles.buttonText}>+</Text>
        </Button>
        <Button
          style={[styles.buttonItem, styles.semiRoundedBottom]}
          rounded
          onPress={() => setZoom(zoom - 1)}>
          <Text style={styles.buttonText}>−</Text>
        </Button>
        <Button style={styles.buttonItem} rounded>
          <GeopositionIcon width={11} height={11} />
        </Button>
      </View>
    </View>
  );
};
  • Вопрос задан
  • 142 просмотра
Решения вопроса 1
RomReed
@RomReed
JavaScript, Flutter, ReactNative, Redux, Firebase
navigation.navigate('TasksMap', {coords: route.params.latlng})

в этом моменте я бы взять componentWillRecieveProps и отловил момент когда прилетают новые пропсы и заменил стейт. Тоже самое можно попробовать сделать с помощью хука.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы