mui多层级选择器picker踩坑

博主在使用mui前端框架做项目时,发现省市区三级联动选择器存在bug。按官方文档用setSelectedValue()方法设置选中值无效,多级选择器初始化时仅第一级生效。给出两种解决办法,一是用定时器,二是修改picker.js源码,还记录了参考链接。

最近用mui做项目,虽然号称最接近原生APP体验的高性能前端框架,但依然有bug,并且特别明显。
做省市区三级联动选择器时,按照官方文档提供的方法设置picker的选中值,一种是通过setSelectedIndex()方法,另一种是setSelectedValue()方法,使用第一种通过索引的时候没有问题,但是第二种通过值来设定的时候设置无效。
使用setSelectedIndex()方法设置如下:

var picker = new mui.PopPicker();
picker.setData([{
   value: "first",
   text: "第一项",
}, {
   value: "second",
   text: "第一项"
}, {
   value: "third",
   text: "第三项"
}, {
   value: "fourth",
   text: "第四项"
}, {
   value: "fifth",
   text: "第五项"
}])
picker.pickers[0].setSelectedIndex(4, 2000);

使用setSelectedValue()方法设置如下:

picker.pickers[0].setSelectedValue('fourth',200)

如果是单级选择器这样设置是没有问题的,但是多级选择器在刚进入页面初始化的时候这样设置便只有第一级生效,第二级、第三级不生效,如下市、区是不生效的:

// 设定省初始值  
cityPicker.pickers[0].setSelectedValue("320000");  
// 设定市初始值  
cityPicker.pickers[1].setSelectedValue("320200");  
// 设定区初始值  
cityPicker.pickers[2].setSelectedValue("320205");  

解决办法
一:使用定时器

 setTimeout(function () {
        self.cityPicker.pickers[1].setSelectedValue(self.city);
        setTimeout(function () {
            self.cityPicker.pickers[2].setSelectedValue(self.district);
            console.log(self.cityPicker.getSelectedItems());
        });
    });

二:修改源码
对picker.js的代码进行修改。主要是修改了triggerChange部分的功能函数

Picker.prototype.triggerChange = function(callback) {  
        var self = this;  
        var index = self.getSelectedIndex();  
        var item = self.items[index];  

        if(index != self.lastIndex) {  
            $.trigger(self.holder, 'change', {  
                "index": index,  
                "item": item  
            });  
        }  
        self.lastIndex = index;  
        typeof callback === 'function' && callback();  
    };  

方法二参考链接,没有做验证,在此先记录下。

原文作者技术博客:https://www.jianshu.com/u/ac4daaeecdfe
95后前端妹子一枚,爱阅读,爱交友,将工作中遇到的问题记录在这里,希望给每一个看到的你能带来一点帮助。
欢迎留言交流

### 关于 MUI Picker 的使用方法 MUI 提供了一个简单易用的选择器组件 `Picker`,可以用于创建弹出式的选项选择界面。以下是其基本使用方法以及示例代码。 #### 导入必要的 JS 和 CSS 文件 为了正常使用 MUI Picker 功能,需确保页面中已正确引入所需的 JavaScript 和样式文件[^2]: ```html <script src="js/mui.min.js"></script> <link href="css/mui.min.css" rel="stylesheet" /> <link href="css/mui.picker.css" rel="stylesheet" /> <link href="css/mui.poppicker.css" rel="stylesheet" /> ``` #### 创建并初始化 PopPicker 实例 通过调用 `new mui.PopPicker()` 方法来创建一个新的选择器实例,并设置数据源和回调函数处理选中的项[^1]。 以下是一个完整的示例代码片段展示如何配置和显示一个简单的单列选择器: ```javascript var picker = new mui.PopPicker(); picker.setData([{ value: 'zz', text: '智子' }]); picker.show(function (selectItems) { console.log(selectItems[0].text); // 输出:智子 console.log(selectItems[0].value); // 输出:zz }); ``` 此段代码实现了如下功能: - 使用 `setData` 方法定义可供用户选择的数据列表。 - 调用 `show` 方法触发选择器弹窗的显示。 - 当用户完成选择后,会执行传给 `show` 方法的回调函数,在其中可以通过参数获取到被选中的条目及其对应的值与描述文字。 #### 多列联动选择器 如果需要更复杂的功能比如多级联动态加载,则可以在初始化时指定多个数组作为不同列的内容来源,并监听某些特定事件来自定义行为逻辑。不过这超出了基础使用的范畴,这里不再展开说明。 对于更加复杂的移动端场景需求,还可以考虑第三方库如 **react-mobile-picker**[^3] ,它提供了仿 iOS 风格的选择框效果,适合构建跨平台应用或者追求更高定制化程度的应用程序。 另外值得注意的是,在实际项目开发过程中可能会遇到兼容性问题特别是针对不同的操作系统版本情况下的表现差异。例如有开发者反馈过 uni-app 平台下 datetime 类型插件存在 IOS 设备上的适配难题[^5] 。因此建议测试阶段充分覆盖目标受众群体所使用的各类终端设备环境以保证最终产品的用户体验质量达到预期标准。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值