返回

Element UI Cascader 级联选择器报错奇遇记

前端


前言

Element UI 是一个非常受欢迎的 Vue.js 组件库,它提供了丰富的 UI 组件,可以帮助开发者快速构建出美观、实用的前端应用。Cascader 级联选择器是 Element UI 中的一个常用组件,它允许用户从一组层级数据中选择值。

报错现象

在我使用 Cascader 级联选择器时,遇到了一个奇怪的报错:

[Vue warn]: Error in mounted hook: "TypeError: Cannot read properties of undefined (reading 'length')"

这个报错是在我切换字段 A 的值时发生的。字段 A 是一个下拉选择框,它包含了一组选项。当我在字段 A 中选择了一个选项后,我需要重置 Cascader 级联选择器的 value 和 options,然后发起一个接口请求,给 Cascader 级联选择器的选项 options 更新。

原因分析

经过一番排查,我终于找到了报错的原因:

  1. 在字段 A 的 change 事件中,我使用了 this.$refs.cascader.value = null 来重置 Cascader 级联选择器的 value。这个操作会导致 Cascader 级联选择器的选项 options 变成一个空数组。
  2. 在发起接口请求之前,我使用了 this.$refs.cascader.options = newOptions 来更新 Cascader 级联选择器的选项 options。然而,由于 Cascader 级联选择器的选项 options 已经是一个空数组,所以 newOptions 的长度为 0。
  3. 在 Cascader 级联选择器内部,有一个方法叫做 updateOptions,这个方法会在选项 options 发生变化时被调用。在 updateOptions 方法中,有一行代码是 this.filteredOptions = this.options.slice(0, this.filterMethod ? this.filteredOptionsCount : this.options.length)。当选项 options 为空数组时,this.options.length 的值为 0,这就会导致 this.filteredOptions 的值为 undefined
  4. 在 Cascader 级联选择器的模板中,有一行代码是 v-for="option in filteredOptions"。当 this.filteredOptionsundefined 时,就会导致报错:
[Vue warn]: Error in mounted hook: "TypeError: Cannot read properties of undefined (reading 'length')"

解决方法

要解决这个问题,只需要在发起接口请求之前,先判断一下 Cascader 级联选择器的选项 options 是否为空数组。如果为空数组,则不需要更新选项 options。

if (this.$refs.cascader.options.length > 0) {
  this.$refs.cascader.options = newOptions
}

总结

通过这个报错,我学到了以下几点:

  1. 在使用 Cascader 级联选择器时,需要注意选项 options 的长度。如果选项 options 为空数组,则不能直接更新选项 options。
  2. 在发起接口请求之前,应该先判断一下 Cascader 级联选择器的选项 options 是否为空数组。如果为空数组,则不需要更新选项 options。
  3. 在开发过程中,遇到报错时不要慌张,应该仔细分析报错的原因,然后针对性地解决问题。