Javascript 用户提交后对谷歌地图渲染标记作出反应

Javascript 用户提交后对谷歌地图渲染标记作出反应,javascript,forms,reactjs,redux,react-google-maps,Javascript,Forms,Reactjs,Redux,React Google Maps,反应/重做这里的新手。我有一个表单输入,允许用户输入医生问题。它通过Redux操作从服务器返回医生列表,并在地图上显示医生列表和每个医生的位置标记() 当我单击提交时,将显示正确问题的医生列表,地图在那里,但没有标记。我可以让地图上的标记仅在提交表单后显示,然后单击列表中的医生以显示其详细信息 需要:输入医生问题,并在用户单击提交时在地图上呈现医生列表和标记。然后,选择一位医生查看他们的详细信息页面(这是另一个问题,路由到动态详细信息页面) 我认为,我需要使用生命周期方法,但不确定如何实现它。或

反应/重做这里的新手。我有一个表单输入,允许用户输入医生问题。它通过Redux操作从服务器返回医生列表,并在地图上显示医生列表和每个医生的位置标记()

当我单击提交时,将显示正确问题的医生列表,地图在那里,但没有标记。我可以让地图上的标记仅在提交表单后显示,然后单击列表中的医生以显示其详细信息

需要:输入医生问题,并在用户单击提交时在地图上呈现医生列表和标记。然后,选择一位医生查看他们的详细信息页面(这是另一个问题,路由到动态详细信息页面)

我认为,我需要使用生命周期方法,但不确定如何实现它。或者,有没有更好的方法来处理Redux

医生部分:

import React, { Component } from 'react';
import PropTypes from 'prop-types';

import DoctorSearchForm from '../../containers/doctors/DoctorSearchForm';
import DoctorList from './DoctorList';
import Map from '../maps/Map';


class Doctors extends Component {

  constructor(props) {
    super(props);
    this.state = {
      markers: [],
      isMarkerShown: false
    }
  }

  componentDidMount() {
    this.getMarkers();
  }

  getMarkers = () => {
    let practices = this.props.doctors.map(function(doctor, index) {
      return {
        title: doctor.profile.first_name + ' ' + doctor.profile.last_name,
        location: {
          lat: doctor.practices[0].visit_address.lat,
          lng: doctor.practices[0].visit_address.lon
        }
      }
    });
    this.setState({ markers: practices, isMarkerShown: true });
  }

  render() {
    const { doctors, match } = this.props;

    return (
      <div>
        <DoctorSearchForm getMarkers={this.getMarkers} />
        <div className="row">
          <div className="col-md-4">
            <DoctorList doctors={doctors} match={match} />
          </div>
          <div className="col-md-8">
            <Map
              isMarkerShown={this.state.isMarkerShown}
              center={{ lat: 45.6318,lng: -122.6716 }}
              zoom={12}
              markers={this.state.markers}
              />
          </div>
        </div>
      </div>
    );
  }
}

Doctors.propTypes = {
  doctors: PropTypes.array.isRequired,
  match: PropTypes.object.isRequired
}

export default Doctors;
import React from "react";
import { Route } from 'react-router-dom';

import DoctorItem from './DoctorItem';
import DoctorView from './DoctorView';


class DoctorList extends React.Component {
  render() {
    const { doctors, match } = this.props;
    const linkList = doctors.map((doctor, index) => {
      return (
        <DoctorItem doctor={doctor} match={match} key={index} />
      );
    });

    return (
      <div>
        <h3>DoctorList</h3>
        <ul>{linkList}</ul>
        <Route path={`${match.url}/:name`}
          render={ (props) => <DoctorView data= {this.props.doctors} {...props} />}
          />
        </div>
      );
  }
}

export default DoctorList;
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { Link, Route } from 'react-router-dom';

import DoctorView from './DoctorView';


const DoctorItem = (props) => {
  const { doctor, match } = props;
    return (
      <li>
        <Link to={{ pathname: `${match.url}/${doctor.profile.first_name}-${doctor.profile.last_name}` }}>
          {doctor.profile.first_name} {doctor.profile.last_name}
        </Link>
      </li>
    )
  }

  DoctorItem.propTypes = {
    doctor: PropTypes.object.isRequired,
  };

  export default DoctorItem;
