react好租客项目Day05-根据定位展示对应城市&地图找房模块封装&loading美化

本文详细介绍了在React项目中实现地图找房功能的过程,包括根据定位展示当前城市、地图上创建文本和房源覆盖物、业务逻辑分析及封装、添加Loading效果等。通过封装方法提高代码复用性,利用Toast的loading优化页面加载体验。
摘要由CSDN通过智能技术生成

地图找房模块

目标

  • 完成根据定位展示当前城市
  • 能够完成在地图上渲染出文本覆盖物
  • 能够对文本覆盖物进行内容和样式修改
  • 能够说出地图找房功能的业务逻辑
  • 理解地图找房的封装流程,知道每一个方法的作用是什么?
  • 能够参照老师代码敲出地图找房的封装代码
  • 能够使用Toast的loading效果来对页面进行优化

根据定位展示当前城市(★★★)

  • 获取当前定位城市
  • 使用 地址解析器 解析当前城市坐标
  • 调用 centerAndZoom() 方法在地图中展示当前城市,并设置缩放级别为11
  • 在地图中添加比例尺和平移缩放控件

实现房源信息子地图中展示(★★★)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W4dXpdpn-1575111505661)(images/房源覆盖物.png)]

这些房源信息其实就是用文本覆盖物来实现的,所以我们先查看百度开发文档,先创建文本覆盖物

创建文本覆盖物

  • 创建Label 示例对象
  • 掉用setStyle() 方法设置样式
  • 在map对象上调用 addOverlay() 方法,讲文本覆盖物添加到地图中

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yhohHXEg-1575111505662)(images/创建文本覆盖物.png)]

绘制房源覆盖物

  • 由于默认提供的本文覆盖物与我们效果不符合,所以我们需要进行重新的绘制

  • 调用Label的 setContent方法,传入html结构,修改HTML的内容样式;注意:调用了setContent 那么里面文本的内容就失效了

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zPLrUOjx-1575111505663)(images/绘制覆盖物.png)]

  • 调用setStyle方法修改覆盖物样式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nxnvNVFc-1575111505666)(images/绘制覆盖物-02.png)]

  • 给覆盖物添加点击事件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ErNU0fZo-1575111505669)(images/绘制覆盖物-03.png)]

  • 覆盖的内容结构
<div class="${styles.bubble}">
  <p class="${styles.name}">${name}</p>
  <p>${num}套</p>
</div>
  • 覆盖物的样式
const labelStyle = {
    cursor: 'pointer',
    border: '0px solid rgb(255,0,0)',
    padding: '0px',
    whiteSpace: 'nowrap',
    fontSize: '12px',
    color: 'rbg(255,255,255)',
    textAlign: 'center'
}

地图找房-业务逻辑分析(★★★)

  • 获取房源数据,渲染覆盖物
  • 点击覆盖物:
    • 放大地图
    • 获取数据,渲染下一级覆盖物
  • 区、镇覆盖物的点击事件中,清除现有的覆盖物,获取下一级数据,创建新的覆盖物
  • 小区:不清楚覆盖物,移动地图,展示该小区下的房源信息

获取所有区的信息

  • 发送请求获取房源数据
  • 遍历数据,创建覆盖物,给每一个覆盖物添加唯一标识
  • 给覆盖物添加点击事件
  • 在单击事件中,获取到当前单击项的唯一标识
  • 放大地图(级别为13),调用clearOverlays()方法清除当前覆盖物
// 请求接口,获取房源数据
let res = await axios.get(`http://localhost:8080/area/map?id=${value}`)
// 遍历房源信息,创建对应的覆盖物
res.data.body.map(item => {
    // 给每一条数据添加覆盖物
    // 得到返回的经纬度信息
    let { coord: { longitude, latitude }, label: areaName, count, value } = item
    // 创建覆盖物
    let label = new window.BMap.Label('', {
        position: new window.BMap.Point(longitude, latitude),
        offset: new window.BMap.Size(-35, -35)
    })
    // 设置覆盖物内容
    label.setContent(`<div class="${styles.bubble}">
    <p class="${styles.name}">${areaName}</p>
    <p>${count}套</p>
  </div>`)
    // 设置样式
    label.setStyle(labelStyle)
    // 添加点击事件
    label.addEventListener('click', function () {
        // 当点击了覆盖物,要以当前点击的覆盖物为中心来放大地图
        map.centerAndZoom(this.K.position, 13);
        // 解决清除覆盖物的时候,百度地图js报错问题
        setTimeout(function () {
            map.clearOverlays()
        }, 0)
    })
    // 给label添加唯一标识
    label.id = value
    // 添加到地图上
    map.addOverlay(label)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值