iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >微信小程序自定义地址组件
  • 394
分享到

微信小程序自定义地址组件

2024-04-02 19:04:59 394人浏览 安东尼
摘要

本文实例为大家分享了微信小程序自定义地址组件的具体代码,供大家参考,具体内容如下 项目需求 需要调用后台传过来的地址,存储地址时存的是地址的id,所以市面上的地址组件均不符合我的需求

本文实例为大家分享了微信小程序自定义地址组件的具体代码,供大家参考,具体内容如下

项目需求

需要调用后台传过来的地址,存储地址时存的是地址的id,所以市面上的地址组件均不符合我的需求,只能自定义一个。

技术选取

picker-view和picker-view-column

核心代码

region.wxml

<!--地址选择器-->
<view wx:if="{{show}}" class="region-picker" catchtap="hidePicker">
  <view class="picker-handle" catchtap>
    <view class="picker-cancel" catchtap="hidePicker">取消</view>
    <view class="picker-confirm" catchtap="chooseRegion">确定</view>
  </view>
  <picker-view class="picker" value="{{regions}}" bindchange="changePicker" catchtap>
    <picker-view-column>
      <view wx:for="{{provinces}}" wx:key="code" class="region-province">{{item.name}}</view>
    </picker-view-column>
    <picker-view-column>
      <view wx:for="{{citys}}" wx:key="code" class="region-city">{{item.name}}</view>
    </picker-view-column>
    <picker-view-column>
      <view wx:for="{{areas}}" wx:key="code" class="region-area">{{item.name}}</view>
    </picker-view-column>
  </picker-view>
</view>

region.less

.region-picker {
  width: 100%;
  height: 100%;
  position: fixed;
  top: 0;
  left: 0;
  z-index: 2;
  background: rgba(0, 0, 0, 0.6);

  .picker-handle {
    width: 100%;
    height: 72rpx;
    display: flex;
    justify-content: space-between;
    position: absolute;
    bottom: 500rpx;
    left: 0;
    background: #fff;
    box-sizing: border-box;
    padding: 0 30rpx;
    line-height: 72rpx;
    box-shadow: 0 6rpx 12rpx rgba(0, 0, 0, 0.6);

    .picker-cancel,
    .picker-confirm {
      font-size: 30rpx;
    }

    .picker-cancel {
      color: #9E9E9E;
    }

    .picker-confirm {
      color: #018A56;
    }
  }

  .picker {
    width: 100%;
    height: 500rpx;
    position: absolute;
    bottom: 0;
    left: 0;
    background: #fff;

    .region-province,
    .region-city,
    .region-area {
      text-align: center;
      font-size: 24rpx;
    }
  }
}

region.js