import React from 'react';


const DoctorView = ({ data, match }) => {
  const doctor = data.find(p => `${p.profile.first_name}-${p.profile.last_name}` === match.params.name);


  let doctorData;

  if (doctor) {
    const mappedSpecialties = Object.entries(doctor.specialties).map(([index, specialty]) => {
      return <li key={index} id={index}>{specialty.description}</li>;
      });
      doctorData =
      <div>
        <h5><strong>{doctor.profile.first_name} {doctor.profile.last_name}</strong> - {doctor.profile.title}</h5>
        <img src={doctor.profile.image_url} alt={"Dr." + doctor.profile.first_name + " " + doctor.profile.last_name} />
        <ul>{mappedSpecialties}</ul>
        <p>{doctor.profile.bio}</p>
      </div>;
    }
    return (
      <div>
        {doctorData}
      </div>
    )
  }

  export default DoctorView;
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { withScriptjs, withGoogleMap, GoogleMap, Marker } from 'react-google-maps';
import { compose, withProps } from "recompose";


export default Map = compose(
  withProps({
    googleMapURL:
      "https://maps.googleapis.com/maps/api/js?key={MY_KEY}&v=3.exp&libraries=geometry,drawing,places",
    loadingElement: <div style={{ height: `100%` }} />,
    containerElement: <div style={{ height: `400px` }} />,
    mapElement: <div style={{ height: `100%` }} />
  }),
  withScriptjs,
  withGoogleMap
)(props => (
  <GoogleMap defaultZoom={9} defaultCenter={{ lat: 45.6318,lng: -122.6716 }}>
    {props.markers.map((doctor, index) => {
          const marker = {
            position: { lat: doctor.location.lat, lng: doctor.location.lng },
            title: doctor.title
          }
          return <Marker key={index} {...marker} />;
        })}
  </GoogleMap>
));
import React,{Component}来自'React';
从“道具类型”导入道具类型;
从“../../containers/doctors/DoctorSearchForm”导入DoctorSearchForm;
从“/DoctorList”导入DoctorList;
从“../maps/Map”导入地图;
类扩展组件{
建造师(道具){
超级(道具);
此.state={
标记:[],
伊斯马克镇:错
}
}
componentDidMount(){
这个.getMarkers();
}
getMarkers=()=>{
让实践=this.props.doctors.map(函数(医生,索引){
返回{
标题:doctor.profile.first_name+“”+doctor.profile.last_name,
地点:{
lat:doctor.practices[0]。访问_address.lat,
lng:doctor.practices[0]。访问_address.lon
}
}
});
this.setState({markers:practices,isMarkerShown:true});
}
render(){
const{doctors,match}=this.props;
返回(
);
}
}
医生.专业类型={
医生:需要PropTypes.array.isRequired,
匹配:PropTypes.object.isRequired
}
输出默认医生;
文档列表组件:

import React, { Component } from 'react';
import PropTypes from 'prop-types';

import DoctorSearchForm from '../../containers/doctors/DoctorSearchForm';
import DoctorList from './DoctorList';
import Map from '../maps/Map';


class Doctors extends Component {

  constructor(props) {
    super(props);
    this.state = {
      markers: [],
      isMarkerShown: false
    }
  }

  componentDidMount() {
    this.getMarkers();
  }

  getMarkers = () => {
    let practices = this.props.doctors.map(function(doctor, index) {
      return {
        title: doctor.profile.first_name + ' ' + doctor.profile.last_name,
        location: {
          lat: doctor.practices[0].visit_address.lat,
          lng: doctor.practices[0].visit_address.lon
        }
      }
    });
    this.setState({ markers: practices, isMarkerShown: true });
  }

  render() {
    const { doctors, match } = this.props;

    return (
      <div>
        <DoctorSearchForm getMarkers={this.getMarkers} />
        <div className="row">
          <div className="col-md-4">
            <DoctorList doctors={doctors} match={match} />
          </div>
          <div className="col-md-8">
            <Map
              isMarkerShown={this.state.isMarkerShown}
              center={{ lat: 45.6318,lng: -122.6716 }}
              zoom={12}
              markers={this.state.markers}
              />
          </div>
        </div>
      </div>
    );
  }
}

Doctors.propTypes = {
  doctors: PropTypes.array.isRequired,
  match: PropTypes.object.isRequired
}

