微信小程序-如何点击marker触发事件更改图标icon


前言

最近在做课设,要求实现一个找附近停车位的功能
在这里插入图片描述
绿色marker为空闲车位,红色marker为占用车位,现要求实现点击绿色marker,进行上锁操作,并让绿色锁改为红色锁。

如下图所示:
在这里插入图片描述
点击中间绿色锁,跳出弹窗,点击关锁,则锁变红色。
在这里插入图片描述
倘若点击红色锁的关锁,则会提示 “该车位已被占用,无法进行该操作”

1、触发事件更改marker图标icon

思路:点击对应marker触发handleMarkerTap()函数,该函数会根据所点击的marker的id,找到对应marker,并将绿色锁的图片地址改成红色锁的图片地址,从而达到更改icon的效果。

而为了辨别车位是否处于占用状态,我们还要在marker里添加title这一属性(取决于你自己,可以是title,可以是used等等)。若没被占用,则title=“空闲”,否则title=“占用”。
在这里插入图片描述

2、实现步骤

2.1、wxml页面

重点就是在map组件里加上 bindmarkertap=“handleMarkerTap” 这一行属性,这样我们在点击map组件里的marker的时候,就会触发 handleMarkerTap() 函数。

<map id="map" style="width:100vw; height:100vh"  
markers="{{markers}}" latitude="{{latitude}}" 
longitude="{{longitude}}" scale="{{scale}}" 
bindmarkertap="handleMarkerTap" >
</map>

<mp-halfScreenDialog show="{{showDialog}}">
    <view slot="title">南京市-胜太西路</view>
    <view slot="desc">{{currentMarker.id}} 号停车位</view>
    <view slot="desc">当前状态: <text style="color:{{currentMarker.title=='空闲'?'green':'red'}}">{{currentMarker.title}}</text></view>
    <view slot="desc">费用: <text style="color:red">2/15min </text></view>

    <view slot="footer" >
        <button type="primary" class="weui-btn" bindtap="Unlock" data-id="{{currentMarker.id}}">关锁</button>
        <button type="primary" class="weui-btn" bindtap="Navigate">导航</button>
    </view>
</mp-halfScreenDialog>

其中 mp-halfScreenDialog组件需要weui库才能使用,这里仅作思路演示,你可以根据实际情况将方法移植到你的代码里。

2.2、js页面代码

首先,handleMarkerTap函数触发的时候,前端会顺便把用户点击的marker信息传入到handleMarkerTap的形参e里面。然后我们就可以利用find函数,根据用户点击的markerId,找到this.data.markers数组里对应的marker,有了这个marker,我们才能对其进行图片修改操作。

handleMarkerTap(e){
    const marker = this.data.markers.find(item => item.id == e.markerId);
    marker && this.setData({
        currentMarker: marker,	//记录用户点击的marker
        showDialog: true		//点击marker后跳出关锁弹窗
    })
  },

同时,在我们点击marker后,代码会将showDialog由false改为true,这样前端页面的弹窗就会展示出来,然后我们才可以点击弹窗里的关锁按钮进行车位上锁。

这里 handleMarkerTap() 的主要功能是,根据用户点击的marker,找到对应marker车位信息,并将车位信息显示给用户看,还没有进行icon变换的操作。

在这里插入图片描述

只有当用户点击了关锁按钮,才会触发Unlock函数,将绿色车位icon改成红色车位icon。

在前端代码中,我们早在关锁按钮button里就将marker的id传入到了Unlock函数形参里:

<button bindtap="Unlock" data-id="{{currentMarker.id}}"
>关锁</button> //currentMarker.id即为上一步你所点击并储存起来的markerId

这里 data-id=“{{currentMarker.id}}” 作用是给Unlock(e)函数传参,即相当于 e.currentTarget.dataset.id={{currentMarker.id}} 。这样我们就可以从形参e里拿到拿到用户点击的marker的Id(即currentMarker.id)。
拿到Id后,就可以对对应id的marker的图像iconpath进行修改,即可达到更换icon的效果。

Unlock(e){

    const marker = this.data.markers.find(item => item.id == e.currentTarget.dataset.id);
	//这里和上面总共要find两次的原因是,第一次是find对应marker用为了拿到车位信息并展示给用户看
	//这一次的find是为了修改图片icon颜色,两次find的目的不同,看你自己需要了
    const Full = "../../images/lock1.png" //占用车位 红色锁图片
    const Empty = "../../images/lock2.png" //空闲车位 绿色锁图片
    
    if(marker.title == "空闲"){//空闲状态才可以关锁
        let temp_marker_title = "markers[" + (marker.id-1) + "].title"
        let temp_marker_iconPath = "markers[" +(marker.id-1) + "].iconPath"
        //marker.id-1是因为markers数组是从0开始,这里因人而异,只要能成功修改对应marker就行
        
        this.setData({
            [temp_marker_title] : "占用",
            [temp_marker_iconPath] : Full//改成红色锁的图片地址
        })
    }
    else{
        //如果是占用状态,则禁止开锁
        console.log("已经被占用,无法进行该操作")
    }
  },

总结

至此,我们已经实现了通过点击按钮,触发函数,函数里更改marker的icon地址,从而达到更改marker图标icon的效果。

其实仍然有许多可以改进之处,比如在Unlock(e)函数里直接通过this.data.currentMarker.id获取id即可,可以不用button传参,这里也只是给一些初学者了解一下button传参的方法。

  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bartender_Jill

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值