• 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)`
            ${props=>props.width||"100%"};
            height:${props=>props.height||"200px"};
            background-color:${props=>props.sideBgColor||"white"};
            overflow:hidden;
    `
    
    const Address = styled.div`
            100%;
            height:${props=>props.height||"200px" } !important;
            .BMap_stdMpCtrl{
                position:fixed !important;
                right:0;
                top:.5rem;
            }
    `
    
    const Pudian = styled.div`
            100%;
            height:50px;
    `
    const Addresstop = styled.div`
            position:fixed;
            z-index:999;
            height:.5rem;
            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来使用参考

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

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

  • 相关阅读:
    VS2005 无法启动调试 (如果你用的是IE8的)
    ClickOnce:部署,强制要求用户使用最新发布版本才可以执行软件的方法
    .Net 中的webBrowser控件加载网页时实现进度显示
    C# :DataGridView中使按下Enter键达到与按下Tab键一样的效果?
    Jquery:getJSON方法解决跨站ajax (json的解剖和运用) 附图片加载时的loading显示...
    GoogleMap : [Google Map]GMark事件运用(GEvent)
    Expression Designer系列工具汇总
    webBrowser:在extendedwebbrowser中实现IDocHostShowUI.ShowMessage 并判断或触发相应事件
    C#: 中文和UNICODE字符转换方法 及仿安居客地图实现。。。错误 GMap2未定义 解决办法 VB 中文转为UNICODE字符
    Jquery :Ajax 自动完成下拉列表。。。。。
  • 原文地址:https://www.cnblogs.com/suihang/p/10028056.html
Copyright © 2020-2023  润新知