export default Doctors;
import React from "react";
import { Route } from 'react-router-dom';

import DoctorItem from './DoctorItem';
import DoctorView from './DoctorView';


class DoctorList extends React.Component {
  render() {
    const { doctors, match } = this.props;
    const linkList = doctors.map((doctor, index) => {
      return (
        <DoctorItem doctor={doctor} match={match} key={index} />
      );
    });

    return (
      <div>
        <h3>DoctorList</h3>
        <ul>{linkList}</ul>
        <Route path={`${match.url}/:name`}
          render={ (props) => <DoctorView data= {this.props.doctors} {...props} />}
          />
        </div>
      );
  }
}

export default DoctorList;
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { Link, Route } from 'react-router-dom';

import DoctorView from './DoctorView';


const DoctorItem = (props) => {
  const { doctor, match } = props;
    return (
      <li>
        <Link to={{ pathname: `${match.url}/${doctor.profile.first_name}-${doctor.profile.last_name}` }}>
          {doctor.profile.first_name} {doctor.profile.last_name}
        </Link>
      </li>
    )
  }

  DoctorItem.propTypes = {
    doctor: PropTypes.object.isRequired,
  };

  export default DoctorItem;
import React from 'react';


const DoctorView = ({ data, match }) => {
  const doctor = data.find(p => `${p.profile.first_name}-${p.profile.last_name}` === match.params.name);


  let doctorData;

  if (doctor) {
    const mappedSpecialties = Object.entries(doctor.specialties).map(([index, specialty]) => {
      return <li key={index} id={index}>{specialty.description}</li>;
      });
      doctorData =
      <div>
        <h5><strong>{doctor.profile.first_name} {doctor.profile.last_name}</strong> - {doctor.profile.title}</h5>
        <img src={doctor.profile.image_url} alt={"Dr." + doctor.profile.first_name + " " + doctor.profile.last_name} />
        <ul>{mappedSpecialties}</ul>
        <p>{doctor.profile.bio}</p>
      </div>;
    }
    return (
      <div>
        {doctorData}
      </div>
    )
  }

  export default DoctorView;
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { withScriptjs, withGoogleMap, GoogleMap, Marker } from 'react-google-maps';
import { compose, withProps } from "recompose";


export default Map = compose(
  withProps({
    googleMapURL:
      "https://maps.googleapis.com/maps/api/js?key={MY_KEY}&v=3.exp&libraries=geometry,drawing,places",
    loadingElement: <div style={{ height: `100%` }} />,
    containerElement: <div style={{ height: `400px` }} />,
    mapElement: <div style={{ height: `100%` }} />
  }),
  withScriptjs,
  withGoogleMap
)(props => (
  <GoogleMap defaultZoom={9} defaultCenter={{ lat: 45.6318,lng: -122.6716 }}>
    {props.markers.map((doctor, index) => {
          const marker = {
            position: { lat: doctor.location.lat, lng: doctor.location.lng },
            title: doctor.title
          }
          return <Marker key={index} {...marker} />;
        })}
  </GoogleMap>
));
从“React”导入React;
从'react router dom'导入{Route};
从“/DoctorItem”导入DoctorItem;
从“/DoctorView”导入DoctorView;
类DoctorList扩展了React.Component{
render(){
const{doctors,match}=this.props;
const linkList=doctors.map((医生,索引)=>{
返回(
);
});
返回(
医生
    {linkList}
} /> ); } } 导出默认文档列表;
DoctorItem组件:

import React, { Component } from 'react';
import PropTypes from 'prop-types';

import DoctorSearchForm from '../../containers/doctors/DoctorSearchForm';
import DoctorList from './DoctorList';
import Map from '../maps/Map';


class Doctors extends Component {

  constructor(props) {
    super(props);
    this.state = {
      markers: [],
      isMarkerShown: false
    }
  }

  componentDidMount() {
    this.getMarkers();
  }

  getMarkers = () => {
    let practices = this.props.doctors.map(function(doctor, index) {
      return {
        title: doctor.profile.first_name + ' ' + doctor.profile.last_name,
        location: {
          lat: doctor.practices[0].visit_address.lat,
          lng: doctor.practices[0].visit_address.lon
        }
      }
    });
    this.setState({ markers: practices, isMarkerShown: true });
  }

