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

news/2024/9/25 15:26:29/

问题描述:由于一次性返回所有的级联数据的话,数据量太大,接口响应时间太久,因此采用了异步加载的方案,看了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 = thisif (this.value || this.value === 0) {var selectedOptions = this.getSelectedOptionsByValue(this.options, this.value)if (selectedOptions) {if(this.changeSelect) {var optionsCursor = this.optionsthis.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。经过测试,用我改造后的代码就不会有显示错误的问题了。
啊,又是美好的一天~~


http://www.ppmy.cn/news/1450797.html

相关文章

http实现post请求时本地没问题,线上报413错误、nginx配置免费https、nginx反向代理

MENU 错误原因解决其他方式关于nginx的文章 错误原因 前端发送请求以后后端没有收到请求 而客户端却报了413错误 是请求实体过大的异常 如果请求夹带着文件就可能造成请求实体过大 那这里是什么原因造成的呢 在基础的后端开发中 都会用到nginx反向代理 默认大小为1M 超过1M都会…

公考学习|基于SprinBoot+vue的公考学习平台(源码+数据库+文档)

公考学习平台目录 目录 基于SprinBootvue的公考学习平台 一、前言 二、系统设计 三、系统功能设计 5.1用户信息管理 5.2 视频信息管理 5.3公告信息管理 5.4论坛信息管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&…

SA模拟退火算法优化高斯回归回归预测matlab代码

SA高斯回归回归预测matlab代码 模拟退火算法(Simulated Annealing,简称SA)是一种用于解决优化问题的启发式算法。它受到固体退火过程中温度逐渐降低的启发,通过随机性的搜索和接受劣解的策略,来在复杂的搜索空间中寻找…

leetCode65. 有效数字

leetCode65. 有效数字 题目思路 代码 class Solution { public:bool isNumber(string s) {int l 0, r s.size() - 1;// 1.忽略前后的空格while(l < r && s[l] ) l;while(l < r && s[r] ) r--;if(l > r) return false;s s.substr(l,r - l 1)…

Python项目开发实战:如何基于Keras的深度学习来预测国际旅行人数

注意:本文的下载教程,与以下文章的思路有相同点,也有不同点,最终目标只是让读者从多维度去熟练掌握本知识点。 下载教程:深度学习-基于Keras的Python项目开发实战_国际旅行人数预测_编程案例实例教程.pdf 在预测国际旅行人数这一问题上,我们可以利用深度学习技术,尤其是…

Spring Boot | Spring Security ( SpringBoot安全管理 )、Spring Security中 的 “自定义用户认证“

目录 : Spring Boot 安全管理 &#xff1a;一、Spring Security 介绍二、Spring Security 快速入门2.1 基础环境搭建 :① 创建Spring Boot 项目② 创建 html资源文件③ 编写Web控制层 2.2 开启安全管理效果测试 :④ 添加 spring-boot-starter-security 启动器⑤ 项目启动测试 三…

docker学习笔记7:centos docker安装mysql

在安装好docker后,可以在docker里安装mysql, 本篇博客介绍如何在docker里安装mysql. 关于docker的安装,可以参考这篇博客【docker学习笔记4:CentOS7安装docker】。 一、docker安装mysql 命令如下: docker pull mysql:5.7启动mysql docker run -p 3306:3306 --name mymy…

JavaScript百炼成仙自学笔记——8

别害怕&#xff0c;本文东西看着难&#xff0c;但是不难懂&#xff0c;花个十分钟看进去了&#xff0c;也就插头车位的明白了&#xff01;&#xff01;&#xff01; 代码执行之前会先编译&#xff0c;JavaScript编译分三步骤 var a 10; 抽象语法树&#xff1f; 调试、验证抽象…