#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 перезаписывает его после завершения выборки.
Чтобы исправить это, я бы предложил перестроить вашу методологию того, как будет работать эта функция. Асинхронный вызов всегда будет заканчиваться вторым, и поэтому вы можете захотеть изменить значения по умолчанию.