微信小程序多列下拉框的实现(树形数据结构和单数组数据结构形式)

这篇具有很好参考价值的文章主要介绍了微信小程序多列下拉框的实现(树形数据结构和单数组数据结构形式)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

多列下拉框实现介绍

利用微信小程序api,实现不同传输数据格式下的多列下拉框实现
首先了解一下picker中的事件
小程序下拉框,微信小程序,微信小程序,数据结构,小程序,javascript,前端
这里是官方文档,具体意思就是 当你滑动多列中的某一列的时候,bindcolumnchange事件就会触发。当选择完毕点击确定的时候bindchange事件就会触发

微信小程序的多列下拉框是真的反人类

vue什么的就是传个数据就行了,它这样搞,麻烦。不知道读者有没有简单的办法,有的可以留言评论,反正我是想不出来了。

成果

小程序下拉框,微信小程序,微信小程序,数据结构,小程序,javascript,前端
小程序下拉框,微信小程序,微信小程序,数据结构,小程序,javascript,前端

情况一:后端返回的数据是 一层一个数组,没有树形结构

如: [[第一层数据],[第二层数据],[第三层数据]]

实现思路

定义三个数组,分别把每一层的数据放在对应数组中,用于更新,
定义一个只有三的元素的数组multiIndex表示每一层对应的下标。
需要注意的是areapicker1/2/3是所在层的所有数据
areaArry是用于展示在页面上的数据,它的格式是[[第一层],[第二层],[第三层]]
流程是用户滚动多列下拉框,程序通过bindcolumnchange事件,对areaArry里的数据进行实时更改,同时更改multiIndex的值(它代表的现在所选值在areaArry数组中对应的每一层的下标有几层multiIndex就有几个元素,两层就只有两个元素)

wxml
<picker mode="multiSelector" class="input_item_right" bindchange="bindpatrolquestiontype" value="{{multiIndex}}" range="{{areaArry}}" bindcolumnchange="bindMultiPickerColumnChange" bindchange="bindAreaChange" range-key='text'>
          <view class="picker">
            <view>
              <view wx:if="{{rqstAreaCode==''}}">请选择区域</view>
            </view>
            <view>
              {{rqstAreaCode}}
            </view>

          </view>
</picker>

js
var areapicker1 = []; //地区选择的第一列数据总数组
var areapicker2 = []; //地区选择的第二列数据总数组
var areapicker3 = []; //地区选择的第三列数据总数组

page({
    data: {
        multiIndex: [0, 0, 0],
        areaArry: []//展示在页面上的数据
        areaCodeArry:[],//对应的code值
    },
    //注意拿到数据之后进行对areaArry初始化...
    
    
    bindMultiPickerColumnChange: function (e) {
    	var that = this;
        switch (e.detail.column) {
            case 0:
                //用临时数组存储
                var list=[],//表示第二列展示的数据(只有name值)
                    list2 = [],//第三列的展示数据(只有name值)
                    codelist=[],//表示第二列value的值(只有code值)
                    codelist2=[],//表示第三列value的值(只有code值)
                	newpicker2=[],//临时的第二列数据(item的所有属性都有)
                 //从所有第二列的内容中取出与第一列选中状态的值对应的数据用于实时生成第二列
                for (var i = 0; i < areapicker2.length; i++) {
                    if (areapicker2[i].parentGuid == areapicker1[e.detail.value].id) {
                        //若第二列的父亲跟这个相同,则push
                        newpicker2.push(areapicker2[i]);
                        list.push(areapicker2[i].areaName)
                        codelist.push(areapicker2[i].areaCode)
                    }
                }
                
                if (areapicker3.length > 0) {
                    for (var i = 0; i < areapicker3.length; i++) {
                        if (newpicker2.length > 0) {
                            if (areapicker3[i].parentGuid == newpicker2[0].id) {
                                list2.push(areapicker3[i].areaName)
                                codelist2.push(areapicker3[i].areaCode)
                            }
                        }

                    }
                }
                //实时修改第二列,并且把第二列设置到第一个展示
                that.setData({
                    "areaArry[1]": list,
                    "areaArry[2]": list2,
                    "areaCodeArry[1]": codelist,
                    "areaCodeArry[2]": codelist2,
                    "multiIndex[0]": e.detail.value,
                    "multiIndex[1]": 0
                })
                console.log(that.data.multiIndex);
                break;
            case 1:
                //同上
               var list2 = [],//第三列展示值
                   codelist2 = [];//第三列value值

                var multiIndex1 = that.data.multiIndex[0],
                    newpicker2 = [];//第二列的临时数组,用于第三列的比较
                //从所有第二列的内容中取出与第一列选中状态的值对应的数据 用于第三列的判断
                for (var i = 0; i < areapicker2.length; i++) {
                    if (areapicker2[i].parentGuid == areapicker1[multiIndex1].id) {
                        newpicker2.push(areapicker2[i]);
                    }
                }

                //从所有第三列的内容中取出与第一列选中状态的值对应的数据用于实时生成第三列
                if (areapicker3.length > 0) {
                    for (var i = 0; i < areapicker3.length; i++) {
                        if (areapicker3[i].parentGuid == newpicker2[e.detail.value].id) {
                            list2.push(areapicker3[i].areaName)
                            codelist2.push(areapicker3[i].areaCode)
                        }
                    }
                    that.setData({
                        "areaArry[2]": list2,
                        "areaCodeArry[2]": codelist2,
                        "multiIndex[1]": e.detail.value,
                        "multiIndex[2]": 0
                    })
                    console.log(that.data.multiIndex);
                }
                break;
        }
    },
    
    //点击确定后的操作,用来最后提交的值 利用multiIndex
    bindAreaChange: function (e) {
    	var that = this;
        var result = e.detail.value;//这里的value 就是 multiIndex
        if (result.length > 2) {
            var reslutname = that.data.areaArry[0][result[0]] + that.data.areaArry[1][result[1]] + (that.data.areaArry[2][result[2]] == undefined ? '' : that.data.areaArry[2][result[2]]);
            var reslutcode = that.data.areaCodeArry[2][result[2]] == undefined ? '' : that.data.areaCodeArry[2][result[2]];
        } else {
            var reslutname = that.data.areaArry[0][result[0]] + that.data.areaArry[1][result[1]];
            var reslutcode = that.data.areaCodeArry[1][result[1]];
        }

        this.setData({
            rqstAreaCode: reslutname,
            realrqstAreaCode: reslutcode
        })
    },
})

