【Vue】 通过一个小BUG,让我对 v-if 和 v-show产生的疑虑

简介: 鄙人是个比较菜的新手。用React比较多,当然哈,只限于使用..... 不绕弯子了,之前早就关注过 v-if 和 v-show 的区别,打死我也没想到因为这俩还给我整出了bug。

鄙人是个比较菜的新手。用React比较多,当然哈,只限于使用..... 不绕弯子了,之前早就关注过 v-ifv-show 的区别,打死我也没想到因为这俩还给我整出了bug。

发现问题

我们因为业务需求,有个功能是来回切换两个表格。数据结构都是不一样的。之前一位大哥是使用v-if写的(后来才注意到的) ,然后就出现了个离奇的事情,两个页面暂且就叫 AB 出问题的是 A 页面。 俩页面来回切换的时候 A页面的,某一列数据丢失了,而且这一列的样式和B页面一样。百思不得其解,因为我工作年限很低,经验不足,所以我遇到的BUG 99%都是逻辑问题 于是乎,我就开始一点一点排查,先是结构,后是接口,然后数据源。到最后串起来的时候发现并没有什么异常。其实之前我就想到会不会是v-if渲染问题,但随之就抛诸脑后。到最后,实在没别的办法了,我就寻思,看看改成v-show 会不会好。结果BUG真就解决了....后来的我开始沉思....虽然这个问题看似简单,但对我来说,却是一种新的解决问题的思维方式。今日小趴菜技能+10.

解决问题

v-show

源码刨析

其实不管怎么看官方的代码,都是很简单 v-if 彻彻底底销毁元素 ,v-show 隐藏元素 我还是有点没搞懂,为什么只有那一列数据出问题。但是问题原因和解决办法找到了

区别

  • v-if

动态的向DOM树内添加或者删除DOM元素
真正的条件渲染,它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建;在初始渲染条件为假时,什么也不做。
由于存在销毁和重建,具有更高的切换消耗

  • v-show

通过设置DOM元素的display样式属性控制显示和隐藏
不管初始条件是什么,元素总是会被渲染,只是简单地基于 CSS 进行切换。
由于总是会被渲染,所以初始时有更高的渲染消耗

v-if 源码

const VueTemplateCompiler = require('vue-template-compiler')

const template = '<div v-if="true"><span>hello world</span></div>'

// 模版编译成render方法
const compile = VueTemplateCompiler.compile(template)

console.log(compile.render)

// 结果
with (this) {
    return (true) ? _c('div', [_c('span', [_v("hello world")])]) : _e() }

满足条件时会创建DOM元素,不满足时会通过_e创建空节点,在vue/src/core/instance/render-helpers/index.js可以看到_e方法的定义target._e = createEmptyVNode


v-show 源码

找到vue/src/platforms/web/runtime/directives/show.js,会发现以下核心代码

bind (el: any, {
    value }: VNodeDirective, vnode: VNodeWithData) {
   
    vnode = locateNode(vnode)
    const transition = vnode.data && vnode.data.transition
    const originalDisplay = el.__vOriginalDisplay =
      el.style.display === 'none' ? '' : el.style.display
    if (value && transition) {
   
      vnode.data.show = true
      enter(vnode, () => {
   
        el.style.display = originalDisplay
      })
    } else {
   
      el.style.display = value ? originalDisplay : 'none'
    }
  },

从代码里可以看出v-show是通过改变CSS style.display来操作元素的显示与隐藏.

相关文章
|
1天前
|
存储 缓存 JavaScript
在 Vue 中使用 computed 和 watch 时,性能问题探讨
本文探讨了在 Vue.js 中使用 computed 计算属性和 watch 监听器时可能遇到的性能问题,并提供了优化建议,帮助开发者提高应用性能。
|
1天前
|
存储 缓存 JavaScript
如何在大型 Vue 应用中有效地管理计算属性和侦听器
在大型 Vue 应用中,合理管理计算属性和侦听器是优化性能和维护性的关键。本文介绍了如何通过模块化、状态管理和避免冗余计算等方法,有效提升应用的响应性和可维护性。
|
1天前
|
存储 缓存 JavaScript
Vue 中 computed 和 watch 的差异
Vue 中的 `computed` 和 `watch` 都用于处理数据变化,但使用场景不同。`computed` 用于计算属性,依赖于其他数据自动更新;`watch` 用于监听数据变化,执行异步或复杂操作。
|
1天前
|
JavaScript 前端开发
如何在 Vue 项目中配置 Tree Shaking?
通过以上针对 Webpack 或 Rollup 的配置方法,就可以在 Vue 项目中有效地启用 Tree Shaking,从而优化项目的打包体积,提高项目的性能和加载速度。在实际配置过程中,需要根据项目的具体情况和需求,对配置进行适当的调整和优化。
|
15天前
|
数据采集 监控 JavaScript
在 Vue 项目中使用预渲染技术
【10月更文挑战第23天】在 Vue 项目中使用预渲染技术是提升 SEO 效果的有效途径之一。通过选择合适的预渲染工具,正确配置和运行预渲染操作,结合其他 SEO 策略,可以实现更好的搜索引擎优化效果。同时,需要不断地监控和优化预渲染效果,以适应不断变化的搜索引擎环境和用户需求。
|
2天前
|
存储 JavaScript 开发者
Vue 组件间通信的最佳实践
本文总结了 Vue.js 中组件间通信的多种方法,包括 props、事件、Vuex 状态管理等,帮助开发者选择最适合项目需求的通信方式,提高开发效率和代码可维护性。
|
2天前
|
存储 JavaScript
Vue 组件间如何通信
Vue组件间通信是指在Vue应用中,不同组件之间传递数据和事件的方法。常用的方式有:props、自定义事件、$emit、$attrs、$refs、provide/inject、Vuex等。掌握这些方法可以实现父子组件、兄弟组件及跨级组件间的高效通信。
|
7天前
|
JavaScript
Vue基础知识总结 4:vue组件化开发
Vue基础知识总结 4:vue组件化开发
|
7天前
|
存储 JavaScript
Vue 状态管理工具vuex
Vue 状态管理工具vuex
|
15天前
|
缓存 JavaScript 搜索推荐
Vue SSR(服务端渲染)预渲染的工作原理
【10月更文挑战第23天】Vue SSR 预渲染通过一系列复杂的步骤和机制,实现了在服务器端生成静态 HTML 页面的目标。它为提升 Vue 应用的性能、SEO 效果以及用户体验提供了有力的支持。随着技术的不断发展,Vue SSR 预渲染技术也将不断完善和创新,以适应不断变化的互联网环境和用户需求。
31 9