Почему первое setState всегда влияет, а второе нет в react native?

#reactjs #react-native #jsx

#reactjs #react-native #jsx

Вопрос:

Я использую setState внутри componentDidMount() для установки состояния одних и тех же переменных, но я понимаю, что первое setState всегда влияет, и переменные принимают значения, определенные в первом setState. Я хочу, чтобы второе перезаписало первое и присвоило переменным значения второго setState. Даже если я изменю порядок, результат будет тот же. Почему это происходит? Чтобы быть точным, я говорю о переменных широты и долготы.

   componentDidMount() {

    fetch('myUrl')
      .then((response) => response.json())
      .then((responseJson) => {
        Geocoder.setApiKey('myUrl');
        Geocoder.getFromLocation(responseJson.comune_nascita).then(
          json => {
            var location = json.results[0].geometry.location;
            this.setState({
              Load:false,
              latitude:location.lat,
              longitude:location.lng
            })

          },

            error => {
              alert(error);
            }
          );
      })

      .catch((error) => {
        console.log(error)
      });


        navigator.geolocation.getCurrentPosition(position => {
        this.setState({
          latitude: position.coords.latitude,
          longitude: position.coords.longitude,
          error: null,
        });
      },
        error => this.setState({ error: error.message }),
        { enableHighAccurancy: false, timeout: 2000, maximumage: 2000 }
      );
   }
  

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

1. Пожалуйста, правильно отформатируйте свой код, это упростит и прояснит чтение и понимание для всех, кто пытается помочь.

Ответ №1:

Ваш вопрос, похоже, указывает на то, что «первое setState» — это setState, вызываемое в запросе выборки, а «второе setState» — это setState, вызываемое в методе getCurrentPosition навигатора. В соответствии с этим у меня есть несколько ответов и предложений.

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

По сути, второй вызов setState фактически вызывается первым, как только компонент монтируется, а ЗАТЕМ первый setState перезаписывает его после завершения выборки.

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