const app = getApp();
Component({
  
  properties: {
    // 是否展示选择器
    showPicker: {
      type: Boolean,
      value: false
    },
    // 初始省市区数组
    initRegions: {
      type: Array,
      value: []
    }
  },

  
  data: {
    // 当前省市区  0 省  1 市  2 区
    regions: [0, 0, 0],
    // 滑动选择器之前的省市区信息
    oldRegions: [0, 0, 0],
    // 上一次选中的省市区信息
    prevRegions: [0, 0, 0],
    // 省列表
    provinces: [],
    // 市列表
    citys: [],
    // 区列表
    areas: [],
    // 省
    province: {
      name: '',
      code: ''
    },
    // 市
    city: {
      name: '',
      code: ''
    },
    // 区
    area: {
      name: '',
      code: ''
    },
    // 是否展示
    show: false
  },

  lifetimes: {
    attached: function () {

    }
  },

  observers: {
    'showPicker': function (value) {
      if (value) {
        this.setData({
          show: true
        })
        this.initPage();
      } else {
        this.setData({
          show: false
        })
      }
    }
  },

  
  methods: {
    // 初始化页面
    initPage() {
      let regions = wx.getStorageSync('initRegions') || '';
      if (regions) {
        // 设置省
        app.api.region.index().then(res1 => {
          if (res1.code === 2000) {
            let data1 = res1.data;
            this.setData({
              provinces: data1.map(item => {
                return {
                  name: item.name,
                  code: item.rid
                }
              })
            })
            this.data.provinces.forEach((item, index) => {
              if (item.code === regions[0]) {
                this.setData({
                  ['regions[0]']: index,
                  ['oldRegions[0]']: index,
                  ['prevRegions[0]']: index,
                  province: {
                    name: item.name,
                    code: item.code
                  }
                })
                // 设置市
                app.api.region.index({
                  parent_id: regions[0]
                }).then(async res2 => {
                  if (res2.code === 2000) {
                    res2.data.forEach((item, index) => {
                      this.setData({
                        [`citys[${this.data.citys.length}]`]: {
                          name: item.name,
                          code: item.rid
                        }
                      })
                      if (item.rid === regions[1]) {
                        this.setData({
                          ['regions[1]']: index,
                          ['oldRegions[1]']: index,
                          ['prevRegions[1]']: index,
                          city: {
                            name: item.name,
                            code: item.rid
                          }
                        })
                      }
                    })
                    // 设置区
                    await app.api.region.index({
                      parent_id: regions[1]
                    }).then(res3 => {
                      if (res3.code === 2000) {
                        res3.data.forEach((item, index) => {
                          this.setData({
                            [`areas[${this.data.areas.length}]`]: {
                              name: item.name,
                              code: item.rid
                            }
                          })
                          if (item.rid === regions[2]) {
                            this.setData({
                              ['regions[2]']: index,
                              ['oldRegions[2]']: index,
                              ['prevRegions[2]']: index,
                              area: {
                                name: item.name,
                                code: item.rid
                              },
                            })
                          }
                        })
                      } else if (res3.code === 2001) {
                        app.deletetoken();
                      } else {
                        app.toast(res3.msg, 'none');
                      }
                    })
                  } else if (res2.code === 2001) {
                    app.deletetoken();
                  } else {
                    app.toast(res2.msg, 'none');
                  }
                })
              }
            })
          } else if (res.code === 2001) {
            app.deletetoken();
          } else {
            app.toast(res.msg, 'none');
          }
        })
      } else {
        this.getProvinces();
      }
    },
    
    async getProvinces() {
      await app.api.region.index().then(res => {
        if (res.code === 2000) {
          let data = res.data;
          let provinceList = data.map(item => {
            return {
              name: item.name,
              code: item.rid
            }
          })
          this.setData({
            provinces: provinceList
          })
          this.initCitysAreas();
        } else if (res.code === 2001) {
          app.deletetoken();
        } else {
          app.toast(res.msg, 'none');
        }
      })
    },

    
    changeProvince(code) {
      app.api.region.index({
        parent_id: code
      }).then(res1 => {
        if (res1.code === 2000) {
          let data1 = res1.data;
          let cityList = data1.map(item => {
            return {
              name: item.name,
              code: item.rid
            }
          })
          this.setData({
            citys: cityList
          })
          app.api.region.index({
            parent_id: this.data.citys[0].code
          }).then(res2 => {
            if (res2.code === 2000) {
              let data2 = res2.data;
              let areaList = data2.map(item => {
                return {
                  name: item.name,
                  code: item.rid
                }
              })
              this.setData({
                areas: areaList
              })
            } else if (res2.code === 2001) {
              app.deletetoken();
            } else {
              app.toast(res2.msg, 'none');
            }
          })
        } else if (res1.code === 2001) {
          app.deletetoken();
        } else {
          app.toast(res1.msg, 'none');
        }
      })
    },

    
    changeCity(code) {
      app.api.region.index({
        parent_id: code
      }).then(res => {
        if (res.code === 2000) {
          let data = res.data;
          let areaList = data.map(item => {
            return {
              name: item.name,
              code: item.rid
            }
          })
          this.setData({
            areas: areaList
          })
        } else if (res.code === 2001) {
          app.deletetoken();
        } else {
          app.toast(res.msg, 'none');
        }
      })
    },

    
    changePicker(e) {
      let newRegion = e.detail.value;
      for (let i = 0; i < newRegion.length; i++) {
        // 找到改变的那一列
        if (newRegion[i] !== this.data.oldRegions[i]) {
          switch (i + 1) {
            case 1:
              // 省改变了
              this.changeProvince(this.data.provinces[newRegion[i]].code)
              this.setData({
                regions: [newRegion[i], 0, 0],
                oldRegions: [newRegion[i], 0, 0]
              })
              newRegion = [
                newRegion[0], 0, 0
              ]
              break;
            case 2:
              // 市改变了
              this.changeCity(this.data.citys[newRegion[i]].code)
              this.setData({
                regions: [this.data.oldRegions[0], newRegion[i], 0],
                oldRegions: [this.data.oldRegions[0], newRegion[i], 0]
              })
              break;
            case 3:
              // 区改变
              this.setData({
                regions: [this.data.oldRegions[0], this.data.oldRegions[1], newRegion[i]],
                oldRegions: [this.data.oldRegions[0], this.data.oldRegions[1], newRegion[i]]
              })
              break;
          }
        }
      }
    },
    
    initCitysAreas() {
      // 获取市
      app.api.region.index({
        parent_id: this.data.provinces[this.data.regions[0]].code
      }).then(res1 => {
        if (res1.code === 2000) {
          let data1 = res1.data;
          let cityList = data1.map(item => {
            return {
              name: item.name,
              code: item.rid
            }
          })
          this.setData({
            citys: cityList
          })
          // 获取区
          app.api.region.index({
            parent_id: this.data.citys[this.data.regions[1]].code
          }).then(res2 => {
            if (res2.code === 2000) {
              let data2 = res2.data;
              let areaList = data2.map(item => {
                return {
                  name: item.name,
                  code: item.rid
                }
              })
              this.setData({
                areas: areaList,
                regions: this.data.regions
              })
            } else if (res2.code === 2001) {
              app.deletetoken();
            } else {
              app.toast(res2.msg, 'none');
            }
          })
        } else if (res1.code === 2001) {
          app.deletetoken();
        } else {
          app.toast(res1.msg, 'none');
        }
      })
    },
    
    hidePicker() {
      this.setData({
        show: false,
        regions: this.data.prevRegions,
        oldRegions: this.data.prevRegions
      })
    },
    
    chooseRegion() {
      this.setData({
        province: {
          name: this.data.provinces[this.data.regions[0]].name,
          code: this.data.provinces[this.data.regions[0]].code
        },
        city: {
          name: this.data.citys[this.data.regions[1]].name,
          code: this.data.citys[this.data.regions[1]].code
        },
        area: {
          name: this.data.areas[this.data.regions[2]].name,
          code: this.data.areas[this.data.regions[2]].code
        },
        prevRegions: this.data.regions,
      })
      this.triggerEvent("chooseRegion", {
        initRegions: [this.data.province.code, this.data.city.code, this.data.area.code],
        region: this.data.province.name + ' ' + this.data.city.name + ' ' + this.data.area.name
      })
      wx.setStorageSync('initRegions', [this.data.province.code, this.data.city.code, this.data.area.code]);
      this.hidePicker();
    },
  }
})

