精华内容
下载资源
问答
  • 微信小程序实现三级联动

    千次阅读 2019-09-18 11:49:12
    三级联动是借助于vant-weapp组件库中的vant-picker多级联动实现的 我们先看一下效果图 我们都知道官方对vant-picker多级联动组件的介绍并不多,而且还会让初学者看的绞尽脑汁,这个是干什么的啊,这是啥啊,会...

    该三级联动是借助于vant-weapp组件库中的vant-picker多级联动实现的

    我们先看一下效果图

    我们都知道官方对vant-picker多级联动组件的介绍并不多,而且还会让初学者看的绞尽脑汁,这个是干什么的啊,这是啥啊,会有很多个疑问,官方组件介绍点击直达

    如果你还没有用过vant-weapp组件库,请先对该组件库进行一些初步的了解,这是一个很利于大家快速开发微信小程序的一个组件库,笔者大力推荐大家使用。

    • vant-weapp组件库官方使用文档点击直达
    • 如果你还不知道怎么引用vant-weapp组件库请看我的博客点击直达

    下面就贴一下我实现的具体代码

    • index.wxml代码
    <van-picker 
    show-toolbar 
    columns='{{columns}}' 
    value-key='name' 
    bind:change='onChange' 
    bind:confirm='onConfirm' 
    bind:cancel='onCancel'/>
    • index.json代码
    "usingComponents": {
        "van-picker": "/miniprogram_npm/vant-weapp/picker/index"
     }
    • index.js代码
    var one = [
      { id: 111, 'name': '杭州' },
      { id: 222, 'name': '宁波' },
    ]
    var two = {
      '杭州': [
        { id: 11100, 'name': '国杭州' },
        { id: 22201, 'name': '国宁波' },
      ],
      '宁波': [
        { id: 11102, 'name': '中杭州' },
        { id: 22203, 'name': '中宁波' },
        { id: 33304, 'name': '中温州' },
      ]
    }
    var three = {
      '国杭州': [
        { id: 1110000, 'name': 'aaa' },
        { id: 2220101, 'name': 'bbb' },
      ],
      '国宁波': [
        { id: 1110102, 'name': 'ccc' },
        { id: 2220103, 'name': 'ddd' },
        { id: 3330104, 'name': 'eee' },
      ],
      '中杭州': [
        { id: 1110205, 'name': 'fff' },
        { id: 2220206, 'name': 'ggg' },
        { id: 3330207, 'name': 'hhh' },
      ],
      '中宁波': [
        { id: 1110308, 'name': 'www' },
        { id: 2220309, 'name': 'ttt' },
        { id: 3330310, 'name': 'yyy' },
      ],
      '中温州': [
        { id: 1110411, 'name': 'jjj' },
        { id: 2220412, 'name': 'kkk' },
        { id: 3330413, 'name': 'ppp' },
      ]
    }
    
    Page({
      data: {
        columns: [
          {
            values: one,                              //可以是数组,或者对象数组
            className: 'column1'                      //选择器的第一列
          },
          {
            values: two[one[0].name],                 //默认选中two对象中的第一项
            className: 'column2',                     //选择器的第二列
          },
          {
            values: three[two[one[0].name][0].name],  //默认选中three对象中的第一项
            className: 'column3',                     //选择器的第三列
          }
        ]
      },
    
      onLoad() {
        
      },
    
      onConfirm(event) {
        let value = event.detail.value
    
        //将选中的文字和对应的id拿出来使用
        wx.showModal({
          title: '',
          content: '您选中了“' + value[0].name + ',' + value[1].name + ',' 
                   + value[2].name + '”, di为“'+ value[0].id + ',' + value[1].id 
                   + ',' + value[2].id + '”',
          showCancel: false
        })
      },
    
      onChange(event) {
        let picker = event.detail.picker
        let value = event.detail.value
        let index = event.detail.index
        
        //在change 第一列的时候,动态更改第二列的数据
        //setColumnValues是vant自带的实例方法
        //第一个参数是列数,从0开始;第二个参数是第二列应该显示的数据
        picker.setColumnValues(1, two[value[0].name])
    
        //此处vant-picker有一个bug,当只滑动第一级时,返回的value数据是错误的,需要我们自己根据第二 
          级计算,去获取第三级数据
        if (index == 0) {
          picker.setColumnValues(2, three[(two[value[0].name][0]).name])
        } else {
          picker.setColumnValues(2, three[value[1].name])
        }
      },
    
      onCancel() {
    
      }
    })

    以上就是实现功能的全部代码,需要特别注意的就是官方的onChange方法,返回的第二列数据是有问题的,这里需要我们单独处理下,bug如下

    我们可以看到,当我们只操作第一列的时候,显然返回的value只有第一列是正确的,其他两列都是错误的,但是这种错误只在change事件出现,在confirm事件并没有这种情况,但是这明显也是也bug,会造成数据不统一问题,废话不多说直接说解决方案。

    解决方案:

    首先,我们可以清晰的看到,我们是可以获取到用户操作的那一列的下标的,0:第一列,1:第二列,2:第三列,依次类推,那么我们就可以通过下标判断,如果是第一列也就是index是0的情况,说明只滑动了第一列,我们就使用第二列的第一个对象数组key,否则就按照change方法返回的对象数组key,代码展示如下:

    onChange(event) {
        let picker = event.detail.picker
        let value = event.detail.value
        let index = event.detail.index
        
        //在change 第一列的时候,动态更改第二列的数据
        //setColumnValues是vant自带的实例方法
        //第一个参数是列数,从0开始;第二个参数是第二列应该显示的数据
        picker.setColumnValues(1, two[value[0].name])
    
        //此处vant-picker有一个bug,当只滑动第一级时,返回的value数据是错误的,需要我们自己根据第二 
          级计算,去获取第三级数据
        if (index == 0) {
          picker.setColumnValues(2, three[(two[value[0].name][0]).name])
        } else {
          picker.setColumnValues(2, three[value[1].name])
        }
     },

    本文是前端静态实现,如果你想结合后端实现三级联动,请查看我的这篇文章点击传送

    参考:https://www.jianshu.com/p/3886f1eded67

    展开全文
  • uni-app 微信小程序 picker 三级联动

    千次阅读 2019-10-24 13:24:52
    uni-app 微信小程序 picker 三级联动 之前一直在找picker三级联动的代码,算了,还是自己写吧, 具体代码`. // An highlighted block <template> <view> <picker mode="multiSelector" @change=...

    uni-app 微信小程序 picker 三级联动


    之前一直在找picker三级联动的代码,算了,还是自己写吧,
    具体代码`.

    // An highlighted block
    <template>
    	<view>
    		<picker mode="multiSelector" @change="bindMultiPickerChange" @columnchange="bindMultiPickerColumnChange" :value="multiIndex" :range="multiArray">
    			<view class="picker" style="display: flex;justify-content:space-around;align-items:center;width: 100%;flex: 1">
    				<view class="energy">
    					{{ areaname }}
    					<uni-icons :size="40" class="uni-icon-wrapper" color="#e0e0e0" type="arrowdown" />
    				</view>
    				<view style="background-color: #50a0d1;height: 50rpx;width: 1px;opacity: 0.5"></view>
    				<view class="energy">
    					{{ buildingname }}
    					<uni-icons :size="40" class="uni-icon-wrapper" color="#e0e0e0" type="arrowdown" />
    				</view>
    				<view style="background-color: #50a0d1;height: 50rpx;width: 1px;opacity: 0.5"></view>
    				<view class="energy">
    					{{ floorname }}
    					<uni-icons :size="40" class="uni-icon-wrapper" color="#e0e0e0" type="arrowdown" />
    				</view>
    			</view>
    		</picker>
    	</view>
    </template>
    
    <script>
    import Vue from 'vue';
    export default {
    	data() {
    		return {
    			multiArray: [['1', '2', '3', '4', '5', '6', '7'], ['1舍', '2舍', '3舍', '4舍'], ['111楼', '112楼', '113楼', '114楼']],
    			multiIndex: [0, 0, 0],
    			tabindex: 0,
    			ydindex: 0,
    			firstid: '0',
    			secondid: '0',
    			thirdid: '0',
    			areaname: '1',
    			dengswitchvalue: '',
    			ktswitchvalue: '',
    			buildingname: '1舍',
    			floorname: '111楼',
    			nowitem: '1-1舍-111楼',
    			column1data: [
    				//每个院部的楼栋
    				['11舍', '12舍', '13舍', '14舍'],
    				// ['21舍', '22舍', '23舍', '24舍'],
    				['21舍'],
    				// ['31舍', '32舍', '33舍', '34舍'],
    				['31舍', '32舍'],
    				['41舍', '42舍', '43舍', '44舍'],
    				['51舍', '52舍', '53舍', '54舍'],
    				['61舍', '62舍', '63舍', '64舍'],
    				['71舍', '72舍', '73舍', '74舍']
    			],
    			hangdata: [
    				//每一栋包含楼层
    				[['111楼', '112楼', '113楼', '114楼'], ['121楼', '122楼', '123楼'], ['131楼', '132楼', '133楼', '134楼'], ['141楼', '142楼', '143楼', '144楼']],
    				// [['211楼', '212楼', '213楼', '214楼'], ['221楼', '222楼', '223楼', '224楼'], ['231楼', '232楼', '233楼', '234楼'], ['241楼', '242楼', '243楼', '244楼']],
    				[['211楼', '212楼', '213楼', '214楼']],
    				// [['311楼', '312楼', '313楼', '314楼'], ['321楼', '322楼', '323楼', '324楼'], ['331楼', '332楼', '333楼', '334楼'], ['341楼', '342楼', '343楼', '344楼']],
    				[['311楼', '312楼', '313楼', '314楼'], ['321楼', '322楼', '323楼']],
    				[['411楼', '412楼', '413楼', '414楼'], ['421楼', '422楼', '423楼', '424楼'], ['431楼', '432楼', '433楼', '434楼'], ['441楼', '442楼', '443楼', '444楼']],
    				[['511楼', '512楼', '513楼', '514楼'], ['521楼', '522楼', '523楼'], ['531楼', '532楼', '533楼', '534楼'], ['541楼', '542楼', '543楼', '544楼']],
    				[['611楼', '612楼', '613楼', '614楼'], ['621楼', '622楼', '623楼', '624楼'], ['631楼', '632楼', '633楼', '634楼'], ['641楼', '642楼', '643楼', '654楼']],
    				[['711楼', '712楼'], ['721楼', '722楼', '723楼'], ['731楼', '732楼', '733楼', '734楼'], ['741楼', '742楼', '743楼', '744楼']]
    			]
    		};
    	},
    	methods: {
    		bindMultiPickerChange(e) {
    			this.multiIndex = e.detail.value;
    			this.areaname = this.multiArray[0][e.detail.value[0]];
    			this.buildingname = this.multiArray[1][e.detail.value[1]];
    			this.floorname = this.multiArray[2][e.detail.value[2]];
    
    			this.nowitem = this.multiArray[0][e.detail.value[0]] + '-' + this.multiArray[1][e.detail.value[1]] + '-' + this.multiArray[2][e.detail.value[2]];
    			console.log('选择了:' + this.nowitem);
    		},
    		bindMultiPickerColumnChange(e) {
    			switch (e.detail.column) {
    				case 0:
    					this.firstid = e.detail.value;
    					if (typeof this.hangdata[this.firstid][this.secondid] == 'undefined') {
    						this.secondid = 0; //当第二列数据没有上一个second列的情况
    					}
    					switch (e.detail.value) {
    						case this.firstid:
    							Vue.set(this.multiArray, 1, this.column1data[this.firstid]);
    							Vue.set(this.multiArray, 2, this.hangdata[this.firstid][this.secondid]); //为了对应第三列关系
    							break;
    						default:
    							break;
    					}
    					break;
    				case 1:
    					this.secondid = e.detail.value;
    					if (typeof this.hangdata[this.firstid][this.secondid][this.thirdid] == 'undefined') {
    						this.thirdid = 0; //当第三列数据没有上一个列的情况
    					}
    					switch (this.firstid) {
    						case this.firstid:
    							switch (this.secondid) {
    								case this.secondid:
    									Vue.set(this.multiArray, 2, this.hangdata[this.firstid][this.secondid]);
    									break;
    								default:
    									break;
    							}
    							break;
    						default:
    							break;
    					}
    				case 2:
    					this.thirdid = e.detail.value;
    					break;
    				default:
    					break;
    			}
    		}
    	}
    };
    </script>
    
    <style lang="less"></style>
    
    
    展开全文
  • 小程序动态数据三级联动

    千次阅读 2018-07-09 10:15:29
    小程序三级组件picker ,后台要维护这些数据,使用的是动态数据 三级选择器,使用的是多列选择,设置mode = multiSelector ,主要把我们的数据放入range中,range是一个二维数组, 既然我们做的是三级联动,按二...

    小程序三级组件picker  ,后台要维护这些数据,使用的是动态数据

    三级选择器,使用的是多列选择,设置 mode = multiSelector  ,主要把我们的数据放入range中,range是一个二维数组

    既然我们做的是三级联动,按二维数组格式[[a,b],[a,b],[]]填入数据即可。因为每个人代码写法不同,主要分享思路

    后台直接给的是一个数组对象数据,每个对象数据都有id和key,第一级数据的所有key为零, 数据对应为一级的id对应二级的key,以此二级id对应三级key,

    1.思路就比较清楚了,先onLoad事件一级数据填入和二三级对应的初始数据

    根据循环判断来获得

    2.主要通过滚动bindchange事件来添加二级和三级数据,滚动的时我们定义一个index数组[0,0,0]放入value来定义滚动时得状态,通过事件中的event来获取状态。我们就能知道滚动到那个数据,事件event.detail.column 能知道滚动几级,使用bindcolumnchange事件是确定后做的逻辑

    3.每次滚动完成及时更新index数组,滚动时获得数据代码,基本类似第一次循环判断来获得,大家有更简洁的实现方法,可以分享

    展开全文
  • 小程序picker三级联动

    千次阅读 2019-01-24 09:56:47
    直接上代码 WXML ... <text>{{multiArray[0][multiIndex[0]].... title: '年级', id: 3 }, { title: '四年级', id: 4 }, { title: '五年级', id: 5 }, { title: '六年级', id: 6 } ] 实现效果

    直接上代码

    WXML

    <picker name="create_id" mode="multiSelector" bindchange="bindMultiPickerChange" bindcolumnchange="bindGradeChange" value="{{multiIndex}}" range="{{multiArray}}" range-key="{{'title'}}">
                <view class='pick-content'>
                  <text>{{multiArray[0][multiIndex[0]].title}},{{multiArray[1][multiIndex[1]].title}},{{multiArray[2][multiIndex[2]].title}}</text>
                </view>
    </picker>

    js

     bindMultiPickerChange: function (e) {
        this.setData({
          multiIndex: e.detail.value
        })
      },
      bindGradeChange(e) {
        console.log('修改的列为', e.detail.column, ',值为', e.detail.value);
        let data = {
          multiArray: this.data.multiArray,
          multiIndex: this.data.multiIndex
        }
        data.multiIndex[e.detail.column] = e.detail.value
        if (e.detail.column == 0) {
          var grade = this.data.multiArray[0][data.multiIndex[0]];
          data.multiArray[1] = this.data.allGrade[grade.id].teams
          data.multiIndex[1] = 0;
          var classes = data.multiArray[1][0];
          let arr = this.data.allStudents[classes.id] ? this.data.allStudents[classes.id] : [];
          data.multiArray[2] = arr
          data.multiIndex[2] = 0
        } else if (e.detail.column == 1) {
          var classes = this.data.multiArray[1][data.multiIndex[1]];
          let arr = this.data.allStudents[classes.id] ? this.data.allStudents[classes.id] : [];
          data.multiArray[2] = arr
          data.multiIndex[2] = 0
        }
        this.setData(data);
      },

    数据格式(以年级为例)

     [    {
            title: '一年级',
            id: 1
          }, {
            title: '二年级',
            id: 2
          }, {
            title: '三年级',
            id: 3
          }, {
            title: '四年级',
            id: 4
          }, {
            title: '五年级',
            id: 5
          }, {
            title: '六年级',
            id: 6
          }
    ]

    实现效果

    展开全文
  • 微信小程序之省市区三级联动

    千次阅读 2018-05-30 12:57:05
    最近接触小程序,使用微信自带的省市区选择器,发现无法满足需求,原因是后台需要省市区国标码发送接口查询数据,微信自带的省市区选择器只有Name,没有国标码,所以只能自定义省市区三级联动选择器,废话不多说,...
  • 微信小程序-自定义三级联动

    千次阅读 2019-05-31 11:55:47
    不像省市区可以直接使用小程序的组件,这边自己定义一个城市-维修站-人员的三级联动效果。 运用picker组件,设置mode 的合法值为multiSelector(多列选择器); 其中range是一个二维数组,只要按二维数组格式[[]...
  • 微信小程序 三级联动省市区

    千次阅读 2017-06-07 18:39:31
    微信小程序 三级联动
  • 微信小程序 三级菜单

    千次阅读 2018-11-15 15:35:46
    微信小程序实现三级菜单真的很简单,使用的组件是picker,我们看下它的官网描述: 从底部弹起的滚动选择器,现支持五种选择器,通过mode来区分,分别是普通选择器,多列选择器,时间选择器,日期选择器,省市区选择器...
  • 小程序三级菜单

    千次阅读 2018-05-09 21:37:39
    程序: 三级菜单要求: 打印省、市、县三级菜单可返回上一级可随时退出程序menu = { '北京':{ '海淀':{ '五道口':{ 'soho':{}, '网易':{}, 'google':{} }, ...
  • 微信小程序的省市区三级联动需要使用到的是Picker多列选择器,参考文档:https://www.w3cschool.cn/weixinapp/d9mw1q95.html, 案例中用到的省市区的json文件在文后发出出来。 废话不多说,来看看具体地实现吧。 ...
  • 微信小程序三级分销商城,团购,秒杀……php+mysql附带安装视频
  • 微信小程序开发-三级联动地址选择器开发教程
  • 这不,最近项目中有个需求是 省市区三级联动 ,我就顺便从组件库中的第一个 「扩展日期-时间(点此直接至GitHub)」picker组件开始说一下这两个功能的实现。 简单说一下“自定义日期-时间组件” 它的背景是项目的第...
  • 这套源码在某宝卖300元,好评众多。 商城 V3 商业版
  • wxml &amp;lt;view bindtap='selectDistrict' wx:if='{{areaInfo}}'&...-- 三级联动 --&amp;gt; &amp;lt;view class='shadow' hidden='{{addressMenuIsShow != true}}'&amp;gt;&amp;lt
  • 二级级联效果三级联动效果 二级联动和三级联动的代码结构都是一样,就看要怎么设置。接下来上三级联动的代码。 wxml &lt;view class="picker-box"&gt; &lt;view class='skill-picker'&...
  • 小程序销毁中间页面(三级跳转设置)

    千次阅读 2019-04-27 00:11:43
    操作前景 列表页(A)->详情页(B)->选择服务页©,现在需要的是C->B之后,点返回按钮不能在出现C页面 ...曾经的解决方法(缺陷:如果小程序进入时只有1-2页,在点返回时会出现小程序进程退掉的BUG!!!
  • 目前学习小程序更多的是看看能否二次封装其它组件,利于以后能快速开发各种小程序应用。目前发现picker的selector模式只有一级下拉,那么我们是否可以通过3个picker来实现三级联动模板的形式来引入其它页面中呢?...
  • 微信小程序 选择地址省市区三级联动

    千次阅读 热门讨论 2018-12-27 16:15:15
    微信原生地址API,缺少省市区code,因此自己写了一个收货地址 思路:在onload预先加载全部省和第一个省的全部市和区,加载全部会导致几秒的事件阻塞。点击选择地址弹窗后,按需加载操作,滑动省加载对应的市和第一...
  • 微信小程序-估价系统-车辆品牌款式等-三级菜单 车标 省份-城市-二级菜单 (二三级菜单首先考虑使用微信小程序的数据缓存,但在不刷新的情况下缓存数据永远是上一次保存的。 今天更新了微信小程序开发工具版本,...
  • 突击微信小程序,由于公司有自定义的地区码,网上的一些demo不能使用,所以根据前辈们demo的原理自己写了一篇,由于本人非前端,代码未必规范,有问题请留言
  • 不少项目还是有地址的填写需求,根据支付宝小程序现有提供的组件以及api,完全是可以实现填写地址的需求,比如分别获取省市区,通过地图来获取地址等,但是有些人肯定还是想要省市区三级选择器来选择地址范围。...
  • 由于小程序提供的picker组建是它内部提供的,并没有提供替换的数据的接口,遂用小程序提供的多列选择器 后台获取的数据结构是这样的{ “level”: “success”, “message”: “获取成功”, “data”: [ { “name”: ...
  • 项目的三级分销功能 表格设计(1) 1.每一个用户只有一个上级   分销系统 Distribution 分销表格 Id userid oid time   邀请人 被...
  • 部分代码来自:http://blog.csdn.net/qq_38125123/article/details/75043607我主要是把静态的地址库文件改成动态从数据库读取,以下是小程序的代码:wxml:&lt;view&gt; &lt;label class='xLab'&gt...
  • //json是根据服务器查询到的带有三级地址的值。根据值去查找索引,再一一设定下一级的值。  console.log("地址信息json:")  console.log(json)  //保存信息  console.log(str + "长度" + json.length)  ...
  • 省市区三级联动,选择省自动刷新市,选择市自动刷新区,点击取消自动返回上一级重新选择,点击确定,保存地址。 数据库 这份数据库是某天在网上逛到的,当时未记录出处,直接贴出给读者使用,实在不妥,此处仅贴...
  • 微信小程序之下拉菜单的三级联动筛选框

    万次阅读 热门讨论 2018-08-26 13:03:57
    感谢作者小小小是我提供了资料,在此做了二次开发,也分享一下,因为自己最近也需要写个小程序的下拉框的三级菜单筛选,分享给有需要的人哈。 (一)、实现效果 1、原作者资料的实现效果:点击跳转微信小程序仿...
  • 前两天用小程序做项目,需要从数据库里取数据来实现三级联动 wxml里使用组件: <picker mode="multiSelector" bindchange="bindMultiPickerChange" bindcolumnchange="bindMultiPickerColumnChange" value="{{...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 881,440
精华内容 352,576
关键字:

三级小程序