情况二:后端返回的数据是树形结构

如图
小程序下拉框,微信小程序,微信小程序,数据结构,小程序,javascript,前端

实现思路

同上,这个相对于上面的简单点,不需要areapicker来存储数据文章来源地址https://www.toymoban.com/news/detail-734192.html

wxml同上
js
var arrayList = [];

page({
    data: {
        multiIndex: [0, 0, 0],
        areaArry: []
    },

 //初始化
 //获取诉求类型和诉求区域
getEvent: function (accesstoken) {
    app.fetch({
      url: '...',
      token: '',
      params: {},
    }).then(res => {
      var list = res.custom.jsonList
      arrayList = list;
      self.setData({
        //拿到数据之后初始化列表
        areaArry: [arrayList, arrayList[0].children, arrayList[0].children[0].children]
      })
    })
  },  
      
        
 bindMultiPickerColumnChange: function (e) {
 	var that = this;
    console.log("多级联动控制", e);
    var that = this;
    //获取当前滚动的是哪一列,通过判断哪一列来实时控制下一列的变化
    console.log("第", e.detail.column + 1, '列。第', e.detail.value + 1, '个数据');
    switch (e.detail.column) {
      case 0://第一列
        var list2 = [],
          list3 = [];
        //选择第一列的这个值然后找到它的儿子
        list2 = that.data.areaArry[e.detail.value].children;
        //实时修改第二列,并且把第二列设置到第一个展示
        list3 = list2[0].children
        that.setData({
          "areaArry[1]": list2,
          "areaArry[2]": list3,
          "multiIndex[0]": e.detail.value,
          "multiIndex[1]": 0,
          "multiIndex[2]": 0,
        })
        console.log(that.data.multiIndex);
        break;
      case 1://第二列
        var list3 = [];
        //从所有第二列的内容中取出与第一列选中状态的值对应的数据用于实时生成第二列  ?????
        list3 = that.data.areaArry[1][e.detail.value].children
        that.setData({
          "areaArry[2]": list3,
          "multiIndex[1]": e.detail.value,
          "multiIndex[2]": 0
        })
        break;
      case 2://第三列
        that.setData({
          "multiIndex[2]": e.detail.value
        })
        break;
    }
    console.log(that.data.areaArry)

  },

bindAreaChange: function (e) {
    var that = this;
    var result = e.detail.value;
    var multiIndex = that.data.multiIndex
    result = arrayList[multiIndex[0]].children[multiIndex[1]].children[multiIndex[2]];
    that.setData({
      rqstAreaCode: result.text,
      realrqstAreaCode: result.value
    })
    console.log('已选择的区域名称', that.data.rqstAreaCode);
    console.log('已选择的区域代码', that.data.realrqstAreaCode);
  },
})