使用

wxml

<region showPicker="{{show.picker}}" initRegions="{{initRegions}}" bind:chooseRegion="chooseRegion"></region>

js

// pages/settled/settled.js
const app = getApp();
Page({

  
  data: {
    // 选中的省市区id数组
    initRegions: [],
    // 常住地址
    region: '',
    // 展示控制
    show: {
      picker: false, // 地址选择器
    }
  },

  
  onUnload: function() {
    wx.removeStorageSync('initRegions');
  },
  
  showPicker() {
    this.setData({
      ['show.picker']: true
    })
  },

  
  chooseRegion(e) {
    this.setData({
      initRegions: e.detail.initRegions,
      region: e.detail.region
    })
  }
})

效果

参考文档

picker-view | 微信开放文档
picker-view-column | 微信开放文档

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: 微信小程序自定义地址组件

本文链接: https://www.lsjlt.com/news/153198.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 微信小程序自定义地址组件
    本文实例为大家分享了微信小程序自定义地址组件的具体代码,供大家参考,具体内容如下 项目需求 需要调用后台传过来的地址,存储地址时存的是地址的id,所以市面上的地址组件均不符合我的需求...
    99+
    2024-04-02
  • 微信小程序怎么自定义地址组件
    本文小编为大家详细介绍“微信小程序怎么自定义地址组件”,内容详细,步骤清晰,细节处理妥当,希望这篇“微信小程序怎么自定义地址组件”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。项目需求需要调用后台传过来的地址,存储...
    99+
    2023-07-02
  • 【微信小程序】自定义组件(二)
    🎁写在前面: 观众老爷们好呀,这里是前端小刘不怕牛牛频道,小程序系列文章又更新了呀。 上文我们讲解了微信小程序自定义组件的入门知识,那么今天牛牛就来讲讲自定义组件的进阶知识吧,...
    99+
    2023-09-01
    微信小程序 小程序 前端
  • 微信小程序自定义tabbar组件
    本文实例为大家分享了微信小程序自定义tabbar组件的具体代码,供大家参考,具体内容如下 由于项目需求,必须自己写组件: 第一步:在App.json中配置tabBar,自定也组件也必...
    99+
    2024-04-02
  • 【微信小程序】自定义组件(一)
    🎁写在前面: 观众老爷们好呀,这里是前端小刘不怕牛牛频道,小程序系列文章又更新了呀。 今天牛牛带来的是微信小程序的自定义组件入门知识,赶紧拿起小本本做笔记呀! ...
    99+
    2023-09-05
    微信小程序 前端 小程序
  • 微信小程序怎么自定义组件
    这篇文章主要讲解了“微信小程序怎么自定义组件”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“微信小程序怎么自定义组件”吧!组件模版和样式类似于页面,自定义组件拥有自己的 wxml&n...
    99+
    2023-06-26
  • 微信小程序中如何自定义组件
    这篇文章将为大家详细讲解有关微信小程序中如何自定义组件,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在微信小程序开发过程中,对于一些可能在多个页面都使用的页面模块,可以把它封装成一个组件,以提高开发效率。...
    99+
    2023-06-29
  • 微信小程序自定义组件(超详细)
    💌写在开头: 哈喽呀,亲爱的宝子们。 今天要介绍的是关于小程序自定义组件的相关内容。 主要分以下几个部分:组件的创建,组件的结构,组件的引用,组件样式,组件的生命周期等。 ...
    99+
    2023-09-09
    微信小程序 小程序 前端
  • 微信小程序如何自定义tabbar组件
    这篇文章主要讲解了“微信小程序如何自定义tabbar组件”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“微信小程序如何自定义tabbar组件”吧!由于项目需求,必须自己写组件:第一步:在App...
    99+
    2023-06-14
  • 微信小程序自定义顶部导航组件
    本文实例为大家分享了微信小程序自定义顶部导航组件,供大家参考,具体内容如下 在components中新建文件夹navbar components/navbar.wxml <!-...
    99+
    2024-04-02
  • 微信小程序实现自定义拍摄组件
    微信小程序实现自定义摄像头(在摄像头内添加提示信息),供大家参考,具体内容如下 摄像头组件(wxml) <!-- 拍照功能 自定义摄像头           bindtap:t...
    99+
    2024-04-02
  • 【小程序】微信小程序自定义组件Component详细总结
    1- 前言 在本文中你将收获 小程序如何使用自定义组件自定义组件之间的传值自定义组件中插槽的使用 2- 组件文件新建 2.1 定义组件 在根目录新建components文件夹,建立cell 文件夹,...
    99+
    2023-09-23
    微信小程序 小程序 前端 开发语言 javascript
  • 微信小程序自定义波浪组件怎么用
    这篇文章主要为大家展示了“微信小程序自定义波浪组件怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“微信小程序自定义波浪组件怎么用”这篇文章吧。先看看效果图:...
    99+
    2024-04-02
  • 微信小程序怎么自定义组件Component使用
    本篇内容介绍了“微信小程序怎么自定义组件Component使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1- 前言在本文中你将收获小程序...
    99+
    2023-07-05
  • 微信小程序自定义底部导航栏组件
    本文实例为大家分享了微信小程序底部导航栏组件的具体实现代码,供大家参考,具体内容如下 1、在自己项目的公共组件的文件价下新建tabbar.vue(定义的自定义导航栏组件) <...
    99+
    2024-04-02
  • 微信小程序button组件如何自定义样式
    本篇内容主要讲解“微信小程序button组件如何自定义样式”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“微信小程序button组件如何自定义样式”吧!背景颜色wxml代码<button c...
    99+
    2023-06-26
  • 微信小程序自定义组件实现多选功能
    本文实例为大家分享了微信小程序自定义组件实现多选的具体代码,供大家参考,具体内容如下 效果图: 调用部分(例如在index页面) index.wxml <view catch...
    99+
    2024-04-02
  • 微信小程序如何实现自定义弹窗组件
    本篇内容主要讲解“微信小程序如何实现自定义弹窗组件”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“微信小程序如何实现自定义弹窗组件”吧!首先,放一下,最终的效果图:这是我们最后要实现的效果那么,首...
    99+
    2023-07-02
  • 微信小程序中怎么自定义一个components组件
    本篇文章为大家展示了微信小程序中怎么自定义一个components组件,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。小程序自定义组件找到components目录,没...
    99+
    2024-04-02
  • 微信小程序自定义组件实现单选功能
    本文实例为大家分享了微信小程序自定义组件实现单选的具体代码,供大家参考,具体内容如下 效果图: 调用部分(例如在index页面) index.wxml <view catch...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作