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实现多维数组的方法
Nov 20 Javascript
jquery form 隐藏的input 选择
Apr 29 Javascript
javascript面向对象之访问对象属性的两种方式分析
Jan 13 Javascript
js中对函数设置默认参数值的3种方法
Oct 23 Javascript
jQuery中ajax的load()与post()方法实例详解
Jan 05 Javascript
Bootstrap组件系列之福利篇几款好用的组件(推荐二)
Jul 12 Javascript
Angular2数据绑定详解
Apr 18 Javascript
vue loadmore 组件滑动加载更多源码解析
Jul 19 Javascript
Bootstrap4 gulp 配置详解
Jan 06 Javascript
Vue项目引发的「过滤器」使用教程
Mar 12 Javascript
基于node+vue实现简单的WebSocket聊天功能
Feb 01 Javascript
JavaScript中跨域问题的深入理解
Mar 04 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
手把手教你使用DedeCms的采集的图文教程
2007/03/11 PHP
PHP生成HTML静态页面实例代码
2008/08/31 PHP
检测png图片是否完整的php代码
2010/09/06 PHP
php中将数组存到文件里的实现代码
2012/01/19 PHP
yii的CURD操作实例详解
2014/12/04 PHP
php版微信公众平台入门教程之开发者认证的方法
2016/09/26 PHP
PHP+mysql实现从数据库获取下拉树功能示例
2017/01/06 PHP
PHP信号处理机制的操作代码讲解
2019/04/19 PHP
Jquery对数组的操作技巧整理
2014/03/25 Javascript
使用javascript实现json数据以csv格式下载
2015/01/09 Javascript
JS+CSS实现电子商务网站导航模板效果代码
2015/09/10 Javascript
基于jQuery1.9版本如何判断浏览器版本类型
2016/01/12 Javascript
JS实现超简单的汉字转拼音功能示例
2016/12/22 Javascript
vue的传参方式汇总和router使用技巧
2018/05/22 Javascript
JS实现点击按钮可实现编辑功能
2018/07/03 Javascript
Ajax请求时无法重定向的问题解决代码详解
2019/06/21 Javascript
微信小程序拼接图片链接无底洞深入探究
2019/09/03 Javascript
Vue Object.defineProperty及ProxyVue实现双向数据绑定
2020/09/02 Javascript
vue使用canvas实现移动端手写签名
2020/09/22 Javascript
Python简单实现的代理服务器端口映射功能示例
2018/04/08 Python
Python使用cx_Oracle模块操作Oracle数据库详解
2018/05/07 Python
用python标准库difflib比较两份文件的异同详解
2018/11/16 Python
flask-restful使用总结
2018/12/04 Python
在python中将字符串转为json对象并取值的方法
2018/12/31 Python
python数据持久存储 pickle模块的基本使用方法解析
2019/08/30 Python
基于OpenCV的网络实时视频流传输的实现
2020/11/15 Python
联想C++笔试题
2012/06/13 面试题
新闻专业个人自我评价
2013/09/21 职场文书
领导的自我鉴定
2013/12/28 职场文书
《大作家的小老师》教学反思
2014/04/16 职场文书
国土资源局开展党的群众路线教育实践活动整改措施
2014/09/26 职场文书
党的群众路线教育实践活动自我剖析材料
2014/10/08 职场文书
2014年干部作风建设总结
2014/10/23 职场文书
2015年安全保卫工作总结
2015/05/14 职场文书
《女娲补天》读后感5篇
2019/12/31 职场文书
基于Python实现流星雨效果的绘制
2022/03/18 Python