vant picker+popup 自定义三级联动案例


Posted in Javascript onNovember 04, 2020

picker选择器的数据由columns属性控制,columns中有几个元素就代表该选择器有多少级,通过change方法来给对应列赋值。

columns = [{
    values: column1, // 对应列的值
    defaultIndex: 0, // 默认选中项索引
    className: 'class1' // 对应列的类名 
  },
  {
    values: [],
    defaultIndex: 0,
    className: 'class2'
  },
  {
    values: [],
    defaultIndex: 0,
    className: 'class3'
  }
];

demo

<template>
<div class="form">
  <van-row type="flex" justify="center" align="center" style="padding-top:10px">
    <van-col span="5" class="text">自定义三级联动</van-col>
    <van-col span="19">
      <van-field v-model="student" placeholder="请选择" @click="stuShow = true" :readonly="true" />
    </van-col>
  </van-row>
  <!-- 底部弹出 -->
  <van-popup v-model="stuShow" position="bottom" :style="{ height: '40%' }">
    <van-picker :columns="stuLoad" @confirm="stuConfirm" @change="stuChange" @cancel="stuShow = false" show-toolbar />
  </van-popup>
</div>
</template>

<script>
export default {
  name: "Form",
  data() {
    return {
      student: '',
      stuShow: false,
      stuLoad: [],
      stuColumn1: [],
      stuColumn2: [],
      stuColumn3: []
    };
  },
  created() {
    this.makeData(); // 页面加载时给选择框赋初始值
  },
  methods: {
    makeData() { // 模拟数据,生产环境用axios获取数据
      let column1 = [{
        'kid': 0,
        'text': '请选择'
      }, {
        'kid': 1,
        'text': '一年级'
      }, {
        'kid': 2,
        'text': '二年级'
      }];
      let column2 = {
        '1': [{
          'kid': 1,
          'text': '一组'
        }, {
          'kid': 2,
          'text': '二组'
        }, {
          'kid': 3,
          'text': '三组'
        }],
        '2': [{
          'kid': 4,
          'text': '四组'
        }, {
          'kid': 5,
          'text': '五组'
        }]
      }
      let column3 = {
        '1': [{
          'kid': 1,
          'text': '小明'
        }, {
          'kid': 2,
          'text': '小红'
        }, {
          'kid': 3,
          'text': '小刚'
        }],
        '2': [{
          'kid': 4,
          'text': 'Amy'
        }, {
          'kid': 5,
          'text': 'Sam'
        }],
        '3': [{
          'kid': 4,
          'text': 'Sion'
        }, {
          'kid': 5,
          'text': 'Juno'
        }],
        '4': [{
          'kid': 6,
          'text': 'Lucy'
        }, {
          'kid': 7,
          'text': 'Tom'
        }],
        '5': [{
          'kid': 6,
          'text': 'Iwan'
        }]
      }
      let columns = [];
      columns = [{
          values: column1,
          defaultIndex: 0 //默认选中项索引
        },
        {
          values: [],
          defaultIndex: 0
        },
        {
          values: [],
          defaultIndex: 0
        }
      ];
      this.stuColumn2 = column2;
      this.stuColumn3 = column3;
      this.stuLoad = columns;
    },
    stuConfirm(value, index) { // 下方弹出层点击确认时触发
      // value为各列选中值
      // index为各列选中的索引
      if (index.indexOf(0) > -1) {
        alert('请选择');
      } else {
        let content = value[0]['text'] + ' / ' + value[1]['text'] + ' / ' + value[2]['text'];
        this.student = content;
        this.stuShow = false;
      }
    },
    stuChange(picker, value, index) { // 选择器改变时触发
      // Picker 实例
      // value为当前选中值
      // index为当前列对应的索引,第一列index为0,第二列index为1,依次列推
      if (index == 0) { // 改变第一列的值
        let i = value[0]['kid'];
        let item = this.stuColumn2[i] ? this.stuColumn2[i] : [];
        if (item && item[0]['text'] != '请选择') {
          item.unshift({
            'kid': 0,
            'text': '请选择'
          })
        }
        picker.setColumnValues(1, item); // 给对应的列赋值,第一个参数为列的index值,第二个参数为列的values
      } else if (index == 1) {
        let i = value[1]['kid'];
        let item = this.stuColumn3[i] ? this.stuColumn3[i] : [];
        if (item.length != 0 && item[0]['text'] != '请选择') {
          item.unshift({
            'kid': 0,
            'text': '请选择'
          })
        }
        picker.setColumnValues(2, item);
      }
    }
  }
};
</script>

<style scoped>
.text {
  text-align: right;
}
</style>

补充知识:vue vant-picker选择器的使用,及数据结构的写法

vant-picker组件columns属性接收的是一个数组,如官方例子中:

vant picker+popup 自定义三级联动案例

