在工作中遇到的一个小小BUG
在应用ant-design-vue的cascader时,发现清空内容的性能没有用,查阅官网文档也并没有找到相干的解决方案。而后找到了这样的内容:
antd Select组件的allowClear点击生效 无奈清空? 察看发现,因为同时设置了value属性和allowClear属性, 导致无奈点击X清空以后选中项,官网相应的文档并没有提供allowClear点击事件让咱们订制本人的事件,因而,解决办法是去除value或者 获取到X清空的dom元素,减少点击事件.
而后依照这个思路开始解决BUG。
首先是一个失败的问题复现
在问题复现时发现貌似这个问题在新版本中曾经得以解决了。于是我查看了公司在做的我的项目的版本,如下:
"vue": "^2.6.11",
"ant-design-vue": "^1.6.4",
而没有将问题复现进去的我的项目的版本:
"vue": "^2.6.11"
"ant-design-vue": "^1.7.2",
还是贴一下代码吧:
select.vue:
<template> <div class="select"> <a-select allowClear :value="activeValue" defaultValue="lucy" style="width: 120px" @change="handleChange"> <a-select-option value="jack"> Jack </a-select-option> <a-select-option value="lucy"> Lucy </a-select-option> <a-select-option value="disabled"> Disabled </a-select-option> <a-select-option value="Yiminghe"> yiminghe </a-select-option> </a-select> </div></template><script>export default { data () { return { activeValue: "lucy", } }, methods: { handleChange (val) { this.activeValue = val } }}</script>
cascader.vue:
<template> <div class="cascader"> <span class="queryTitle">测试:</span> <a-cascader :value="activeValue" changeOnSelect allowClear :options="options" :fieldNames="{ label: 'label', value: 'value', children: 'children', }" placeholder="Please select" @change="onChange" /> </div></template><script> export default { data() { return { activeValue: ["zhejiang"], value: [], options: [ { value: "zhejiang", label: "Zhejiang", children: [ { value: "hangzhou", label: "Hangzhou", children: [ { value: "xihu", label: "West Lake", }, ], }, ], }, { value: "jiangsu", label: "Jiangsu", children: [ { value: "nanjing", label: "Nanjing", children: [ { value: "zhonghuamen", label: "Zhong Hua Men", }, ], }, ], }, ], }; }, methods: { onChange(val) { this.activeValue = val; }, }, }; </script>
看看成果:
能够看到,新版本的ant-design-vue能够失常的清空,即便同时应用value属性和allowClear属性。
旧版本的问题重现
先看下代码:
<a-cascader allowClear changeOnSelect @mouseenter="clearCascader" @change="changeaddvcd" style="width: 200px;" :fieldNames="{ label: 'adnm', value: 'adcd', children: 'child' }" :value="activeValue" :options="adcdOption" placeholder="请抉择县"/>
在cascader的配置中,同时设置了allowClear和value两个属性。上面看看成果:
能够看到点击革除按钮并没有什么卵用,于是解决方案来了:
@mouseenter触发的办法:在鼠标移入cascader后获取用于清空内容的按钮,而后为按钮增加一个点击事件,点击后手动清空以后显示的内容。
// 清空级联选择器clearCascader (e) { // console.log(e) let clearDom = e.path[0].children[2] clearDom.addEventListener("click", () => { this.activeValue = [] })},
看成果:
对于allowClear和value,官网文档给出的解释:
参数 阐明 类型 默认值
allowClear 是否反对革除 boolean true
value(v-model) 指定选中项 string[] | number[] -
总结
因为在理论开发中,我的项目的版本以及依赖的包的版本有可能是旧的,也有可能是新的。所以有些内容的用法可能被遗弃或降级或改良,所以在开发时,遇到问题要多看文档,文档中没有的问题也要及时查找相干的解决方案。
Keep foolish, keep hungry.