Google-maps-react infoWindow onChange проблемы

Как добавить кнопку в информационное окно с помощью Google-Maps-React?

Здравствуйте, я пишу приложение React, у меня возникла проблема с изменением состояния внутри InfoWindow из google-maps-react, вышеприведенное решение помогло мне преодолеть это препятствие.

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

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

Вот мой компонент InfoWindowEx:

<InfoWindowEx
      key = {currentInfoWindow.id}
      id = {currentInfoWindow.id}
      marker = {this.state.activeMarker}
      visible = {this.state.showingInfoWindow}
      selectedPlace = {this.state.selectedPlace}
      onInfoWindowClose = {this.onInfoWindowClose}
    >

      <div >
        {infoWindowEditBoxes}
        {infoWindowContent}

      </div>
    </InfoWindowEx>

поля редактирования отображаются в условных операторах, вот они:

if (this.state.editButton) {
      infoWindowEditBoxes = (

        <div>
          <input key = {this.props.marker}  id = "editedName" type = "text" placeholder = "New Bathroom Name"  onChange = {this.handleTextBoxState}></input>
          <input key = {this.props.marker}  id = "editedLocationName" type = "text" placeholder = "New Bathroom Location" onChange = {this.handleTextBoxState}></input>
          <button onClick = {() => this.handleSubmitChangesButtonState()}>Submit Changes</button>
        </div>
      );
    }
    else {
      infoWindowEditBoxes = null
    }

и вот моя функция изменения состояния:

 handleTextBoxState = (evt) => {
    const stateToChange = {}
    stateToChange[evt.target.id] = evt.target.value
    this.setState(stateToChange)
    console.info(stateToChange)
  }

Заранее спасибо!

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

Ответы 1

Я считаю, что в вашем примере состояние компонента обновляется правильно, очевидно, это поведение связано с самим компонентом InfoWindowEx. Как это реализовано, setState() вызывает компонент повторный рендерингInfoWindow, что приводит к потере фокуса ввода.

Вы можете рассмотреть следующий обновленная версия компонента, который предотвращает повторную визуализацию информационного окна, если оно уже было открыто:

export default class InfoWindowEx extends Component {
  constructor(props) {
    super(props);
    this.state = {
      isOpen: false
    };
    this.infoWindowRef = React.createRef();
    this.containerElement = document.createElement(`div`);
  }

  componentDidUpdate(prevProps) {
    if (this.props.children !== prevProps.children) {
      ReactDOM.render(
        React.Children.only(this.props.children),
        this.containerElement
      );
      this.infoWindowRef.current.infowindow.setContent(this.containerElement);
      this.setState({
        isOpen: true
      });
    }
  }

  shouldComponentUpdate(nextProps, nextState) {
    if (this.state.isOpen) {
      return this.props.marker.position.toString() !== nextProps.marker.position.toString();
    }
    return true;
  }

  infoWindowClose(){
    this.setState({
      isOpen: false
    });
  }


  render() {
    return <InfoWindow onClose = {this.infoWindowClose.bind(this)} ref = {this.infoWindowRef} {...this.props} />;
  }
}

Демо

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