zoukankan      html  css  js  c++  java
  • 微信小程序 实现三级联动-省市区

    github项目地址   https://github.com/z1511676208/chooseAddr

    序:项目中需要用到三级联动,自己试着写了下,也查了一些资料,现在把这个记录一下,里面地区数据,可根据个人需要做一些更改,我比较懒就不改了。

    wxml

    <!--index.wxml-->
    
      <view class="infoText">{{province}} {{city}} {{county}}</view> 
      <view class="aaaa" >
      <button class="animation-button" bindtap="translate">选择城市</button>
      </view>
          
      <view class="animation-element-wrapper" animation="{{animation}}" style="visibility:{{show ? 'visible':'hidden'}}" bindtap="hiddenFloatView" data-id="444">
         <view class="animation-element" catchtap="nono">
            <text class="left-bt" catchtap="hiddenFloatView" data-id="555">取消</text>
            <text class="right-bt" catchtap="hiddenFloatView" data-id="666">确定</text>
              <view class="line"></view> 
    
            <picker-view indicator-style = "height: 50rpx;" value="{{value}}" bindchange="bindChange" catchtap="nono">
            <!--省-->
            <picker-view-column>
               <view wx:for="{{provinces}}" wx:for-item="sheng" wx:key="">
                 {{sheng.name}}
              </view>
            </picker-view-column>
            <!--地级市-->
            <picker-view-column>
              <view wx:for="{{citys}}" wx:key="">
                {{item.name}}
              </view>
            </picker-view-column>
            <!--区县-->
            <picker-view-column>
              <view wx:for="{{countys}}" wx:key="">
                {{item.name}}
              </view>
            </picker-view-column>
            </picker-view>
        </view>
      </view>
    

     js

    //index.js
    //获取应用实例
    // var app = getApp()
    // var util = require('../../utils/util.js')
    var area = require('../../utils/area.js')
    
    var areaInfo = [];//所有省市区县数据
    
    var provinces = [];//省
    
    var citys = [];//城市
    
    var countys = [];//区县
    
    var index = [0, 0, 0];
    
    var cellId;
    
    var t = 0;
    var show = false;
    var moveY = 200;
    
    Page({
      data: {
        show: show,
        provinces: provinces,
        citys: citys,
        countys: countys,
        value: [0, 0, 0]
      },
      //滑动事件
      bindChange: function (e) {
        var val = e.detail.value
        // console.log(e)
        //判断滑动的是第几个column
        //若省份column做了滑动则定位到地级市和区县第一位
        if (index[0] != val[0]) {
          val[1] = 0;
          val[2] = 0;
          getCityArr(val[0], this);//获取地级市数据
          getCountyInfo(val[0], val[1], this);//获取区县数据
        } else {    //若省份column未做滑动,地级市做了滑动则定位区县第一位
          if (index[1] != val[1]) {
            val[2] = 0;
            getCountyInfo(val[0], val[1], this);//获取区县数据
          }
        }
        index = val;
    
        console.log(index + " => " + val);
    
        //更新数据
        this.setData({
          value: [val[0], val[1], val[2]],
          province: provinces[val[0]].name,
          city: citys[val[1]].name,
          county: countys[val[2]].name
        })
    
      },
      onLoad: function (options) {
        cellId = options.cellId;
        var that = this;
        var date = new Date()
        console.log(date.getFullYear() + "年" + (date.getMonth() + 1) + "月" + date.getDate() + "日");
    
        //获取省市区县数据
        area.getAreaInfo(function (arr) {
          areaInfo = arr;
          //获取省份数据
          getProvinceData(that);
        });
    
      },
      // ------------------- 分割线 --------------------
      onReady: function () {
        this.animation = wx.createAnimation({
          transformOrigin: "50% 50%",
          duration: 0,
          timingFunction: "ease",
          delay: 0
        }
        )
        this.animation.translateY(200 + 'vh').step();
        this.setData({
          animation: this.animation.export(),
          show: show
        })
      },
      //移动按钮点击事件
      translate: function (e) {
        if (t == 0) {
          moveY = 0;
          show = false;
          t = 1;
        } else {
          moveY = 200;
          show = true;
          t = 0;
        }
        // this.animation.translate(arr[0], arr[1]).step();
        animationEvents(this,moveY, show);
        
      },
      //隐藏弹窗浮层
      hiddenFloatView(e){
        console.log(e);
        moveY = 200;
        show = true;
        t = 0;
        animationEvents(this,moveY, show);
    
      },
      //页面滑至底部事件
      onReachBottom: function () {
        // Do something when page reach bottom.
      },
      tiaozhuan(){
        wx.navigateTo({
          url: '../../pages/modelTest/modelTest',
        })
      }
    })
    
    //动画事件
    function animationEvents(that,moveY,show){
      console.log("moveY:" + moveY + "
    show:" + show);
      that.animation = wx.createAnimation({
        transformOrigin: "50% 50%",
        duration: 400,
        timingFunction: "ease",
        delay: 0
      }
      )
      that.animation.translateY(moveY + 'vh').step()
    
      that.setData({
        animation: that.animation.export(),
        show: show
      })
    
    }
    
    // ---------------- 分割线 ---------------- 
    
    //获取省份数据
    function getProvinceData(that) {
      var s;
      provinces = [];
      var num = 0;
      for (var i = 0; i < areaInfo.length; i++) {
        s = areaInfo[i];
        if (s.di == "00" && s.xian == "00") {
          provinces[num] = s;
          num++;
        }
      }
      that.setData({
        provinces: provinces
      })
    
      //初始化调一次可更改
      getCityArr(0, that);
      getCountyInfo(0, 0, that);
      that.setData({
        province: "北京市",
        city: "市辖区",
        county: "东城区",
      })
    
    }
    
    // 获取地级市数据
    function getCityArr(count, that) {
      var c;
      citys = [];
      var num = 0;
      for (var i = 0; i < areaInfo.length; i++) {
        c = areaInfo[i];
        if (c.xian == "00" && c.sheng == provinces[count].sheng && c.di != "00") {
          citys[num] = c;
          num++;
        }
      }
      if (citys.length == 0) {
        citys[0] = { name: '' };
      }
    
      that.setData({
        city: "",
        citys: citys,
        value: [count, 0, 0]
      })
    }
    
    // 获取区县数据
    function getCountyInfo(column0, column1, that) {
      var c;
      countys = [];
      var num = 0;
      for (var i = 0; i < areaInfo.length; i++) {
        c = areaInfo[i];
        if (c.xian != "00" && c.sheng == provinces[column0].sheng && c.di == citys[column1].di) {
          countys[num] = c;
          num++;
        }
      }
      if(countys.length == 0){
        countys[0] = {name:''};
      }
      that.setData({
        county: "",
        countys: countys,
        value: [column0, column1, 0]
      })
    }
    

     wxss

    /**index.wxss**/
    page{
      background-color: rgba(255, 255, 255, 1); 
    }
    
    .infoText{
        margin-top: 20rpx;
        text-align: center;
         100%;
        justify-content: center; 
    }
    
    picker-view{
      background-color: white;
      padding: 0;
       100%; 
      height: 380rpx;
      bottom: 0;
      position: fixed;
    }
    
    picker-view-column view{
      vertical-align:middle; 
      font-size: 28rpx;
      line-height: 28rpx;
      height: 100%;
      display: flex;
      align-items: center;
      justify-content: center;
    }
    
    /* ----------------------------------------- */
    
    .animation-element-wrapper {
      display: flex;  
      position: fixed;
      left: 0;
      top:0;
      height: 100%;
       100%;
      background-color: rgba(0, 0, 0, 0.6);
    }
    .animation-element {
      display: flex;
      position: fixed;
       100%;
      height: 470rpx;
      bottom: 0;
      background-color: rgba(255, 255, 255, 1);
    }
    
    .animation-button {
      margin-top: 20rpx;
      top:20rpx;
       400rpx;
      height: 100rpx; 
      line-height: 100rpx; 
      align-items:center;
    }
    
    
    text{
      color: #999999;
      display: inline-flex;  
      position: fixed;
      margin-top: 20rpx;
      height: 50rpx;
      text-align: center;
      line-height: 50rpx;
      font-size: 34rpx;
      font-family: Arial, Helvetica, sans-serif;
    }
    
    .left-bt{
      left: 30rpx;
    }
    .right-bt {
      right: 30rpx;
    }
    
    .line{
      display: block;
      position: fixed;
      height: 1rpx;
       100%;
      margin-top: 89rpx; 
      background-color: #eeeeee;
    }
    

      这个是没有进行封装的处理

    项目里已经封装好,可直接通过模板调用使用。

  • 相关阅读:
    表观遗传学|
    Mutation|DNM|
    Right journal|First-class paper|Mediocre paper|figure legend |Discussion|Introduction
    PCoA|NMDS|STRESS|RDA |RA|Unimodal|CCA|Generalized Joint Attribute Modeling
    缺失值|回归分析|协变关系|
    基金写作流程|留学回国人员启动资金
    nexage video asset tag
    获取的时候报cannot find package "golang.org /x/net/context",编译也报错误
    google play apk 下载
    vim golang 插件
  • 原文地址:https://www.cnblogs.com/zwp06/p/9217212.html
Copyright © 2011-2022 走看看