前端答疑-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



相关文章
|
5月前
|
前端开发
914.【前端】Taro集成towxml渲染markdown文档
914.【前端】Taro集成towxml渲染markdown文档
361 2
|
1月前
|
前端开发 JavaScript 定位技术
一、前端高德地图注册、项目中引入、渲染标记(Marker)and覆盖物(Circle)
文章介绍了如何在前端项目中注册并使用高德地图API,包括注册高德开放平台账号、引入高德地图到项目、以及如何在地图上渲染标记(Marker)和覆盖物(Circle)。
46 1
|
5天前
|
前端开发 JavaScript API
深度剖析:前端如何驾驭海量数据,实现流畅渲染的多种途径
深度剖析:前端如何驾驭海量数据,实现流畅渲染的多种途径
29 3
|
1月前
|
前端开发 定位技术 API
二、前端高德地图、渲染标记(Marker)引入自定义icon,手动设置zoom
文章介绍了如何在前端使用高德地图API渲染标记(Marker),并引入自定义图标,同时展示了如何手动设置地图的缩放级别。
88 1
|
2月前
|
JavaScript 算法 前端开发
"揭秘Vue.js的高效渲染秘诀:深度解析Diff算法如何让前端开发快人一步"
【8月更文挑战第20天】Vue.js是一款备受欢迎的前端框架,以其声明式的响应式数据绑定和组件化开发著称。在Vue中,Diff算法是核心之一,它高效计算虚拟DOM更新时所需的最小实际DOM变更,确保界面快速准确更新。算法通过比较新旧虚拟DOM树的同层级节点,递归检查子节点,并利用`key`属性优化列表更新。虽然存在局限性,如难以处理跨层级节点移动,但Diff算法仍是Vue高效更新机制的关键,帮助开发者构建高性能Web应用。
62 1
|
2月前
|
API Java 数据库连接
从平凡到卓越:Hibernate Criteria API 让你的数据库查询瞬间高大上,彻底告别复杂SQL!
【8月更文挑战第31天】构建复杂查询是数据库应用开发中的常见需求。Hibernate 的 Criteria API 以其强大和灵活的特点,允许开发者以面向对象的方式构建查询逻辑,同时具备 SQL 的表达力。本文将介绍 Criteria API 的基本用法并通过示例展示其实际应用。此 API 通过 API 构建查询条件而非直接编写查询语句,提高了代码的可读性和安全性。无论是简单的条件过滤还是复杂的分页和连接查询,Criteria API 均能胜任,有助于提升开发效率和应用的健壮性。
83 0
|
2月前
|
前端开发 数据处理 开发者
解锁Django模板系统终极奥义!揭秘高效前端渲染秘籍,让你的网站秒变炫酷黑科技!
【8月更文挑战第31天】Django作为Python的高级Web框架,内置的模板系统支持动态HTML渲染。本文通过在线书店案例,详细介绍Django模板系统的设置与高效渲染技巧,包括创建模板文件、编写视图函数及URL配置。通过合理使用过滤器、深度查询和模板继承等技巧,提升前端渲染效率和安全性,优化Web应用开发流程。
21 0
|
2月前
|
前端开发 JavaScript 机器人
中后台前端开发问题之动态标注组件渲染到界面上如何解决
中后台前端开发问题之动态标注组件渲染到界面上如何解决
28 0
|
2月前
|
缓存 前端开发 JavaScript
优化前端性能:从渲染到加载的全方位策略
前端性能优化是提升用户体验的关键因素。本文探讨了从浏览器渲染到资源加载的各个方面,介绍了使用现代工具和技术的策略,包括减少关键渲染路径、优化资源加载和利用缓存。通过实施这些策略,可以显著提高页面响应速度,减少加载时间,提供更流畅的用户体验。
|
3月前
|
前端开发 JavaScript
Vue前端渲染blob二进制对象图片的方法
Vue前端渲染blob二进制对象图片的方法
250 0