乐趣区

关于前端:AntdVue你的cascader或select清空功能allowClear失效了吗

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

退出移动版