Реактивный компонент обновления google-distance-matrix

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

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

Какие-нибудь мысли?

import React from 'react';  
import GoogleMap from 'google-distance-matrix';
class SimpleForm extends React.Component {
constructor(props) {
    super(props);
    this.state = { 
        address: '', 
        dest:'', 
        distanceText:'testing the distance text' 
    }
    this.handleFormSubmit = this.handleFormSubmit.bind(this);

    this.onChange = (address) => this.setState({ address });
    this.changeDest = (dest) => this.setState({dest});
}
handleFormSubmit = (event) => {
    event.preventDefault()        
    GoogleMap.matrix(this.state.address, this.state.dest, function (err, distances) {
        if (err) {
            return console.log(err);
        }
        if(!distances) {
            return console.log('no distances');
        }
        if (distances.status == 'OK') {
            if(distances.rows[0].elements[0])  {
                var distance = distances.rows[0].elements[0].duration['text'];
                this.setState({
                    foundDistance: true, 
                    distanceText: distance

                }); 
            }
        } 
    });

}

2 ответа

Решение

Привязка имеет большее снижение производительности, хотя и незначительное, чем простое кэширование this в переменной (что является довольно стандартным шаблоном).

Кроме того, используйте деструктуризацию на this.state,

handleFormSubmit = (event) => {
    const component = this
    const { address, dest } = this.state

    event.preventDefault()        

    GoogleMap.matrix(address, dest, function (err, distances) {
        if (err) {
            return console.log(err);
        }

        if(!distances) {
            return console.log('no distances');
        }

        if (distances.status == 'OK') {
            if(distances.rows[0].elements[0])  {
                var distance = distances.rows[0].elements[0].duration['text'];

                component.setState({
                    foundDistance: true, 
                    distanceText: distance
                }); 
            }
        } 
    });
}

"this" в GoogleMap.matrix не указывает на "this" компонента SimpleForm. Свяжите это:

...
GoogleMap.matrix(...)
...
).bind(this)
Другие вопросы по тегам