Обновление реакции-google-маркеров через поисковый фильтр

У меня есть список маркеров и поле ввода в контролируемом компоненте, который ищет определенный запрос в списке. Затем у меня есть компонент карты, который является родственным компоненту списка маркеров. Когда я ищу определенный текст во входных данных, список маркеров обновляется, но карта не обновляется с маркерами в списке маркеров.

import React, { Component } from 'react'
import escapeRegExp from 'escape-string-regexp'
import sortBy from 'sort-by'

class MarkerList extends Component {

  state = {
    query: ''
  }

  //input onChange handler
  updateQuery = (query) => {
    this.setState({ query: query.trim() })
  }

  render() {

    const { listIsOpen,
            toggleList,
            venues,
            handleListItemClick,
           } = this.props

    let venuesHasValue = false
    let markers = []
    //check whether venues array is valid
    if(venues !== undefined && venues.length > 0 && venues!== null) {
      venuesHasValue = true
    }
    //if venues array is not empty then loop through and return only 
   //data that is needed
   if (venuesHasValue) {
      let marker = {}
      venues.map(venue => {
      marker = {
        lat: venue.location.lat,
        lng: venue.location.lng,
        title: venue.name,
        venueId: venue.id,
        streetNumber: venue.location.formattedAddress[0],
        postCode: venue.location.formattedAddress[3],
    }
    markers.push(marker)
  })
}

let showingMarkers 
if (this.state.query) {
  const match = new RegExp(escapeRegExp(this.state.query), 'i')
  showingMarkers = markers.filter((marker) => match.test(marker.title))
} else {
  showingMarkers = markers
}

//sort list alphabetically
showingMarkers.sort(sortBy('title'))

return (
  <div>
    {listIsOpen ? (
      <div className='marker-list-open'>
        <label htmlFor='search'>Search</label>
        <input 
          id='search'
          type='text' 
          placeholder='search for burger or pizza'
          aria-required='true'
          className='list-filter'
          value={this.state.query}
          onChange={(e) => this.updateQuery(e.target.value)}
        />
        <div className='marker-list-container'>
          <ul className='venue-list'>
            {showingMarkers.map((marker, index) => {
              return (
                <li 
                  tabIndex='0'
                  key={index} 
                  placeholder={'search for burger or pizza'}
                  onClick={() => handleListItemClick(marker.venueId, marker)}
                >{marker.title}</li>
              )  
            })}
          </ul>
          <div className='list-toggle-close'>
            <img className='toggle-icon' src={require('../images/menu.svg')} alt='list closer' onClick={toggleList} />
          </div>
        </div>
      </div> 
    ) : (
      <div className='marker-list-closed'>
        <div className='list-toggle-open'>
          <img className='toggle-icon' src={require('../images/menu.svg')} alt='list opener' 
          onClick={toggleList} />
        </div>
      </div>
    )}
  </div> 
    )
  }
}

 export default MarkerList

Как я могу пройти отфильтрованные маркеры showingMarkers отобразить контейнерный компонент, чтобы он обновлялся соответственно?

1 ответ

Вы должны поддерживать маркеры в состоянии компонента карты. Затем вы можете передать обработчик как опору компонента Map в MarkerList. Однажды showingMarker получает обновление вы должны setState компонент Map с обновленным списком маркеров, например:

<MarkerList
markersHandler={this.onMarkerUpdate}
/>

onMarkerUpdate обновит состояние компонента карты:

onMarkerUpdate = (markers) => {
   this.setState({
   markers
 });
}

в вашем markerList, вы можете передать обновленный список маркеров в обработчик, это обновит состояние вашей карты:

this.props.markerHandler(showingaMarkers);

Наконец, в вашем компоненте карты вы можете визуализировать ваши маркеры из состояния:

render(){
 const { markers } = this.state;
 return (
  <GoogleMap
  //google map props
  >
  markers.map((marker,i)=>{
    <Marker
      key={i}
      // your marker props
    />
  });
  )
 }
</GoogleMap>

PS если вы можете показать вам карту компонента. Это было бы легче помочь вам. Вы можете поделиться на коды и коробки.

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