前端答疑-v-if重新渲染导致的Bug

简介: 因为疫情五一假期也不能出去玩,只好在家撸代码。正好昨天排查了一个问题,今天记录一下。

问题



问题是这样的,有个页面它里面有两个组件 1活动组件、2搜索组件,然后活动组件里面有个评论留言的功能,测试同学发现组件切换之后评论被清空了。


问题大体就这样。因为活动不是我做的,我只负责排查问题,所以我也是听别人的反馈来分析问题。


页面


感兴趣的朋友可以实际下载APP去看一下,VV音乐-首页轮播图-五一假期与美同行

如下,切换之后 UI 还在,只是记录数和评论没了。


bVbGF2N.webp.jpg


基础条件分析



  1. 单页面组件切换(不涉及到路由、或者页面通信乱七八糟的场景)


  1. 不存在页面被异常刷新情况(因为刷新就等于重新打开,重新打开是没有问题的。)


  1. 评论是公用的一个 js 实现,不是基于 Vue 的。(重点来了)
  1. vue 讲究的是数据驱动视图,只要数据在,视图就ok
  2. js、jQuery 讲究的是 DOM,想插节点插节点,节点没了就没了。


常见问题排查


到这里问题已经比较清晰了,Vue 如何使用原生库。一般来说遇到的问题分为下面几个。


  1. 获取不到 DOM 节点。这里一般是 nextTick 的问题,因为你操作完数据之后,他并没有渲染完毕呢。


  1. 组件开发中获取 DOM 不方便,有可能出现重复。这里我们可以用 ref 来获取。


  1. 排序拖动等功能不生效。一般是看上去变了,但是数据不对。因为 jQuery库的理念就是 DOM 对了就是对了,但是在 Vue 中必须要数据对了,然后数据渲染到页面。所以处理方式一般是放弃修改 DOM,改为修改数据。


这个 Bug 还比较特殊,不是这里面的,但是也有关系(和 3 的问题类似)。接来下出道面试题吧。


v-if 和 v-show 的区别



这面试题不陌生吧,想必大家也有答案。


v-if


v-if 根据表达式的值的来有条件地渲染元素。采用组件销毁、重建的方式。


如果一开始就是 false,那么这个组件不会被创建(生命周期钩子函数不会被调用)。


如果一开始是 true,然后改为 false,这个时候组件会被销毁(destory 等生命周期钩子函数都会执行)。之后如果再改为 true,那么会重新创建(created 等钩子函数会执行)。


v-show


v-show 根据表达式的值的来有条件地渲染元素。是通过设置元素的 display CSS 属性来实现渲染效果。


不管是 true 还是 false 都会渲染出组件。只不过为 falsedisplay:none


解决问题



基于上面的分析我们知道了,因为 v-if 导致组件被销毁,然后再次渲染的时候是根据 Vue 中的数据来渲染的,并没有 DOM 数据。


解决方案一:v-show


既然 v-show 不会销毁,那么我们可以缓存 v-show

这个方案的缺点


  1. 组件在一开始初始化的时候就全部被渲染了。会存在大量请求、无效数据打倒服务器。


  1. 因为他在一开始就渲染了,所以如果你没有加载完数据的话,存在报错的可能性。list && list.length 少不了这种代码的存在


解决方案二:切换之后再调用一次


既然 created 的时候是好的,那么我们切换之后再次调用一下初始化渲染不就可以了。

这个方案的缺点

  1. 因为存在二次渲染,jQuery 等插件一般都会监听事件。所以需要注意事件不能被多次触发。


  1. 还是因为上个问题,也要注意因为事件引用等问题导致的内存泄漏。


测试DEMO



https://www.lilnong.top/stati...

补一下 DEMO,可以看到一进去四个 input 都是有内容的。


切换之后 v-if 下面的input就有个丢值了。而 v-show 的不受影响。


增加 keep-alive 和组件测试


可以先在 keep-alive 组件中填入内容,然后切换,发现 v-if 的数据没有了


bVbGNsX.webp.jpg



相关文章
|
2月前
|
前端开发
914.【前端】Taro集成towxml渲染markdown文档
914.【前端】Taro集成towxml渲染markdown文档
63 2
|
4月前
|
SQL 前端开发 程序员
【面试题】前端开发中如何高效渲染大数据量?
【面试题】前端开发中如何高效渲染大数据量?
|
8月前
|
前端开发 测试技术
你发现一个bug,如何定位这个是前端还是后端缺陷?建议收藏
你发现一个bug,如何定位这个是前端还是后端缺陷?建议收藏
353 0
|
7月前
|
前端开发 安全 程序员
测试大姐趁我下班点又提了个bug!前端你咋多个options请求?
测试大姐趁我下班点又提了个bug!前端你咋多个options请求?
46 0
|
7月前
|
Web App开发 前端开发 开发者
|
4天前
|
开发框架 前端开发 搜索推荐
【Flutter前端技术开发专栏】Flutter中的自定义Widget与渲染流程
【4月更文挑战第30天】探索Flutter的自定义Widget与渲染流程。自定义Widget是实现复杂UI设计的关键,优点在于个性化设计、功能扩展和代码复用,但也面临性能优化和复杂性管理的挑战。创建步骤包括设计结构、定义Widget类、实现构建逻辑和处理交互。Flutter渲染流程涉及渲染对象树、布局、绘制和合成阶段。实践案例展示如何创建带渐变背景和阴影的自定义按钮。了解这些知识能提升应用体验并应对开发挑战。查阅官方文档以深入学习。
【Flutter前端技术开发专栏】Flutter中的自定义Widget与渲染流程
|
7月前
|
存储 JavaScript 前端开发
手撕前端面试题【javascript~ 列表动态渲染、无重复数组、数组排序、新数组、创建数组、深浅拷贝、内存泄露等】
html页面的骨架,相当于人的骨头,只有骨头是不是看着有点瘆人,只有HTML也是如此。 css,相当于把骨架修饰起来,相当于人的皮肉。
40 0
|
3月前
|
消息中间件 JavaScript 前端开发
前端秘法进阶篇----这还是我们熟悉的浏览器吗?(浏览器的渲染原理)
前端秘法进阶篇----这还是我们熟悉的浏览器吗?(浏览器的渲染原理)
|
8月前
|
缓存 前端开发 JavaScript
前端经典面试题 | v-if/v-show的原理及区别
前端经典面试题 | v-if/v-show的原理及区别
|
4月前
|
前端开发 安全 JavaScript
怎么判断bug是前端问题还是后端问题?
怎么判断bug是前端问题还是后端问题?