当前位置: 首页 > news >正文

前端面试项目细节重难点(已工作|做分享)

面试官提问:讲讲你最近的这个项目在开发过程中有没有遇到什么难题,你是怎么解决的?

答:我的回答:仔细回想最近我开发的项目,确实还遇到了问题,那我就讲讲下面这个问题和我的解决过程:

(1)需求场景:用户提交页面中的展示上传的文件列表,不符合提交规则的文件加上红色输入框提醒用户文件错误,用户删除错误文件,重新上传即可!【下面是我使用原生三件套做的原型图,便于大家理解上述需求场景】

58d6c350a08a4708b4b1bcc3c65583ba.png

(2)发现问题:需求已完成,进入测试阶段,测试结果,主要有两种bug:

情况一:当我删除错误文件即带有红色边框的文件,错误文件消失了,但错误文件的红色边框并没有消失,将红色边框样式直接添加到下一个文件;

Eg:我确实删除了格式错误的文件1,但红色边框移给了格式正确的文件2,如下图所示:

0458373db8a3492f93ad0613707356bf.png

 

情况二:当我删除正确文件即不带红色边框的文件,正确文件消失了,但第一个错误文件的红色边框也消失了;

Eg:我确实删除了格式正确的文件2,但格式错误的文件4的红色边框消失了,如下图所示:

3cc6a0d53b0d4b308f261fbb64e3d11e.png

(3)分析原因:

第1步:我得看看打印了文件列表数据,点击删除文件后,文件列表中确实少了数据,文件确实被删除了;

第2步:我打开控制台,去审查该元素,当删除文件后,确实元素消失了,但样式问题确实还一直存在,其实我也很困惑,毕竟页面问题或功能问题我确实可以debugger、console.log()打印结果或看空台报错啥的,但这个浏览器渲染过程出现的问题,我是可以在元素那里看到变化有问题,但却不知道怎么去排查这个问题,我确实没啥头绪;

第3步:【注意:大家一定要学会搜索解决问题,你们可以看看我搜索的过程,一起分享看看】既然我没排查出问题是什么,那我就借助借助浏览器搜索,搜索关键词即问题“当使用v-for渲染元素后,根据特定条件给这些元素加上不同样式,当删除该元素时,为什么样式不能删除,还会接着影响了其它元素呢?”,把我的问题描述清楚后,然后开始了各种查阅资料,慢慢好像找到了点儿思绪,可以从这个key值入手排查问题,我慢慢找到了问题产生的原因:我的key值取得是index,当点击按钮删除文件1时,Vue.js只会认为只是第1个元素的位置index发生了变化,而不会触发完整的视图更新,结果就是,即使第1个元素的内容发生了变化即从文件1变为文件2,但视图也不会正确更新,就出现了上述问题的情况一和情况二。

(4)解决过程:既然index对于每个元素都不是唯一标识符,就不能让index作为key值来使用,于是我就把每个item.id作为key值,作为其唯一标识,当点击删除按钮时,Vue,js就会正确识别出哪个元素被删除了,并更新视图。

Eg:使用index作为key值

eff23aa71643408a9b7ac1fdef838190.png

Eg:使用Item.id作为key值

cd295ec5b267483ca0d896f857ff4a28.png

(4)总结:使用index作为key值可能会导致视图更新错误,因为Vue.js会认为元素只是位置发生了变化,而使用item.id作为key可以确保Vue.js能正确跟踪和更新每个元素。

(5)知识点:DOM的diff算法【多理解多看看】

cf89dbce8ebc4138b2f7e3ec6a56c1eb.png

 

 

 

相关文章:

  • 循环双链表算法库构建
  • 解决 VSCode 编辑器点击【在集成终端中打开】出现新的弹框
  • HD哈默纳科行星减速机:工业传动领域的卓越之选
  • 云原生技术:开启你的数字王国
  • Windows系统C盘空间优化进阶:磁盘清理与Docker日志管理
  • GMSSL学习笔记
  • 2024考研调剂须知
  • 循环神经网络RNN
  • MAC 全角输入
  • 玩转公众号|掌握公众号运营技巧,让账号脱颖而出
  • C语言 | Leetcode C语言题解之第22题括号生成
  • 数据治理项目——深铁集团数据治理规划
  • 【从零到一手撕脚手架 | 第三节】项目集成CommitLInt+ESLint+Prettier+StyleLint+LintStaged
  • Leetcode【双指针法】
  • 海山数据库(He3DB)原理剖析:浅析OLAP数据库计算引擎中的统计信息
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • CentOS7 安装JDK
  • ES6--对象的扩展
  • Laravel 中的一个后期静态绑定
  • Laravel5.4 Queues队列学习
  • MySQL几个简单SQL的优化
  • 从0实现一个tiny react(三)生命周期
  • 聊聊hikari连接池的leakDetectionThreshold
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 强力优化Rancher k8s中国区的使用体验
  • 驱动程序原理
  • 少走弯路,给Java 1~5 年程序员的建议
  • 通过npm或yarn自动生成vue组件
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 最近的计划
  • 昨天1024程序员节,我故意写了个死循环~
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • $ git push -u origin master 推送到远程库出错
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (Qt) 默认QtWidget应用包含什么?
  • (八)Spring源码解析:Spring MVC
  • (附源码)php投票系统 毕业设计 121500
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • .net 7 上传文件踩坑
  • .net wcf memory gates checking failed
  • .NET 分布式技术比较
  • .NET 中的轻量级线程安全
  • .net快速开发框架源码分享
  • @require_PUTNameError: name ‘require_PUT‘ is not defined 解决方法
  • @test注解_Spring 自定义注解你了解过吗?
  • @四年级家长,这条香港优才计划+华侨生联考捷径,一定要看!
  • [ vulhub漏洞复现篇 ] JBOSS AS 5.x/6.x反序列化远程代码执行漏洞CVE-2017-12149
  • [1159]adb判断手机屏幕状态并点亮屏幕
  • [20190401]关于semtimedop函数调用.txt
  • [Android]使用Retrofit进行网络请求
  • [Angular] 笔记 21:@ViewChild
  • [BUUCTF NewStarCTF 2023 公开赛道] week4 crypto/pwn
  • [CareerCup] 12.3 Test Move Method in a Chess Game 测试象棋游戏中的移动方法