Может получить ответ, но не может отобразить реакцию

Я очень новичок в реакции, и мне нужно преобразовать широту в долготу, которую широта и долгота получают от огневой базы. Итак, проблема в том, что я могу записать адрес в консоль. Однако я не могу отобразить

Это мой учредитель

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>
            )
        })
    }
}

Итак, теперь все работает нормально. Я знаю, что это тоже неправильный способ. Просто я не могу отобразить на своей таблице, когда я могу консольный журнал, и он возвращает правильный адрес.

Вот скриншот ответа

Надеюсь, со всей этой добавленной информацией вам, ребята, будет лучше понять код!

что такое atData? пожалуйста, предоставьте больше кода

Vikram Saini 02.05.2018 12:14

Подумайте о добавлении минимального, полного и проверяемого примера ссылка на сайт ваших проблем, чтобы получить гораздо лучшие ответы.

Mohamed Embaby 02.05.2018 12:19
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
2
106
1

Ответы 1

Есть несколько проблем с опубликованным вами кодом

  1. Как написано, 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); } 
      )
    }
    
  2. 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, если это не удается.

Другие вопросы по теме