到了这里,关于微信小程序多列下拉框的实现(树形数据结构和单数组数据结构形式)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微信小程序实现下拉筛选

    不多说直接上代码 1、WXML代码: 2、 WXSS代码: 3、JS代码:

    2024年02月16日
    浏览(49)
  • 【微信小程序】下拉刷新功能实现

    微信小程序开发系列 在开发微信小程序中经常会需要下拉页面进行更新要页面数据的功能,微信小程序提供了onPullDownRefresh函数。该函数作用是监听用户下拉动作。 监听用户下拉刷新事件。 需要在app.json的window选项中或页面配置中开启enablePullDownRefresh: 可以通过wx.startPullD

    2024年02月12日
    浏览(47)
  • 实现微信小程序下拉刷新功能

    方法一:全局设置下拉刷新功能      1、在app.json的\\\"window\\\"中进行配置         (1)把\\\"backgroundTextStyle\\\":“light\\\"改为\\\"backgroundTextStyle”:“dark”         (2)添加\\\"enablePullDownRefresh\\\":true,开启下拉刷新。       2、在app.js中增加两个生命周期函数   方法一:全局设置下拉刷新

    2024年02月13日
    浏览(43)
  • 微信小程序实现下拉简单展示接口数据

    在.js文件中这样写,代码如下: 在wxml文件中这样写,代码如下: 在.json文件中记得添加如下代码,打开下拉功能 \\\"window\\\":{     \\\"backgroundTextStyle\\\":\\\"light\\\",     \\\"navigationBarBackgroundColor\\\": \\\"#282A36\\\",     \\\"navigationBarTitleText\\\": \\\"Linux\\\",     \\\"navigationBarTextStyle\\\":\\\"white\\\",      \\\"enablePullDo

    2024年01月20日
    浏览(37)
  • Taro微信小程序 实现下拉、触底刷新

    下拉刷新, 需要在页面的config文件中配置 enablePullDownRefresh: true, onReachBottomDistance: 50, backgroundTextStyle: \\\'dark\\\', 在代码中使用usePullDownRefresh, 当我们刷新页面时候会触发usePullDownRefresh方法,这里我们获取数据。

    2024年02月11日
    浏览(57)
  • 实现微信小程序中的下拉刷新功能

    在微信小程序中,可以通过在 scroll-view 组件上添加 enablePullDownRefresh 属性来启用下拉刷新功能。同时需要在页面的 .json 文件中设置 backgroundTextStyle 和 onPullDownRefresh 两个属性。 具体步骤如下: 1.在页面的 .json 文件中添加 enablePullDownRefresh、backgroundTextStyle 和 onPullDownRefresh 三个

    2024年02月12日
    浏览(43)
  • 微信小程序picker多列选择器

    微信官方文档的的案例数据是写死,而且代码阅读性特别差 下面是我参考官方案例写的一个多列选择器,数据是都 动态获取 的 这是一个二列的选择器,如果需要三列的可以稍加修改一下 一、wxml 二、js 选择器中的数据都是 动态获取 的,只要将数据转成跟 data 中的数据格式

    2024年02月11日
    浏览(41)
  • el-select与el-tree结合使用,实现select框下拉使用树形结构选择数据

    使用el-select与el-tree,实现如下效果, 代码如下:  注意点:搜索input框的代码一点放在option上面,不要放在option里面,否则一点击搜索框,下拉框就会收起来,不能使用。

    2024年02月13日
    浏览(53)
  • 微信小程序下拉刷新获取数据和触底事件刷新实现

    说明:开启下拉刷新,然后设置窗口的背景色,方便观看。   说明:重新发起请求,并显示加载中   说明:当数据请求成功后,收回下拉刷新框并关闭加载中。 说明: onReachBottomDistance 定义了从页面底部的距离为50px,当滚动距离接近到这个值时,通常会触发一个函数或事件

    2024年02月16日
    浏览(43)
  • 微信小程序-----通用获取输入框的值

    在微信小程序中,可以通过以下步骤获取到输入框的值: 1. 在WXML中,使用标签创建一个输入框,并设置一个唯一的id属性。 2. 在JS中,定义一个事件处理函数,用于获取输入框的值。 3. 在事件处理函数中,通过e.detail.value获取输入框的值,并进行相应的处理。可以将其存储到

    2024年02月09日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包