  render() {
    const { doctors, match } = this.props;

    return (
      <div>
        <DoctorSearchForm getMarkers={this.getMarkers} />
        <div className="row">
          <div className="col-md-4">
            <DoctorList doctors={doctors} match={match} />
          </div>
          <div className="col-md-8">
            <Map
              isMarkerShown={this.state.isMarkerShown}
              center={{ lat: 45.6318,lng: -122.6716 }}
              zoom={12}
              markers={this.state.markers}
              />
          </div>
        </div>
      </div>
    );
  }
}

Doctors.propTypes = {
  doctors: PropTypes.array.isRequired,
  match: PropTypes.object.isRequired
}

export default Doctors;
import React from "react";
import { Route } from 'react-router-dom';

import DoctorItem from './DoctorItem';
import DoctorView from './DoctorView';


class DoctorList extends React.Component {
  render() {
    const { doctors, match } = this.props;
    const linkList = doctors.map((doctor, index) => {
      return (
        <DoctorItem doctor={doctor} match={match} key={index} />
      );
    });

    return (
      <div>
        <h3>DoctorList</h3>
        <ul>{linkList}</ul>
        <Route path={`${match.url}/:name`}
          render={ (props) => <DoctorView data= {this.props.doctors} {...props} />}
          />
        </div>
      );
  }
}

export default DoctorList;
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { Link, Route } from 'react-router-dom';

import DoctorView from './DoctorView';


const DoctorItem = (props) => {
  const { doctor, match } = props;
    return (
      <li>
        <Link to={{ pathname: `${match.url}/${doctor.profile.first_name}-${doctor.profile.last_name}` }}>
          {doctor.profile.first_name} {doctor.profile.last_name}
        </Link>
      </li>
    )
  }

  DoctorItem.propTypes = {
    doctor: PropTypes.object.isRequired,
  };

  export default DoctorItem;
import React from 'react';


const DoctorView = ({ data, match }) => {
  const doctor = data.find(p => `${p.profile.first_name}-${p.profile.last_name}` === match.params.name);


  let doctorData;

  if (doctor) {
    const mappedSpecialties = Object.entries(doctor.specialties).map(([index, specialty]) => {
      return <li key={index} id={index}>{specialty.description}</li>;
      });
      doctorData =
      <div>
        <h5><strong>{doctor.profile.first_name} {doctor.profile.last_name}</strong> - {doctor.profile.title}</h5>
        <img src={doctor.profile.image_url} alt={"Dr." + doctor.profile.first_name + " " + doctor.profile.last_name} />
        <ul>{mappedSpecialties}</ul>
        <p>{doctor.profile.bio}</p>
      </div>;
    }
    return (
      <div>
        {doctorData}
      </div>
    )
  }

  export default DoctorView;
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { withScriptjs, withGoogleMap, GoogleMap, Marker } from 'react-google-maps';
import { compose, withProps } from "recompose";


