van-cascader(vant2)异步加载的bug

问题描述:由于一次性返回所有的级联数据的话,数据量太大,接口响应时间太久,因此采用了异步加载的方案,看了vant的官方示例代码,照着改了下,很轻松地实现了功能。正当我感叹世界如此美好的时候,测试人员就给我提了个bug,说选择的数据跟页面显示的数据对不上,我马上进行了自测,发现确实存在这个问题。我做的是个房产选择的一个级联选择器,得先选择小区,然后选楼栋,最后选房产,第一次选择的时候是没问题的,但第二次选择就会出现问题了。比如我选了小区1,再选了楼栋1,这时候再返回去选择小区2,然后再选择小区2下的某一楼栋,比如楼栋2,这时候就有问题了,已选择的数据就会变成了小区1,楼栋1,然后页面可选择的房产也变成了楼栋1下的所有房产了,正常的情况应该是已选择的数据是小区2,楼栋2,页面可选择的房产是楼栋2下的所有房产。
我一开始以为是我自己写的代码有问题,检查了好久,查找了好多资料,都没解决这个问题。没办法只能去看van-cascader这个组件的代码了,打开对应的js文件,以下这段代码立马引起了我的注意:
在这里插入图片描述
这个options就是我们传进来的级联数据,它深度监听了options的变动,一旦改变就会去调用updateTabs方法,那我每次选择了小区或者楼栋的时候就会去改变options,所以肯定会触发updateTabs方法,如果不出意外的话,问题肯定是在updateTabs方法里,我们来看看它的具体代码:

function updateTabs() {
      var _this2 = this;

      if (this.value || this.value === 0) {
        var selectedOptions = this.getSelectedOptionsByValue(this.options, this.value);

        if (selectedOptions) {
          var optionsCursor = this.options;
          this.tabs = selectedOptions.map(function (option) {
            var tab = {
              options: optionsCursor,
              selectedOption: option
            };
            var next = optionsCursor.filter(function (item) {
              return item[_this2.valueKey] === option[_this2.valueKey];
            });

            if (next.length) {
              optionsCursor = next[0][_this2.childrenKey];
            }

            return tab;
          });

          if (optionsCursor) {
            this.tabs.push({
              options: optionsCursor,
              selectedOption: null
            });
          }

          this.$nextTick(function () {
            _this2.activeTab = _this2.tabs.length - 1;
          });
          return;
        }
      }

      this.tabs = [{
        options: this.options,
        selectedOption: null
      }];
    },

问题就出现在这段代码:
在这里插入图片描述
一旦options改变就会执行这段代码,然后tabs就会变成上一次所选择的数据了,导致页面也显示了上一次的数据。
我想到的解决方法就是给这个组件再传一个参数,用来表示要不要执行这段代码的一个标志,具体做法如下:
在props增加一个参数:
在这里插入图片描述
将updateTabs方法的代码改为下面这段:

function updateTabs() {
      var _this2 = this

      if (this.value || this.value === 0) {
        var selectedOptions = this.getSelectedOptionsByValue(this.options, this.value)

        if (selectedOptions) {
          if(this.changeSelect) {
            var optionsCursor = this.options

            this.tabs = selectedOptions.map(function(option) {
              var tab = {
                options: optionsCursor,
                selectedOption: option
              }
              var next = optionsCursor.filter(function(item) {
                return item[_this2.valueKey] === option[_this2.valueKey]
              })
  
              if (next.length) {
                optionsCursor = next[0][_this2.childrenKey]
              }
  
              return tab
            })
  
            if (optionsCursor) {
              this.tabs.push({
                options: optionsCursor,
                selectedOption: null
              })
            }
          }
          this.$nextTick(function() {
            _this2.activeTab = _this2.tabs.length - 1
          })
          return
        }
      }

      this.tabs = [
        {
          options: this.options,
          selectedOption: null
        }
      ]
    },

然后在使用这个组件的时候记得把changeSelect传进来,在修改options 之前把changeSelect的值改为false,当options改完后使用

this.$nextTick(() => {
              this.changeSelect = true;
            })

把changeSelect 改为true。经过测试,用我改造后的代码就不会有显示错误的问题了。
啊,又是美好的一天~~

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Vant 组件库中的 van-cascader 组件通常是用于显示级联选择框,如果你希望清除它的历史选择记录,可以在使用 van-cascader 组件时动态设置其 value 属性: ``` <van-cascader :value="[]" /> ``` 这样可以将选择值清空为空数组,从而清除历史选择记录。 ### 回答2: 要清除vant van-cascader的历史选择记录,需要进行以下步骤: 1. 找到van-cascader组件所在的父组件。一般来说,van-cascader是在一个表单或者可编辑的页面中使用的,所以可以定位到对应的表单组件或页面组件。 2. 在父组件的data中添加一个变量,用来保存van-cascader的选择值。 3. 在父组件的methods中添加一个方法,用来处理清除历史选择的逻辑。可以命名为clearCascaderHistory()。 4. 在clearCascaderHistory()方法中,将van-cascader的选择值设置为初始状态或空值,即将父组件data中保存的变量重置为初始值或空值。 5. 在van-cascader组件中,通过v-model绑定选择值的变量,将其与父组件data中的变量保持同步。 6. 在van-cascader组件的props中添加一个属性,例如need-clear-history,用来指定是否需要清除历史选择记录。 7. 在父组件中使用van-cascader时,根据需求设置need-clear-history属性。当需要清除历史选择记录时,将need-clear-history设置为true;否则,设置为false或不设置,默认为false。 8. 在父组件的watch中监听need-clear-history的变化,当need-clear-history变为true时,调用clearCascaderHistory()方法清除历史选择记录。 通过以上步骤,就可以实现清除vant van-cascader的历史选择记录。在需要清除记录的时候,设置相应的属性即可清除历史选择。 ### 回答3: 要清除vant van-cascader的历史选择记录,可以按照以下步骤进行操作: 1. 找到vant van-cascader组件所在的代码文件。一般来说,该组件会被引入到一个Vue组件中。 2. 在该Vue组件中,找到使用vant van-cascader的地方。一般会有一个包含vant van-cascader的template标签。 3. 在template标签中,找到vant van-cascader的属性列表,并查看是否有与历史选择记录相关的属性。通常,vant van-cascader会提供一个名为"clearable"或"clearable"的属性来控制是否可以清除历史选择记录。 4. 如果存在"clearable"或"clearable"属性,将其设置为true,以允许清除历史选择记录。例如: <van-cascader :clearable="true"></van-cascader> 5. 保存文件并重新加载应用程序。现在,用户在使用vant van-cascader组件时,将会看到一个清除按钮。点击该按钮即可清除历史选择记录。 如果以上步骤无法清除历史选择记录,可能需要进一步查看vant van-cascader组件的文档或查看相关代码,以确定是否有其他特殊属性或方法可以清除历史选择记录。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值