将列表中的结果项链接到地图传单上的标记

如何解决将列表中的结果项链接到地图传单上的标记

我正在尝试将列表与传单地图链接起来。我想单击结果卡并查看地图上的标记。我现在使用 json 格式的假数据。我想要一个像airbnb一样的显示,列表加上在地图上显示列表。

这是地图文件

import React,{ useState } from "react";
import { Map,TileLayer,Marker,Popup } from "react-leaflet";
import "leaflet/dist/leaflet.css";
import { Icon } from "leaflet";
import FakeData from "../../../../../../data";
import {Div,PopContainer} from "./style"



const MarkerIcon = new Icon({
  iconUrl: "../public/markerIcon.png",iconSize: [50,50],});

function MapBox() {
  const [nurse,setNurse] = useState(null);
  const bull = <span>•</span>;

  return (
    <Div>
      <Map center={[50.6365654,3.0635282]} zoom={13} scrollWheelZoom={false}>
        <TileLayer
          attribution='&copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
          url="https://{s}.tile.openstreetmap.de/tiles/osmde/{z}/{x}/{y}.png"
        />
        {FakeData.map((data) => (
          <Marker
            key={data.id}
            icon={MarkerIcon}
            position={[data.coordonatelat,data.coordonatelng]}
            onmouSEOver={() => {
              setNurse(data);
            }}
          />
        ))}
        {nurse && (
          <Popup
            position={[nurse.coordonatelat,nurse.coordonatelng]}
            onClose={() => {
              setNurse(null);
            }}
          >
            <PopContainer>
              <h2>
                {bull}
                {nurse.first_name} {nurse.last_name}
                {bull}
              </h2>
              <h3>
                {nurse.job}
               </h3> 
               <p> {nurse.address}
                <br />
                {nurse.phone_number}
              </p>
            </PopContainer>
          </Popup>
        )}
      </Map>
    </Div>
  );
}

export default MapBox;

这是结果页:

import React from "react";
import FakeData from "../../../../../../data";
import MapBox from "../map/index";
import { Scrollbars } from "react-custom-scrollbars";
import {
  Container,H1,Card,CardContent,H2,Address,Phone,NavLink,CardActions,Job,MapContainer,BigContainer,CardContainer,Box,Li,} from "./resultPageStyle";

function Result(props) {
  const bull = <span>•</span>;

  return (
    <BigContainer>
      <Container>
        <H1>Résultats</H1>
        <Box>
          <Scrollbars style={{ width: 650,height: 580 }}>
            <CardContainer>
              {FakeData.slice(0,30).map((item) => (
                <Li key={item.id}>
                  <Card>
                    <CardContent>
                      <Job>{item.job}</Job>
                      <H2>
                        {bull}
                        {item.first_name} {item.last_name}
                        {bull}
                      </H2>
                      <Address>{item.address}</Address>
                      <Phone>{item.phone_number}</Phone>
                    </CardContent>
                    <CardActions>
                      <NavLink to={"/detailsPage"}>Plus d'infos</NavLink>
                    </CardActions>
                  </Card>
                </Li>
              ))}
            </CardContainer>
          </Scrollbars>

          <MapContainer>
            <MapBox />
          </MapContainer>
        </Box>
      </Container>
    </BigContainer>
  );
}

export default Result;

我尝试了不同的方法,但它不起作用。

解决方法

  1. Result comp 上创建一个状态变量以跟踪包含 lat lng 信息的卡片项目
  2. 将其作为道具传递给 Mapbox comp
  3. Mapbox 组件上创建一个局部变量来保存地图实例,并在您每次点击卡片时使用它来更改地图视图。

分隔线

function Result() {
      const bull = <span>•</span>;
      const [cardItem,setCardItem] = useState(null);
    
      const handleCardClick = (item) => {
        console.log(item);
        setCardItem(item);
      };
      ...
      <Card onClick={() => handleCardClick(item)}>
      ...
      <MapContainer>
        <MapBox cardItem={cardItem} />
      </MapContainer>
}

分隔线

 function MapBox({ cardItem }) {
      const [nurse,setNurse] = useState(null);
      const bull = <span>•</span>;
      const [map,setMap] = useState(null);
    
      useEffect(() => {
        if (!cardItem || !map) return;
        const { coordonatelat,coordonatelng } = cardItem;
        map.setView([coordonatelat,coordonatelng],13);
      },[cardItem,map]);
      ...
 }

我还修复了您的演示问题,并在您将鼠标悬停在每张卡片上时添加了一个光标。

您也可以使用 map.flyTo 代替 map.setView,它提供了一个很好的开箱即用动画。这取决于你。

Demo

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?