export default Map = compose(
  withProps({
    googleMapURL:
      "https://maps.googleapis.com/maps/api/js?key={MY_KEY}&v=3.exp&libraries=geometry,drawing,places",
    loadingElement: <div style={{ height: `100%` }} />,
    containerElement: <div style={{ height: `400px` }} />,
    mapElement: <div style={{ height: `100%` }} />
  }),
  withScriptjs,
  withGoogleMap
)(props => (
  <GoogleMap defaultZoom={9} defaultCenter={{ lat: 45.6318,lng: -122.6716 }}>
    {props.markers.map((doctor, index) => {
          const marker = {
            position: { lat: doctor.location.lat, lng: doctor.location.lng },
            title: doctor.title
          }
          return <Marker key={index} {...marker} />;
        })}
  </GoogleMap>
));
import React,{Component}来自'React';
从“道具类型”导入道具类型;
从“react router dom”导入{Link,Route};
从“/DoctorView”导入DoctorView;
常量DoctorItem=(道具)=>{
const{doctor,match}=道具;
返回(
  • {doctor.profile.first_name}{doctor.profile.last_name}
  • ) } DoctorItem.propTypes={ 医生:需要PropTypes.object.isRequired, }; 导出默认DoctorItem;
    DoctorView组件:

    import React, { Component } from 'react';
    import PropTypes from 'prop-types';
    
    import DoctorSearchForm from '../../containers/doctors/DoctorSearchForm';
    import DoctorList from './DoctorList';
    import Map from '../maps/Map';
    
    
    class Doctors extends Component {
    
      constructor(props) {
        super(props);
        this.state = {
          markers: [],
          isMarkerShown: false
        }
      }
    
      componentDidMount() {
        this.getMarkers();
      }
    
      getMarkers = () => {
        let practices = this.props.doctors.map(function(doctor, index) {
          return {
            title: doctor.profile.first_name + ' ' + doctor.profile.last_name,
            location: {
              lat: doctor.practices[0].visit_address.lat,
              lng: doctor.practices[0].visit_address.lon
            }
          }
        });
        this.setState({ markers: practices, isMarkerShown: true });
      }
    
      render() {
        const { doctors, match } = this.props;
    
        return (
          <div>
            <DoctorSearchForm getMarkers={this.getMarkers} />
            <div className="row">
              <div className="col-md-4">
                <DoctorList doctors={doctors} match={match} />
              </div>
              <div className="col-md-8">
                <Map
                  isMarkerShown={this.state.isMarkerShown}
                  center={{ lat: 45.6318,lng: -122.6716 }}
                  zoom={12}
                  markers={this.state.markers}
                  />
              </div>
            </div>
          </div>
        );
      }
    }
    
    Doctors.propTypes = {
      doctors: PropTypes.array.isRequired,
      match: PropTypes.object.isRequired
    }
    
    export default Doctors;
    
    import React from "react";
    import { Route } from 'react-router-dom';
    
    import DoctorItem from './DoctorItem';
    import DoctorView from './DoctorView';
    
    
    class DoctorList extends React.Component {
      render() {
        const { doctors, match } = this.props;
        const linkList = doctors.map((doctor, index) => {
          return (
            <DoctorItem doctor={doctor} match={match} key={index} />
          );
        });
    
        return (
          <div>
            <h3>DoctorList</h3>
            <ul>{linkList}</ul>
            <Route path={`${match.url}/:name`}
              render={ (props) => <DoctorView data= {this.props.doctors} {...props} />}
              />
            </div>
          );
      }
    }
    
    export default DoctorList;
    
    import React, { Component } from 'react';
    import PropTypes from 'prop-types';
    import { Link, Route } from 'react-router-dom';
    
    import DoctorView from './DoctorView';
    
    
    const DoctorItem = (props) => {
      const { doctor, match } = props;
        return (
          <li>
            <Link to={{ pathname: `${match.url}/${doctor.profile.first_name}-${doctor.profile.last_name}` }}>
              {doctor.profile.first_name} {doctor.profile.last_name}
            </Link>
          </li>
        )
      }
    
      DoctorItem.propTypes = {
        doctor: PropTypes.object.isRequired,
      };
    
      export default DoctorItem;
    
    import React from 'react';
    
    
    const DoctorView = ({ data, match }) => {
      const doctor = data.find(p => `${p.profile.first_name}-${p.profile.last_name}` === match.params.name);
    
    
      let doctorData;
    
      if (doctor) {
        const mappedSpecialties = Object.entries(doctor.specialties).map(([index, specialty]) => {
          return <li key={index} id={index}>{specialty.description}</li>;
          });
          doctorData =
          <div>
            <h5><strong>{doctor.profile.first_name} {doctor.profile.last_name}</strong> - {doctor.profile.title}</h5>
            <img src={doctor.profile.image_url} alt={"Dr." + doctor.profile.first_name + " " + doctor.profile.last_name} />
            <ul>{mappedSpecialties}</ul>
            <p>{doctor.profile.bio}</p>
          </div>;
        }
        return (
          <div>
            {doctorData}
          </div>
        )
      }
    
      export default DoctorView;
    
    import React, { Component } from 'react';
    import PropTypes from 'prop-types';
    import { withScriptjs, withGoogleMap, GoogleMap, Marker } from 'react-google-maps';
    import { compose, withProps } from "recompose";
    
    
    export default Map = compose(
      withProps({
        googleMapURL:
          "https://maps.googleapis.com/maps/api/js?key={MY_KEY}&v=3.exp&libraries=geometry,drawing,places",
        loadingElement: <div style={{ height: `100%` }} />,
        containerElement: <div style={{ height: `400px` }} />,
        mapElement: <div style={{ height: `100%` }} />
      }),
      withScriptjs,
      withGoogleMap
    )(props => (
      <GoogleMap defaultZoom={9} defaultCenter={{ lat: 45.6318,lng: -122.6716 }}>
        {props.markers.map((doctor, index) => {
              const marker = {
                position: { lat: doctor.location.lat, lng: doctor.location.lng },
                title: doctor.title
              }
              return <Marker key={index} {...marker} />;
            })}
      </GoogleMap>
    ));
    
    从“React”导入React;
    常量DoctorView=({data,match})=>{
    const doctor=data.find(p=>`${p.profile.first\u name}-${p.profile.last\u name}`==match.params.name);
    让博士数据;
    如果(医生){
    const mappedSpecialties=Object.entries(doctor.specialties).map([index,specialties])=>{
    返回
  • {speciality.description}
  • ; }); 博士数据= {doctor.profile.first_name}{doctor.profile.last_name}-{doctor.profile.title}
      {mappedSpecialistics}
    {doctor.profile.bio}

    ; } 返回( {doctorData} ) } 导出默认的DoctorView;
    地图组件:

    import React, { Component } from 'react';
    import PropTypes from 'prop-types';
    
    import DoctorSearchForm from '../../containers/doctors/DoctorSearchForm';
    import DoctorList from './DoctorList';
    import Map from '../maps/Map';
    
    
    class Doctors extends Component {
    
      constructor(props) {
        super(props);
        this.state = {
          markers: [],
          isMarkerShown: false
        }
      }
    
      componentDidMount() {
        this.getMarkers();
      }
    
      getMarkers = () => {
        let practices = this.props.doctors.map(function(doctor, index) {
          return {
            title: doctor.profile.first_name + ' ' + doctor.profile.last_name,
            location: {
              lat: doctor.practices[0].visit_address.lat,
              lng: doctor.practices[0].visit_address.lon
            }
          }
        });
        this.setState({ markers: practices, isMarkerShown: true });
      }
    
      render() {
        const { doctors, match } = this.props;
    
        return (
          <div>
            <DoctorSearchForm getMarkers={this.getMarkers} />
            <div className="row">
              <div className="col-md-4">
                <DoctorList doctors={doctors} match={match} />
              </div>
              <div className="col-md-8">
                <Map
                  isMarkerShown={this.state.isMarkerShown}
                  center={{ lat: 45.6318,lng: -122.6716 }}
                  zoom={12}
                  markers={this.state.markers}
                  />
              </div>
            </div>
          </div>
        );
      }
    }
    
    Doctors.propTypes = {
      doctors: PropTypes.array.isRequired,
      match: PropTypes.object.isRequired
    }
    
    export default Doctors;
    
    import React from "react";
    import { Route } from 'react-router-dom';
    
    import DoctorItem from './DoctorItem';
    import DoctorView from './DoctorView';
    
    
    class DoctorList extends React.Component {
      render() {
        const { doctors, match } = this.props;
        const linkList = doctors.map((doctor, index) => {
          return (
            <DoctorItem doctor={doctor} match={match} key={index} />
          );
        });
    
        return (
          <div>
            <h3>DoctorList</h3>
            <ul>{linkList}</ul>
            <Route path={`${match.url}/:name`}
              render={ (props) => <DoctorView data= {this.props.doctors} {...props} />}
              />
            </div>
          );
      }
    }
    
    export default DoctorList;
    
    import React, { Component } from 'react';
    import PropTypes from 'prop-types';
    import { Link, Route } from 'react-router-dom';
    
    import DoctorView from './DoctorView';
    
    
    const DoctorItem = (props) => {
      const { doctor, match } = props;
        return (
          <li>
            <Link to={{ pathname: `${match.url}/${doctor.profile.first_name}-${doctor.profile.last_name}` }}>
              {doctor.profile.first_name} {doctor.profile.last_name}
            </Link>
          </li>
        )
      }
    
      DoctorItem.propTypes = {
        doctor: PropTypes.object.isRequired,
      };
    
      export default DoctorItem;
    
    import React from 'react';
    
    
    const DoctorView = ({ data, match }) => {
      const doctor = data.find(p => `${p.profile.first_name}-${p.profile.last_name}` === match.params.name);
    
    
      let doctorData;
    
      if (doctor) {
        const mappedSpecialties = Object.entries(doctor.specialties).map(([index, specialty]) => {
          return <li key={index} id={index}>{specialty.description}</li>;
          });
          doctorData =
          <div>
            <h5><strong>{doctor.profile.first_name} {doctor.profile.last_name}</strong> - {doctor.profile.title}</h5>
            <img src={doctor.profile.image_url} alt={"Dr." + doctor.profile.first_name + " " + doctor.profile.last_name} />
            <ul>{mappedSpecialties}</ul>
            <p>{doctor.profile.bio}</p>
          </div>;
        }
        return (
          <div>
            {doctorData}
          </div>
        )
      }
    
      export default DoctorView;
    
    import React, { Component } from 'react';
    import PropTypes from 'prop-types';
    import { withScriptjs, withGoogleMap, GoogleMap, Marker } from 'react-google-maps';
    import { compose, withProps } from "recompose";
    
    
    export default Map = compose(
      withProps({
        googleMapURL:
          "https://maps.googleapis.com/maps/api/js?key={MY_KEY}&v=3.exp&libraries=geometry,drawing,places",
        loadingElement: <div style={{ height: `100%` }} />,
        containerElement: <div style={{ height: `400px` }} />,
        mapElement: <div style={{ height: `100%` }} />
      }),
      withScriptjs,
      withGoogleMap
    )(props => (
      <GoogleMap defaultZoom={9} defaultCenter={{ lat: 45.6318,lng: -122.6716 }}>
        {props.markers.map((doctor, index) => {
              const marker = {
                position: { lat: doctor.location.lat, lng: doctor.location.lng },
                title: doctor.title
              }
              return <Marker key={index} {...marker} />;
            })}
      </GoogleMap>
    ));
    
    import React,{Component}来自'React';
    从“道具类型”导入道具类型;
    从“react GoogleMaps”导入{withScriptjs,withGoogleMap,GoogleMap,Marker};
    从“重新组合”导入{compose,withProps};
    导出默认映射=合成(
    用道具({
    谷歌地图网址:
    "https://maps.googleapis.com/maps/api/js?key={MY_KEY}&v=3.exp&libraries=geometry,drawing,places“,
    加载元素:,
    集装箱运输:,
    mapElement:
    }),
    用ScriptJS,
    用谷歌地图
    )(道具=>(
    {props.markers.map((医生,索引)=>{
    常量标记={
    位置:{lat:doctor.location.lat,lng:doctor.location.lng},
    头衔:博士
    }
    返回;
    })}
    ));
    

    我花了好几天的时间试图寻找答案,但运气不好。任何帮助都将不胜感激

    就像在安装组件时计算标记一样,在收到新道具时需要重新计算标记:

    componentWillReceiveProps(nextProps) {
       this.getMarkers(nextProps);
    }
    
    这将要求您稍微更改
    getMarkers
    签名,以便它可以接受一个参数,并在
    map
    操作中使用该参数而不是
    This.props

    getMarkers = (props = this.props) => {
      let practices = props.doctors.map(function(doctor, index) {
        return {
          title: doctor.profile.first_name + ' ' + doctor.profile.last_name,
          location: {
            lat: doctor.practices[0].visit_address.lat,
            lng: doctor.practices[0].visit_address.lon
          }
        }
      });
      this.setState({ markers: practices, isMarkerShown: true });
    }
    

    假设您在
    DoctorSearchForm
    组件中调用
    getMarkers()
    ,您可以删除它,因为它会在接收新道具时自动更新标记——或者您可以完全绕过状态,根据传入的
    道具在
    render
    中动态计算它,成功了!因此,如果我理解正确,componentWillReceiveProps方法将侦听getMarkers中的更改(将当前道具与新道具进行比较),然后在getMarkers函数中替换道具,如果发现有差异?很高兴提供帮助!定义后,
    componentWillReceiveProps
    将在组件从父级接收新道具时自动调用。通过此设置,
    getMarkers
    将使用新的道具(以及更新的
    doctors
    列表)调用,该列表将在
    中调用
    setState