在工作中遇到的一个小小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.