1、先获取用户是否授权地理定位,如果没有让其跳转到设置页面手动开启(获取到的位置是经纬度,需要借助其他地图SDK的地址逆解析获取省市区的名字)

getSetting() {
    wx.getSetting({
      success: (res) => {
        if (res.authSetting['scope.userLocation'] == false) {//如果没有授权地理位置
         console.log('没有开启地理定位')
         wx.showModal({
           title: '温馨提示',
           content: '您未开启地理定位权限',
           success: () => {
             wx.openSetting({
                 success: (res) => {
                     console.log(res)
                   res.authSetting = {//打开授权位置页面,让用户自己开启
                     "scope.userLocation": true
                   }
                 }
               })
           }
         })
        } else {
          //用户开启授权后可直接获取地理位置
          wx.authorize({
            scope: 'scope.userLocation',
            success: () => {
              //获取位置后相关操作
              this.getLocation();
            }
          })
        }
      },
      fail:(error) => {
         console.log(error)
      }
    })
  },
 //获取地理位置
  getLocation() {
    wx.getLocation({
      type: 'gcj02', // 默认为 wgs84 返回 gps 坐标,gcj02 返回可用于 wx.openLocation 的坐标
      success: (res) => {
        console.log(res)
        this.setData({
          location: res 
        })
      }
    })
  },

2、城市选择列表

  实现功能:

  • 点击右侧字母区域跳转到对应字母位置 (使用scroll-view的scroll-into-view属性,给他的子元素设置id,scroll-into-view的值即为需要跳转到子元素的id)
  • <scroll-view scroll-y="true" style="height: 100vh" scroll-into-view="{{scrollId}}" scroll-with-animation="true" enable-back-to-top="true">
        <view wx:for="{{ list }}" wx:key="key">
          <view id="{{ item.key }}" data-id="{{ item.key }}" bindtap="selectId">{{ item.value }}</view>
        </view>
    
    selectId(e) {
      this.setData({
        scrollId: e.currentTarget.dataset.id
    })  
    }
  • 滚动反显右侧字母区,滚动到B,右侧亮起 (获取每一个子元素的top顶部距离,利用scroll-view的bindscroll属性监听滚动事件,判断其scrollTop和每一个元素比较,相近的即可,如果使用点击事件进行第一步,则不滚动监听)
  • <scroll-view bindscroll="{{ isSelected ? 'scroll' : ''}}"></scroll-view>
    scroll(e) {
        console.log(e.detail.scrollTop)
    }
    
    // 获取顶部距离和子元素的顶部距离(一定要写in,否则获取到的是null)
    let query = wx.createSelectorQuery().in(this);
    // 获取单个元素
    query.select('.city-letter').boundingClientRect(r => {
         console.log(r.top, r.height)
        }).exec();
    // 获取多个元素,rect是一个数组
      query.selectAll('.city-item').boundingClientRect(rect => {
        console.log(rect) 
        
     }).exec();
  • 在字母区滑动选择 (使用view的bindtouchstart、catchtouchmove、bindtouchend滑动事件,记录在首字母区域滑动的距离,获取首字母区域的高度和顶部距离,获得数组下标 = (滑动距离-顶部距离) / 区域高度 * 字母数组长度)
  • 因滑动事件和点击事件都放在同一个view上会有冲突,执行顺序是touchstart - touchend - tap,所以点击事件时判断pageY和touchstart的PageY,如果相等就是执行的点击事件,不需要执行滑动事件

 注意:scrolllId、滚动对应的变量、滑动时的变量是分设了三个变量,需要互相清空,注意限制条件

 posted on 2023-01-04 14:27  Yseraaa  阅读(1537)  评论(0编辑  收藏  举报