Я очень новичок в реакции, и мне нужно преобразовать широту в долготу, которую широта и долгота получают от огневой базы. Итак, проблема в том, что я могу записать адрес в консоль. Однако я не могу отобразить
Это мой учредитель
this.getAddressFromLatLong = this.getAddressFromLatLong.bind(this)
Это функция, которую я написал для преобразования
getAddressFromLatLong(lat, long)
{ Geocode.fromLatLng(lat, long).then(
response => {
const address = response.results[0].formatted_address;
console.info(address);
return address;
},
error => { console.error(error); }
)}
Здесь я показываю адрес
return (
<tr key = {atData.uid}>
<td>{atData.uid}</td>
<td>{atData.user}</td>
<td><TimeStamp time = {atData.dateTime} format='full' /></td>
<td>{this.getAddressFromLatLong(atData.latitude, atData.longtitude)}</td>
</tr>
)
Посоветуйте пожалуйста>. <
Редактировать:
Я понял, что кода, который я опубликовал, недостаточно, поэтому вот дополнительная информация о моих проблемах и конечном продукте, который я хотел
Итак, у меня есть эта страница, на которой отображаются все адреса и пользователи, когда пользователь выбирает блокировку из раскрывающегося списка, который получает от firebase.
Вот как я сделал свой выпадающий список
componentWillMount() {
const lockSelected = this.state.selectedLock
console.info(lockSelected)
// Calling the Lock List
axios
.get(process.env.REACT_APP_FIREBASE_DATABASE + '/' + doGetLocklist() + '.json?auth=' + process.env.REACT_APP_FIREBASE_DATABASE_SECRET)
.then((response) => {
// console.info("=== componentDidMount: axios - Lock List == = ")
this.setState({ locklistArray: response.data, loading: false })
})
.catch((err) => { })
}
renderDropdown() {
return _.map(this.state.locklistArray, lockData => {
return (
<option value = {lockData.uid}>{lockData.lockName}</option>
)
})
}
Вот как я отображаю раскрывающийся список
<FormControl componentClass = "select" placeholder = "select" onChange = {this.detectOnChangeEvent}>
<option value = "">- Please Select a lock -</option>
{this.renderDropdown()}
</FormControl>
После этого, когда пользователь выбрал блокировку, он запустит эту функцию detectOnChange, чтобы повторно отобразить таблицу с данными блокировки.
detectOnChangeEvent(event) {
this.setState({
selectedLock: event.target.value,
})
this.fetchSelectedATData(event.target.value)
this.forceUpdateHandler()
}
forceUpdateHandler() {
this.forceUpdate();
};
fetchSelectedATData(atlist) {
var lockSelected = atlist
axios
.get(process.env.REACT_APP_FIREBASE_DATABASE + '/' + doGetAuditTrailList() + '/' + lockSelected + '.json?auth=' + process.env.REACT_APP_FIREBASE_DATABASE_SECRET)
.then((response) => {
// console.info("=== componentDidMount: axios - User List == = ")
console.info(response.data)
this.setState({ atArray: response.data, loading: false })
})
.catch((err) => { })
this.renderATlistArray()
}
renderATlistArray() {
if (this.state.loading) {
return (<Loading />)
} else {
return _.map(this.state.atArray, atData => {
return (
<tr key = {atData.uid}>
<td>{atData.uid}</td>
<td>{atData.user}</td>
<td><TimeStamp time = {atData.dateTime} format='full' /></td>
<td>{this.getAddressFromLatLong(atData.latitude, atData.longtitude)}</td>
</tr>
)
})
}
}
Итак, теперь все работает нормально. Я знаю, что это тоже неправильный способ. Просто я не могу отобразить на своей таблице, когда я могу консольный журнал, и он возвращает правильный адрес.
Надеюсь, со всей этой добавленной информацией вам, ребята, будет лучше понять код!
Подумайте о добавлении минимального, полного и проверяемого примера ссылка на сайт ваших проблем, чтобы получить гораздо лучшие ответы.
Есть несколько проблем с опубликованным вами кодом
Как написано, getAddressFromLatLong()
не имеет полезного возвращаемого значения. Он возвращает undefined
, потому что он написан с использованием синтаксиса methodName() {}
без оператора возврата.
Вот как его переписать, чтобы он возвращал значение:
getAddressFromLatLong (lat, long) {
return Geocode.fromLatLng(lat, long).then(
response => {
const address = response.results[0].formatted_address;
console.info(address);
return address;
},
error => { console.error(error); }
)
}
getAddressFromLatLong()
вызывает асинхронная функция, который возвращает обещание. Асинхронная функция не создает значение немедленно - вместо этого мы предоставляем Перезвоните, который в конечном итоге вызывается (в какой-то неизвестный момент в будущем), когда асинхронная функция в конечном итоге создает значение.
Обратный вызов - это просто обычная функция, которая вызывается в какой-то момент в будущем с результатом асинхронной операции.
Обещать - это способ представления асинхронной операции и регистрации обратных вызовов в зависимости от того, завершилась ли операция успешно или нет.
Функция .then()
позволяет нам регистрировать эти обработчики успеха и неудачи. Первая функция, переданная в .then()
, вызывается, если операция завершается успешно. Вторая функция вызывается в случае сбоя операции.
Есть и другие способы зарегистрировать обработчики на обещаниях: полный API можно найти в Документы MDN.
Чтобы этот код заработал, нам нужно запустить асинхронную операцию, а затем отрендерить компонент после того, как данные станут доступны.
Есть много способов справиться с этим, но самый простой - сохранить результат операции в состоянии компонента.
Вот один из способов переписать этот компонент, чтобы он отображал асинхронно полученные данные, когда они доступны:
class YourComponent extends React.Component {
// This function gets called the first time the component is added to the DOM.
// If the latitude or longitude changes, you'll need to call this function from the componentDidUpdate() lifecycle method.
componentDidMount () {
// Obtain atData, probably from props
const atData = this.props.atData
getAddressFromLatLong(atData.latitude, atData.longitude)
// Update the component state with the address
// setState() will trigger a re-render
.then(
address => this.setState({ address: address }),
// If the Geocode() call fails, this function gets called.
// As written, this component will continue to show a loading message if Geocode() fails, which isn't great UX.
// You may want to add the error message to the state and display an error if the Geocode() fails.
error => console.info('Error retrieving address', error)
)
}
getAddressFromLatLong (lat, long) {
return Geocode.fromLatLng(lat, long).then(
response => {
const address = response.results[0].formatted_address;
return address;
}
)
}
render () {
// Get atData, probably from props
const atData = this.props.atData
// The address is stored in the component state.
// We'll show a loading message while we're waiting for the data.
const address = this.state.address
return (
<tr key = {atData.uid}>
<td>{atData.uid}</td>
<td>{atData.user}</td>
<td><TimeStamp time = {atData.dateTime} format='full' /></td>
<td>{ address || 'Loading address...' }</td>
</tr>
)
}
}
Вы можете улучшить этот пример кода несколькими способами.
Отображать сообщение об ошибке, если Geocode
выходит из строя
Визуализируйте загрузочный счетчик (вместо <tr>
), ожидая завершения Geocode
Geocode
из метода жизненного цикла componentDidUpdate
, чтобы мы обновляли адрес при изменении широты или долготы.Geocode
, если это не удается.
что такое atData? пожалуйста, предоставьте больше кода