el-cascade设置默认值遇到的坑!

Element-UI 在项目中的使用极大的提高了页面的开发效率,但是有些细节可能会让人掉到坑里,当然,今天这个坑不是Element带来的,而是 js 的数据类型不同造成的。


场景:cascade 中的两套选项值来源于不同的接口,

第一套选项:
let options = [
{
value: "495",
label: "家政服务",
children: [
{ value: "96", label: "搬家", children: null },
{ value: "102", label: "生活配送", children: null },
{ value: "497", label: "房屋维修/防水", children: null },
{ value: "498", label: "管道疏通/清洗", children: null },
{ value: "511", label: "家具维修", children: null },
{ value: "1818", label: "开锁/换锁/修锁", children: null }
]
},
{
value: "534",
label: "商务服务",
children: [
{ value: "97", label: "快递", children: null },
{ value: "212", label: "货运物流", children: null },
{ value: "789", label: "货运专线", children: null },
{ value: "1819", label: "建筑维修", children: null }
]
}
];
第二套选项:
let options = [
{
children: [
{ label: "保姆/月嫂", value: 95 },
{ label: "搬家", value: 96 },
{ label: "生活配送", value: 102 },
{ label: "电脑维修", value: 111 },
{ label: "保洁清洗", value: 168 },
{ label: "家电维修", value: 203 },
{ label: "鲜花绿植", value: 484 }
],
label: "家政服务",
value: 495
},
{
children: [
{ label: "快递", value: 97 },
{ label: "工商注册", value: 125 },
{ label: "印刷包装", value: 128 },
{ label: "网站建设/推广", value: 130 },
{ label: "设计策划", value: 199 },
{ label: "货运物流", value: 212 },
{ label: "办公设备维修", value: 309 },
{ label: "财务会计/评估", value: 504 },
{ label: "商标专利", value: 505 },
{ label: "礼品定制", value: 1979 }
],
label: "商务服务",
value: 534
}
];
这两个结果有相同的数据格式,所以传给el-cascade的options都能显示正常
<el-cascader expand-trigger="hover"
                 filterable
                 size="small"
                 :options="industryOptions"
                 v-model="industry"
                 @change="onChange">
</el-cascader>

发现问题

但是当需要设置默认值的时候就发现问题:
data() {
    return {
      industry: [495, 96],
      industryOptions: options
    };
  },

当使用第二套选项时,默认值会显示 家政服务/搬家 这是没问题的。但是当选用了第一套方案时,默认值却死活出不来。

最终查明原因,是因为在第一套中 value 值是字符串,而第二套的 value 值是数字。


处理方案:统一 value 的值类型

/**
* 递归将选项中的 value 值及其 children 里面的 value 都转换成数字类型
*
* @param {Array} options 选项,格式为: [{ value: 0, label: "", children: [{ value: 2, label: "" }] }]
*/
function parseValueToInt(options) {
    options.forEach(opt => {
        opt.value = parseInt(opt.value);
        if (opt.children && opt.children.length > 0) {
            parseValueToInt(opt.children);
        }
    });
}

需要从外部传入默认值的时候,也可以做一下适配:

this.industry = val.map(d => d && parseInt(d));



这是前端填坑之旅的第一站,养成遇到坑就记录下来是一个好习惯,一方面加深自己的印象避免再次掉进同一个坑,另一方面也能帮助更多掉到坑里的人找到解决方案(说不定那个掉到坑里的人还是自己……)

MultipleTreeSelect.js插件提供了以下API: ### 初始化 ```javascript new MultipleTreeSelect(el, options) ``` - `el`:选择器或DOM元素,表示MultipleTreeSelect容器元素 - `options`:可选的选项对象,可以包含以下属性: | 属性 | 类型 | 默认值 | 描述 | | --- | --- | --- | --- | | data | Array | [] | 选择器的数据源 | | placeholder | String | '请选择' | 默认提示文本 | | value | String/Array | '' | 初始选中项的,可以是单个或多个 | | selectAll | Boolean | false | 是否显示全选按钮 | | multiple | Boolean | true | 是否支持多选 | | cascade | Boolean | true | 是否支持级联选择 | | onlyLeaf | Boolean | false | 是否只能选择叶子节点 | | max | Number | 0 | 最多可以选择的节点数,0表示不限制 | | search | Boolean | false | 是否显示搜索框 | | searchPlaceholder | String | '搜索' | 搜索框的提示文本 | | searchEmptyText | String | '无匹配数据' | 搜索无结果时的提示文本 | | searchHighlight | Boolean | true | 是否高亮显示搜索结果 | | accordion | Boolean | false | 是否开启手风琴效果 | | lazy | Boolean | false | 是否启用懒加载 | | lazyLoad | Function(treeNode, resolve) | undefined | 懒加载函数,返回Promise对象 | | checkStrictly | Boolean | false | 是否严格遵循父子节点不联动,即子节点的选中状态不会影响父节点 | | beforeClose | Function(selectInstance) | undefined | 关闭选择器前执行的函数 | | onClose | Function(selectInstance) | undefined | 关闭选择器后执行的函数 | | beforeSelect | Function(value, selectInstance) | undefined | 点击选择前执行的函数 | | onSelect | Function(value, label, extra, selectInstance) | undefined | 点击选择后执行的函数 | | beforeCheck | Function(value, checked, indeterminate, selectInstance) | undefined | 勾选节点前执行的函数 | | onCheck | Function(value, label, extra, selectInstance) | undefined | 勾选节点后执行的函数 | | onInputChange | Function(value, selectInstance) | undefined | 输入框内容变化时执行的函数 | | onSearch | Function(value, selectInstance) | undefined | 搜索框内容变化时执行的函数 | ### 实例方法 ```javascript selectInstance.rebuild() ``` 重新渲染MultipleTreeSelect插件。 ```javascript selectInstance.setValue(value) ``` 设置MultipleTreeSelect的选中。`value`可以是一个字符串字符串数组。 ```javascript selectInstance.getValue() ``` 获取MultipleTreeSelect的选中,返回一个字符串字符串数组。 ```javascript selectInstance.getLabel() ``` 获取MultipleTreeSelect的选中文本,返回一个字符串字符串数组。 ```javascript selectInstance.getExtra() ``` 获取MultipleTreeSelect的选中节点的额外信息,返回一个对象或对象数组。 ```javascript selectInstance.show() ``` 显示MultipleTreeSelect插件。 ```javascript selectInstance.hide() ``` 隐藏MultipleTreeSelect插件。 ```javascript selectInstance.disable() ``` 禁用MultipleTreeSelect插件。 ```javascript selectInstance.enable() ``` 启用MultipleTreeSelect插件。 ```javascript selectInstance.destroy() ``` 销毁MultipleTreeSelect插件,释放内存。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值