Vant picker 多级联动操作


Posted in Javascript onNovember 02, 2020

官网地址:链接

官网文档可能不是很完善,但仔细看文档,方法,类型其实都讲到的。

度娘也没有找到,花了大半天爬坑试错。

搭配弹出层使用

Vant picker 多级联动操作

Vant picker 多级联动操作

Vant picker 多级联动操作

<van-field readonly clickable placeholder="选择城市" :value="station" @click="showPicker = true" />

<van-popup v-model="showPicker" position="bottom">
<van-picker show-toolbar :columns="columns" @cancel="showPicker = false" @confirm="onConfirm" @change="onChange" />
</van-popup>
const citys = [ // 我们习惯的格式。 可以后台给你出,如果你打不过的话,你就。。。
 {
  text: "测试一", // 默认识别text标签
  id: 1,
  children: [
   {
    id: 11,
    text: "测试1-1",
    children: [
     {
      id: 111,
      text: "测试1-1-1"
     },
     {
      id: 112,
      text: "测试1-1-2"
     }
    ]
   },
   {
    id: 12,
    text: "测试1-2",
    children: [
     {
      id: 122,
      text: "测试1-2-1"
     },
     {
      id: 122,
      text: "测试1-2-2"
     }
    ]
   },
   {
    id: 13,
    text: "测试1-3"
   }
  ]
 },
 {
  text: "测试二",
  id: 2,
  children: [
   {
    id: 21,
    text: "测试2",
    children: [
     {
      id: 221,
      text: "测试2-2-1"
     },
     {
      id: 222,
      text: "测试2-2-2"
     }
    ]
   },
   {
    id: 22,
    text: "测试2"
   },
   {
    id: 23,
    text: "测试2"
   }
  ]
 },
 {
  text: "测试三",
  id: 3,
  children: [
   {
    id: 31,
    text: "测试3",
    children: [
     {
      id: 311,
      text: "测试3-1-1"
     },
     {
      id: 312,
      text: "测试3-3-2"
     }
    ]
   },
   {
    id: 32,
    text: "测试3"
   },
   {
    id: 33,
    text: "测试3"
   }
  ]
 }
];

 data(){
  return {
   station: "",
   showPicker: false,
   columns: [
    {
     values: citys, // 设置的页面初始值
     className: "column1"
    },
    {
     values: citys[0].children,
     className: "column2"
    },
    {
     values: citys[0].children[0].children,
     className: "column3"
    }
   ],
 } 
 }; 

  onConfirm(value) {
   const compact = arr => arr.filter(Boolean); // 三级联动 去除没值的,比如只有两级
   const result = compact(value);
   let str = ""; // 呈现页面显示 /xxx/xxx/xxx
   result.forEach(item => {
    str += "/" + item.text;
   });
   this.station = str;
   this.showPicker = false;
   
  const end = result[result.length - 1]; // 一般都是取最后一个id给后台的
   const id = end.id;
   console.log(id);
  },
  onChange(picker, values, index) { // 实在不行自己打印测试
   if (index == 0) {
    picker.setColumnValues(2, []); // 防止突然选中第一个,第二个是更新的,但第三个联级不更新,我暂时强制清空
   }
   let ColumnIndex = picker.getColumnIndex(index);
   console.log("第" + index + "列", "第" + ColumnIndex + "个");
   picker.setColumnValues(index + 1, values[ColumnIndex ].children || []);//点当前列更新下一列数据,防止undefined 
   
 // 当然,如果后台数据不给你想要的格式,你就按需请求一次了,比如选中第一个,取id请求接口,更新下一列。毕竟连动内容多的话,页面请求也多。但页面就不流畅,比如第一列第二列初始值。 
  // 我就是打不过后台。。。
  }

补充知识:【vant】配合 van-popup 使用 van-picker 多级联动,回显赋默认值 遇到的坑及解决方案

先吐槽一句,van-picker 真心不怎么好用。。。

页面大概是这个样子:

Vant picker 多级联动操作

代码结构大概是这个样子:

<!-- 选择 收支类型弹窗 -->
<van-popup ref = "accountTypePopup" v-model="showPicker" position="bottom">
  <van-picker
    ref = "accountTypePopup2"
    show-toolbar
    :columns="columns"
    @cancel="showPicker = false"
    @confirm="onConfirm"
    @change="onChange"
    
  />
</van-popup>
methods: {
  // ...
  // 修改 columns 方法
  changeColumns(p_name, name) {
    // p_name 一级分类回显值
    // name 二级分类回显值
    
    // 类型列表
    var typeList =
      this.tabActive === 0
        ? this.expendTypeList
        : this.incomeTypeList;
 
    // 设置 收支类型选项 columns 的默认值 和 子选项
    this.columns[0]["defaultIndex"] = this.columns[0][
      "values"
    ].findIndex(item => item === p_name);
 
    this.columns[1]["values"] = typeList[p_name];
 
    this.columns[1]["defaultIndex"] = this.columns[1][
      "values"
    ].findIndex(item => item === name);
  }
}

