【问题标题】:How to use getDetails() in react Google Map如何在 React Google Map 中使用 getDetails()
【发布时间】:2018-05-26 09:20:13
【问题描述】:

我现在在 React 中使用 Google Map,现在我在使用来自 Google PlacesService 的函数 getDetails() 时遇到问题。这是我的代码的一部分,我想使用此函数在InfoWindow 中显示有关所选地点的信息:

<Marker
  {...marker}
  key={i}
  position={marker.location}
  title={marker.title}
  place_id={marker.place_id}
  id={i}
  icon={'http://www.serwisstron.pl/icons/' + marker.type + '.png'}
  onClick={() => {
      props.toggleLocationsActive(i);
  }}
  animation={google.maps.Animation.DROP}
  >
  {i === props.activeKey && (
    service.getDetails({placeId: marker.place_id}, (marker, status) => {
      if(status === google.maps.places.PlacesServiceStatus.OK) {
      // here will be code will which put the data on InfoWindow
      }
   })
)}
   <InfoWindow onCloseClick={props.onToggleOpen}>
     <div id="details"><strong>{ marker.title } </strong><span><br/>Address:</span><span id="name"></span></div>
   </InfoWindow>)}
</Marker>

现在这段代码得到这个错误:

未捕获的类型错误:无法读取未定义的属性“innerHTML” 在 Object._.Tv (util.js:20) 在 P4.attributionText_changed (places_impl.js:32) 在 Lc (js?libraries=geometry,drawing,places&key=AIzaSyBqtLvddq3jzZ_Lnu9M8266EMVBfXtlUT4:51) 在 P4._.M.bindTo (js?libraries=geometry,drawing,places&key=AIzaSyBqtLvddq3jzZ_Lnu9M8266EMVBfXtlUT4:126) 在 Object.Q4.f (places_impl.js:32) 在小时。 (js?libraries=geometry,drawing,places&key=AIzaSyBqtLvddq3jzZ_Lnu9M8266EMVBfXtlUT4:179) 在 js?libraries=geometry,drawing,places&key=AIzaSyBqtLvddq3jzZ_Lnu9M8266EMVBfXtlUT4:136 在对象。 (js?libraries=geometry,drawing,places&key=AIzaSyBqtLvddq3jzZ_Lnu9M8266EMVBfXtlUT4:60) 在 js?libraries=geometry,drawing,places&key=AIzaSyBqtLvddq3jzZ_Lnu9M8266EMVBfXtlUT4:136 在对象。 (js?libraries=geometry,drawing,places&key=AIzaSyBqtLvddq3jzZ_Lnu9M8266EMVBfXtlUT4:60) 在 js?libraries=geometry,drawing,places&key=AIzaSyBqtLvddq3jzZ_Lnu9M8266EMVBfXtlUT4:136 在 js?libraries=geometry,drawing,places&key=AIzaSyBqtLvddq3jzZ_Lnu9M8266EMVBfXtlUT4:60 在 js?libraries=geometry,drawing,places&key=AIzaSyBqtLvddq3jzZ_Lnu9M8266EMVBfXtlUT4:136 在 Sd (js?libraries=geometry,drawing,places&key=AIzaSyBqtLvddq3jzZ_Lnu9M8266EMVBfXtlUT4:63) 在 Rd.wa (js?libraries=geometry,drawing,places&key=AIzaSyBqtLvddq3jzZ_Lnu9M8266EMVBfXtlUT4:136) 在 util.js:1

也许你们中的一些人知道,如何在反应中正确使用此功能... 我在谷歌上找了很久,但一无所获……

这里是 Github 上这个项目的链接: https://github.com/hajczek/Neighborhood---Warsaw-Cultural-Map

感谢任何提示:)

【问题讨论】:

    标签: reactjs google-maps google-api react-google-maps


    【解决方案1】:

    所有 DOM 修改都应该通过 React 完成,因为您正在使用它。所以不要设置innerHTML(这可能会导致漏洞),你应该设置组件的状态,然后根据状态渲染标记。 您可以提取一个呈现 InfoWindow 的组件:

    class Popup extends Component {
      state = {};
      componentDidMount() {
        const marker = this.props.marker;
    
        getInfo(marker.title).then(data => {
            console.log('---',data);
          const link = data[3][0];
          const art = data[2][0];
          if (link) {
            this.setState({
              art,
              link,
              text: "See article in Wikipedia »"
            });
          } else {
            this.setState({
              info: "Unfortunately, no info was returned for this data."
            });
          }
        });
    
        geocodeByPlaceId(marker.place_id)
          .then(results => {
            const address = results[0].formatted_address;
            this.setState({ address });
          })
          .catch(error => console.error(error));
      }
      render() {
        const props = this.props;
        return (
          <InfoWindow onCloseClick={props.onToggleOpen}>
            <div>
              <span id="title">{props.marker.title}</span>
              <br />
              <br />
              <span id="address-title">Address:</span>
              <br />
              <span>{this.state.address}</span>
              <br />
              <br />
              <span>
                <em>{this.state.art}</em>
              </span>
              <br />
              <br />
              <a target="blank" href={this.state.link}>
                {this.state.text}
              </a>
              <span>{this.state.info}</span>
            </div>
          </InfoWindow>
        );
      }
    }
    

    并在标记内渲染它:

    {i === props.activeKey && (
                    <Popup marker={marker} onCloseClick={props.onToggleOpen} />
                  )}
    

    注意getInfo 应该用数据解析promise:

    export const getInfo = search => {
      return fetch(
        "https://pl.wikipedia.org/w/api.php?&origin=*&action=opensearch&search=" +
          search +
          "&limit=1",
        {
          headers: { Accept: "application/json" }
        }
      )
        .then(response => response.json())
        .catch(e => requestError(e));
    

    上面的例子可能行不通,它是为了演示该方法。

    【讨论】:

    • 你好叶夫根尼·季莫申科!感谢您提供详细的答案。我尝试以这种方式编写我的代码。非常感谢:)
    猜你喜欢
    • 2019-05-17
    • 2018-09-06
    • 2017-08-04
    • 2022-06-22
    • 2022-07-05
    • 2018-04-24
    • 1970-01-01
    • 2018-04-25
    • 2020-02-22
    相关资源
    最近更新 更多