它的数组是子项是一个简单是字符,但通常我们真实的数据子项都是对象,如:

colums:[ {name:'张三',age:18},{name:'李四',age:28}]

那么像这样的数组该怎么显示呢, vant-picker的value-key属性就是解决这个问题的,如我要使用上面的数组,那么vant-picker

就是这样

vant picker+popup 自定义三级联动案例

另外,如果数组中的子项含有键名为'text',那么value-key也可以不用设置,组件会默认取这个键名,如colums:[ {text:'张三',age:18},{text:'李四',age:28}]

以上这篇vant picker+popup 自定义三级联动案例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
在JavaScript中通过URL传递汉字的方法
Apr 09 Javascript
jQuery Trim去除字符串首尾空字符的实现方法说明
Feb 11 Javascript
使用insertAfter()方法在现有元素后添加一个新元素
May 28 Javascript
浅谈jQuery操作类数组的工具方法
Dec 23 Javascript
JavaScript 事件对内存和性能的影响
Jan 22 Javascript
jquery.uploadView 实现图片预览上传功能
Aug 10 jQuery
VUE实现一个分页组件的示例
Sep 13 Javascript
微信小程序实时聊天WebSocket
Jul 05 Javascript
JS实现数组去重,显示重复元素及个数的方法示例
Jan 21 Javascript
微信小程序五子棋游戏的悔棋实现方法【附demo源码下载】
Feb 20 Javascript
微信小程序实现日历签到
Sep 21 Javascript
vue 封装面包屑组件教程
Nov 16 Javascript
解决vue-pdf查看pdf文件及打印乱码的问题
Nov 04 #Javascript
vantUI 获得piker选中值的自定义ID操作
Nov 04 #Javascript
浅谈vant组件Picker 选择器选单选问题
Nov 04 #Javascript
vue项目打包后请求地址错误/打包后跨域操作
Nov 04 #Javascript
原生JavaScript实现贪吃蛇游戏
Nov 04 #Javascript
通过实例解析javascript Date对象属性及方法
Nov 04 #Javascript
解决vue项目打包上服务器显示404错误,本地没出错的问题
Nov 03 #Javascript
You might like
PHP实现检测客户端是否使用代理服务器及其匿名级别
2015/01/07 PHP
jQuery Tools tab使用介绍
2012/07/14 Javascript
JSON格式化输出
2014/11/10 Javascript
Node.js抓取中文网页乱码问题和解决方法
2015/02/10 Javascript
jQuery异步上传文件插件ajaxFileUpload详细介绍
2015/05/19 Javascript
老生常谈JavaScript数组的用法
2016/06/10 Javascript
使用bootstrapValidator插件进行动态添加表单元素并校验
2016/09/28 Javascript
easyui-edatagrid.js实现回车键结束编辑功能的实例
2017/04/12 Javascript
利用JS实现简单的瀑布流加载图片效果
2017/04/22 Javascript
微信小程序开发animation心跳动画效果
2017/08/16 Javascript
vue2单元测试环境搭建
2018/05/24 Javascript
ajaxfileupload.js实现上传文件功能
2019/04/19 Javascript
vue 源码解析之虚拟Dom-render
2019/08/26 Javascript
JavaScript实现抖音罗盘时钟
2019/10/11 Javascript
详解js中的几种常用设计模式
2020/07/16 Javascript
OpenLayers3实现测量功能
2020/09/25 Javascript
原生js+canvas实现验证码
2020/11/29 Javascript
[02:51]DOTA2 Supermajor小组分组对阵抽签仪式
2018/06/01 DOTA
python将html转成PDF的实现代码(包含中文)
2013/03/04 Python
Python中使用动态变量名的方法
2014/05/06 Python
Python求解任意闭区间的所有素数
2018/06/10 Python
Tensorflow限制CPU个数实例
2020/02/06 Python
python使用pymongo与MongoDB基本交互操作示例
2020/04/09 Python
HTML5里autofocus自动聚焦属性使用介绍
2016/06/22 HTML / CSS
详解HTML5中垂直上下居中的解决方案
2017/12/20 HTML / CSS
美国领先的奢侈手表在线零售商:WatchMaxx
2017/12/17 全球购物
ZWILLING双立人英国网上商店:德国刀具锅具厨具品牌
2018/05/15 全球购物
神路信息Java面试题目
2013/03/31 面试题
优秀员工自荐信范文
2013/10/05 职场文书
毕业生求职信
2014/06/10 职场文书
企业群众路线教育实践活动心得体会
2014/11/03 职场文书
2014年幼儿园后勤工作总结
2014/11/10 职场文书
学习新党章心得体会2016
2016/01/15 职场文书
七年级作文之《我和我的祖国》观后感作文
2019/10/18 职场文书
Android 界面一键变灰 深色主题工具类
2022/04/28 Java/Android
python实现学生信息管理系统(面向对象)
2022/06/05 Python