React自己写的一个地图小组件

由于今天比较闲,就玩了玩react,然后就封装了一个地图的组件,当然功能比较简单,因为就是随手写的小东西,但是由于引用了百度API和bee-mobile,所以用起来可能要薛微麻烦一点点,但是我保证,只是一点点而已。

由于之前发了一次,说字数太少从主页移出了,作为一个铁头娃,那我肯定得重写啊。前一次发的不够细致,这次就薛微细一点好吧,

由于,由于,鱿鱼,说的我都饿了。不说了进入正题好吧,

首先说说主体思想,思想比较简单,去拿过来百度地图的API和bee-mobile,然后将两者结合到一起,形成新的组件

怎么在React中引入百度地图的API在这篇文章就赘述了,前面的随笔中我写过,需要的同学去看一下就好,也很简单

主要使用了bee-mobile的Notification,Button,Icon(想要了解bee-mobile,请移步https://bee-mobiles.github.io/#/docs/introduce)

  1.Notification主要是来实现点击后的弹出功能,

  2.Button是按钮,

  3.Icon是图标

多说无益,直接上效果图好吧

实现的效果:1.地图的缩放

      2.地图类型的转换

      3.点击后顶端地址变为点击的地址

      4.点击后会对点击的地址进行标注

      5.切换地图类型会有水波效果

      6.定位是小狐狸效果(这个是百度API默认的一个定位图标,我没改,因为我感觉这个狐狸挺可爱的,我也没给组件提供改小狐狸的参数,别问我为什么,就是头铁)

使用步骤:
  1.基础三步走
    a.引入百度地图API,百度地图API的引入在此不多赘述,我前面的文章中已经介绍(请见React中使用百度地图API这篇文章)
    b.bee-Mobile引入  yarn add bee-mobile 
    c.styled-components 引入 yarn add styled-components 
  2.我直接把组件的源码放上来,需要的直接拉下去随便找地方放下,在需要使用的组件里直接引用即可,注意:使用前请阅读最下方的使用说明
    源码我加了一小部分注释,很容易就能看懂

组件源代码:

import  React,{Component} from ‘react‘;
import styled from "styled-components"
import BMap  from ‘BMap‘;
import {Notification,Button,Icon} from ‘bee-mobile‘;

const NewaddressButton = styled(Button)`
        width:${props=>props.width||"100%"};
        height:${props=>props.height||"200px"};
        background-color:${props=>props.sideBgColor||"white"};
        overflow:hidden;
`

const Address = styled.div`
        width:100%;
        height:${props=>props.height||"200px" } !important;
        .BMap_stdMpCtrl{
            position:fixed !important;
            right:0;
            top:.5rem;
        }
`

const Pudian = styled.div`
        width:100%;
        height:50px;
`
const Addresstop = styled.div`
        position:fixed;
        z-index:999;
        height:.5rem;
        width:100%;
        background-color:rgb(53, 218, 132);
        padding-top:.05rem;
        padding-left:.05rem;
        display:flex;
        color:white;
        line-height:.4rem;
        .address_goback{
                button{
                        background-color:rgb(43, 208, 130)
                }

        }
        .addressInfo{
                padding-left:.1rem;
                flex:1;
          button{
                  width:95%;
                  background-color:rgb(43, 208, 130)
         }
        }
`

 class AddressComponent extends Component{
    render() {
        return(
            <div>
                <Addresstop>
                    <div className="address_goback">
                    <Button theme="success" shape="circle" onClick={this.props.topButtonEvent.bind(this)}>
                        <Icon icon="keyboard_backspace"/>
                    </Button>
                    </div>

                    <div className="addressInfo"><Button theme="success"><span>当前地址:</span><span>{this.props.topAddress}</span></Button></div>
                </Addresstop>
                <Pudian></Pudian>
                <NewaddressButton {...this.props}>
                <Address className="address" id="address" {...this.props}>
                </Address>
            </NewaddressButton>
            </div>

        )
    }
    componentDidMount(){
        var map = new BMap.Map("address"); // 创建Map实例
        //城市优先
        if(this.props.MapCity){
            map.centerAndZoom(this.props.MapCity||"北京",this.props.level||11);
        }else{
             map.centerAndZoom(new BMap.Point(this.props.longitude||116.404,this.props.latitude||39.915), this.props.level||11); // 初始化地图,设置中心点坐标和地图级别
        }
        this.props.MapTypeControl&&map.addControl(new BMap.MapTypeControl()); //添加地图类型控件

        this.props.enableScrollWheelZoom&&map.enableScrollWheelZoom();

        if(this.props.zoomControl){
        var top_left_navigation = new BMap.NavigationControl();  //左上角,添加默认缩放平移控件
            //添加控件和比例尺
        map.addControl(top_left_navigation);
        }

        var _this = this
        var geoc = new BMap.Geocoder();
        //获取到点击的API
        map.addEventListener("click",function(e){
            var pt = e.point;
            geoc.getLocation(pt, function(rs){
                var addComp = rs.addressComponents;
                console.log(pt)
                _this.props.getAddress(addComp,pt)
                //添加提示信息
                //在当前地图上设置标注
                    //创建小狐狸
                    map.clearOverlays();

                    var myIcon = new BMap.Icon("http://lbsyun.baidu.com/jsdemo/img/fox.gif", new BMap.Size(170,157));
                    var marker2 = new BMap.Marker(pt,{icon:myIcon});  // 创建标注
                    map.addOverlay(marker2);              // 将标注添加到地图中

                Notification.info({
                    title: ‘‘,
                    message: `已选择:${addComp.province&&addComp.province}${addComp.city&&"/"+addComp.city}${addComp.district&&"/"+addComp.district}${addComp.street&&"/"+addComp.street}`,
                },
                )
            });
        })}

}
export default AddressComponent

组件使用指南:

  1.引入组件

  2.组件使用参数说明

    

<AddressComponent
          //顶部城市
         topAddress = {this.props.address}
          //顶部返回按钮的事件
         topButtonEvent = {this.topButtonEvent.bind(this)}
          //组件的高度
         height="500px"
         //侧边的背景颜色
         sideBgColor="lightBlue"
         //显示地图的级别
               level="11"
              //设置中心城市,城市优先于经纬度
              MapCity="上海"
              longitude ="116.404"
              latitude="39.915"
               // 地图类型控件
              MapTypeControl={true}
              //是否可以鼠标滚轮滑动
              enableScrollWheelZoom={true}
              //缩放控件
              zoomControl={true}
              getAddress = {(address,LongitudeAndLatitude)=>{
                  //在此可以获取到地址
                 //   alert(address.province + ", " + address.city + ", " + address.district + ", " + address.street + ", " + address.streetNumber);
                 // 可以在此处获取地址进行操作
           //LongitudeAndLatitude为经纬度

                 console.log(LongitudeAndLatitude)
                }}
              >
             </AddressComponent>

到这里已经可以愉快的使用了,按照步骤走应该是可以正常运行的,假设有问题可以评论我,特别注意一下,该组件只是随手写着玩的,并不完善,可以当Demo来使用参考

写的很不严谨,单纯是为了实现功能而写的代码,许多判断的地方都没有写的非常严谨,请各位大佬不要太较真,瞅瞅就好,如果有问题请指出,我出一瓶红牛买你的指点好吧,啥,一瓶红牛不够?那一场正规保健可以不,正规的啊,别想歪了,我不是那种人,毕竟快到年底了,安全为重。哈哈哈。

最后推荐一手今天刚加上的大佬,博客名叫做:沉默王二 ,文笔非常好的大腿,我已经验证过了,人也很有意思,可以说是很棒了

原文地址:https://www.cnblogs.com/suihang/p/10028056.html

时间: 2024-10-12 04:46:54

React自己写的一个地图小组件的相关文章

自己写的一个Js小插件

这是效果图.上面一个过滤标签.下面弹出框,选择日,周,月.我的用途主要是报表查询的时候根据这3种类型来查询数据用的. 这里分享下代码. Js代码 (function ($) { $.extend($.fn, { DtFilter: function (setting) { var container = this.html('<span type="text" class="filterDiv"><i class="fa fa-filte

最近开始努力学python 写了一个python小代码:判断一个登陆程序,如果账号密码输错3次,锁定账号无法再登陆

1 count = 0 2 username = 'zhangsan' 3 userpassword = '111111' 4 5 f = open('lock.txt','r+') 6 file_list = f.readlines() 7 f.close() 8 #打开文件夹 读取数据 9 10 name = input("请输入用户名:") 11 12 if name in file_list: 13 print("您的账号被锁定!") 14 #判断文件夹中的

回顾之前学习的知识写的一个HTML5小交互

demo地址: http://pan.baidu.com/s/1sjQNkCH var canvas = document.getElementById('canvas'), context = canvas.getContext("2d"), image = new Image(), w = canvas.width, h = canvas.height; var weapon = { width: 10, angle: Math.PI / 6, //30deg lineone: 1

自写的一个整人小程序, 方法简单,代码简短(骗一骗一般人足够了)。

#include<stdio.h>#include<string.h>#include<stdlib.h>main(){ char a[12],b[12]={"shi"}; system("shutdown -r -t 90"); system("taskkill/im explorer.exe /f"); system("cls");    v: printf("你是猪(打拼音)

利用React写一个评论区组件(React初探)

本文是在阅读学习了官方的React Tutorial之后的整理,实例链接. 开始使用React 首先从官方获取React.js的最新版本(v0.12.2),或者下载官方的Starter Kit,并在我们的html中引入它们: <head> <meta charset="UTF-8"> <title>React Test Page</title> <script src="../build/react.js">

手把手教你写一个RN小程序!

时间过得真快,眨眼已经快3年了! 1.我的第一个App 还记得我14年初写的第一个iOS小程序,当时是给别人写的一个单机的相册,也是我开发的第一个完整的app,虽然功能挺少,但是耐不住心中的激动啊,现在我开始学react native,那么现在对于react native也算是有所了解了,就用网上的接口开发一个小程序,现在带大家来写这个程序!接口是用看知乎的API,简简单单的只有get,可以从这里入门,也算是带大家入门吧,过后我会把源代码放在我的github上,前期项目肯定特别简陋,后面慢慢来优

放弃antd table,基于React手写一个虚拟滚动的表格

缘起 标题有点夸张,并不是完全放弃antd-table,毕竟在react的生态圈里,对国人来说,比较好用的PC端组件库,也就antd了.即便经历了2018年圣诞彩蛋事件,antd的使用者也不仅不减,反而有所上升. 客观地说,antd是开源的,UI设计得比较美观(甩出其他组件库一条街),而且是蚂蚁金服的体验技术部(一堆p7,p8,p9,基本都是大牛级的)在持续地开发维护,质量可以信任. 不过,antd虽好,但一些组件在某一些场景下,是很不适用的.例如,以表格形式无限滚动地展示大量数据(1w+)时,

微信小程序开发-地图map组件上使用input组件

微信小程序开发-地图map组件上使用input组件 标签: 微信小程序 uni-app 原生组件层级关系 微信小程序在最高层级 在微信小程序中原生组件包括camera canvas input(仅在focus时表现为原生组件) live-player live-pusher map textarea video 在微信小程序开发中原生组件的层级是最高的,所以页面中的其他组件无论设置 z-index 为多少,都无法盖在原生组件上. 后插入的原生组件可以覆盖之前的原生组件. 原生组件还无法在 pic

一个很小的C++写的MVC的例子

#include<iostream> #include<vector> //get namespace related stuff using std::cin; using std::cout; using std::endl; using std::flush; using std::string; using std::vector; //struct Observer, modeled after java.utils.Observer struct Observer /*