期望是:popup弹出后,picker选中用户已经选中的选项

结果是:仅第一次popup弹出后,picker选中用户已经选中的选项,之后的弹出一直展示第一次的列表

查看文档,解决方案是用van-picker的方法:

Vant picker 多级联动操作

坑就坑中,组件嵌套(popup套picker),用ref获取不到 picker 实例

咋整?

用调试工具调试了半天发现,picker实例化成DOM元素后,即使隐藏,也仅仅是display:none,不会重新实例化

那就好办了。。。

<!-- 选择 收支类型弹窗 -->
<van-popup ref = "accountTypePopup" v-model="showPicker" position="bottom">
  <van-picker
    ref = "accountTypePopup2"
    show-toolbar
    :columns="columns"
    @cancel="showPicker = false"
    @confirm="onConfirm"
    @change="onChange"
 
    // 这里是新加的 //
    :key = "account_type_value"
    
  />
</van-popup>

添加一个key属性,值为【一级项+二级项】,问题圆满解决!!!

以上这篇Vant picker 多级联动操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript 词法作用域和闭包分析说明
Aug 12 Javascript
javascript处理表单示例(javascript提交表单)
Apr 28 Javascript
Javascript闭包用法实例分析
Jan 23 Javascript
js判断文本框输入的内容是否为数字
Dec 23 Javascript
JavaScript登录验证码的实现
Oct 27 Javascript
整理关于Bootstrap排版的慕课笔记
Mar 29 Javascript
JavaScript运动框架 链式运动到完美运动(五)
May 18 Javascript
vue.js实现价格格式化的方法
May 23 Javascript
jQuery分组选择器简单用法示例
Apr 04 jQuery
jQuery层叠选择器用法实例分析
Jun 28 jQuery
Vue鼠标滚轮滚动切换路由效果的实现方法
Aug 04 Vue.js
浅谈JavaScript作用域
Dec 06 Javascript
vue实现列表拖拽排序的功能
Nov 02 #Javascript
用vue写一个日历
Nov 02 #Javascript
在vue中使用vant TreeSelect分类选择组件操作
Nov 02 #Javascript
vant自定义二级菜单操作
Nov 02 #Javascript
JavaScript动态生成表格的示例
Nov 02 #Javascript
JavaScript实现图片放大预览效果
Nov 02 #Javascript
解决antd 表单设置默认值initialValue后验证失效的问题
Nov 02 #Javascript
You might like
PHP图像裁剪缩略裁切类源码及使用方法
2016/01/07 PHP
PHP并发查询MySQL的实例代码
2017/08/09 PHP
PHP后期静态绑定之self::限制实例分析
2018/12/21 PHP
Javascript的IE和Firefox兼容性汇编
2006/07/01 Javascript
extjs form textfield的隐藏方法
2008/12/29 Javascript
js实现无缝循环滚动
2020/06/23 Javascript
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
2016/12/14 Javascript
JS数组排序方法实例分析
2016/12/16 Javascript
ES6中Math对象新增的方法实例详解
2017/04/25 Javascript
详解如何使用webpack+es6开发angular1.x
2017/08/16 Javascript
基于js实现逐步显示文字输出代码实例
2020/04/02 Javascript
[00:47]TI7不朽珍藏III——沙王不朽展示
2017/07/15 DOTA
使用Python的Supervisor进行进程监控以及自动启动
2014/05/29 Python
wxPython事件驱动实例详解
2014/09/28 Python
python回调函数用法实例分析
2015/05/09 Python
pandas 使用均值填充缺失值列的小技巧分享
2019/07/04 Python
python实现证件照换底功能
2019/08/20 Python
Django实现基于类的分页功能
2019/10/31 Python
Python轻量级web框架bottle使用方法解析
2020/06/13 Python
Python多线程threading创建及使用方法解析
2020/06/17 Python
python爬虫使用scrapy注意事项
2020/11/23 Python
详解HTML5常用的语义化标签
2019/09/27 HTML / CSS
北美最大的参茸药食商城:德成行
2020/12/06 全球购物
入党申请书自我鉴定
2013/10/12 职场文书
写给女朋友的道歉信
2014/01/12 职场文书
招聘单位介绍信
2014/01/14 职场文书
体育专业学生自我评价范文
2014/01/17 职场文书
公司前台辞职报告
2014/01/19 职场文书
师范学院美术系毕业生自我鉴定
2014/01/29 职场文书
商铺门面租房协议书
2014/10/21 职场文书
世界地球日活动总结
2015/02/09 职场文书
餐饮店长岗位职责
2015/04/14 职场文书
初中化学教学反思
2016/02/22 职场文书
.Net Core导入千万级数据至Mysql的步骤
2021/05/24 MySQL
mysql5.5中文乱码问题解决的有用方法
2022/05/30 MySQL
Redis sentinel哨兵集群的实现步骤
2022/07/15 Redis