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 TO HTML 转换
Jun 26 Javascript
JQuery扩展插件Validate—6 radio、checkbox、select的验证
Sep 05 Javascript
Javascript创建自定义对象 创建Object实例添加属性和方法
Jun 04 Javascript
jquery图片放大镜功能的实例代码
Mar 26 Javascript
javascript中的=等号个数问题两个跟三个有什么区别
Oct 23 Javascript
Extjs Label的 fieldLabel和html属性值对齐的方法
Jun 15 Javascript
谈一谈bootstrap响应式布局
May 23 Javascript
手机端转换rem适应
Apr 01 Javascript
Ionic2开发环境搭建教程
Aug 20 Javascript
JS块级作用域和私有变量实例分析
May 11 Javascript
基于JavaScript 实现拖放功能
Sep 12 Javascript
微信小程序开发中var that =this的用法详解
Jan 18 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中几种常见安全设置详解
2010/04/06 PHP
PHP将页面中点击数量高的链接进行高亮显示的方法
2016/05/30 PHP
PHPExcel在linux环境下导出报500错误的解决方法
2017/01/26 PHP
PHP实现数组转JSon和JSon转数组的方法示例
2018/06/14 PHP
PHP 出现 http500 错误的解决方法
2021/03/09 PHP
[全兼容哦]--实用、简洁、炫酷的页面转入效果loing
2007/05/07 Javascript
jQuery select操作控制方法小结
2010/05/26 Javascript
关于jquery ajax 调用带参数的webservice返回XML数据一个小细节
2012/07/31 Javascript
主页面中的两个iframe实现鼠标拖动改变其大小
2013/04/16 Javascript
javascript查找字符串中出现最多的字符和次数的小例子
2013/10/29 Javascript
Node.js异步I/O学习笔记
2014/11/04 Javascript
node.js中的fs.close方法使用说明
2014/12/17 Javascript
Bootstrap与KnockoutJs相结合实现分页效果实例详解
2016/05/03 Javascript
JavaScript比较当前时间是否在指定时间段内的方法
2016/08/02 Javascript
相册展示PhotoSwipe.js插件实现
2016/08/25 Javascript
json定义及jquery操作json的方法
2016/09/29 Javascript
有关JS中的0,null,undefined,[],{},'''''''',false之间的关系
2017/02/14 Javascript
详解在Angular4中使用ng2-baidu-map的方法
2019/06/19 Javascript
通过循环优化 JavaScript 程序
2019/06/24 Javascript
JavaScript和TypeScript中的void的具体使用
2019/09/12 Javascript
JS如何把字符串转换成json
2020/02/21 Javascript
vue+element-ui表格封装tag标签使用插槽
2020/06/18 Javascript
Python实现模拟登录网易邮箱的方法示例
2018/07/05 Python
numpy的文件存储.npy .npz 文件详解
2018/07/09 Python
Python实现的文轩网爬虫完整示例
2019/05/16 Python
英国历史最悠久的DJ设备供应商:DJ Finance、DJ Warehouse、The DJ Shop
2019/09/04 全球购物
医院总经理职责
2013/12/26 职场文书
活动宣传策划方案
2014/05/23 职场文书
艺术学院毕业生自荐信
2014/07/05 职场文书
2014年公务员退休工资改革方案
2014/10/01 职场文书
2015年度党风廉政建设工作情况汇报
2015/01/02 职场文书
2016年乡镇七一建党节活动总结
2016/04/05 职场文书
2019年亲子运动会口号
2019/10/11 职场文书
Python爬虫:从m3u8文件里提取小视频的正确操作
2021/05/14 Python
Java比较两个对象中全部属性值是否相等的方法
2021/08/07 Java/Android
mysql查看表结构的三种方法总结
2022/07/07 MySQL