Vue为什么频繁切换显示隐藏使用v-show比使用v-if性能好?

首先来看看使用v-if时vue是如何执行的

<div v-if="true">hello</div>

👆这行代码转成vue执行代码为

function render() {
  with(this) {
    return (true) ? _c('div', [_v("hellow")]) : _e()
  }
}

可以看到vue使用的是render函数,创建了一个dom节点,并且用一个三元表达式判断,当为true时创建虚拟dom 再转成真实的div节点,当为false时创建一个注释节点

再看看使用v-show时是如何执行的

<div v-show="true">hellow</div>

👆这行代码转成vue执行代码为

function render() {
  with(this) {
    return _c('div', {
      directives: [{
        name: "show",
        rawName: "v-show",
        value: (true),
        expression: "true"
      }]
    }, [_v("hellow")])
  }
}
<div v-show="false">hellow</div>
function render() {
  with(this) {
    return _c('div', {
      directives: [{
        name: "show",
        rawName: "v-show",
        value: (false),
        expression: "false\n"
      }]
    }, [_v("hellow")])
  }
}

可以看到当使用v-show时创建一个节点,之后只是expression的值不同,再去vue源码中看看

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底层是通过传入的value值,进行一个三元表达式判断,display的属性值。

所以使用v-show每次只是切换display的属性,不会频繁创建dom节点,但是,v-if每次改变都会频繁生产虚拟dom真实dom和注释节点,非常消耗性能。

但是当你只需要判断一次是否显示是可以使用v-if,可以优化结构。

推荐一个看vue执行代码的网站 Vue Template Explorer

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Vue中,v-if和v-show都可以用来控制元素的显示隐藏。但它们在实现和使用上有一些区别和适用场景的不同。 v-if是通过条件判断来决定元素是否在DOM中渲染的。当条件为真时,元素会被渲染出来,否则会从DOM中移除。这意味着当条件不满足时,相应的组件也不会被实例化。v-if适合在需要频繁切换的情况下使用,因为当条件不满足时,DOM中不会有多余的元素存在,可以节省性能。 v-show则是通过CSS的display属性来控制元素的显示隐藏。当条件为真时,元素会设置display为默认值,显示在页面上;当条件为假时,元素会设置display为none,隐藏在页面上。v-show适合在需要频繁切换但不需要频繁重新渲染整个组件的情况下使用,因为DOM中始终保留着元素,只是通过CSS来控制显示隐藏。 所以,v-show比v-if更加轻量级,但在初始渲染时,v-if性能可能更好。如果需要频繁切换但初始渲染较少的情况,可以使用v-show;如果需要在初始渲染时就确定是否渲染整个组件,可以使用v-if。 总结一下: - v-if是通过条件判断来决定元素是否在DOM中渲染的,适合需要频繁切换性能要求较高的场景。 - v-show是通过CSS的display属性来控制元素的显示隐藏的,适合需要频繁切换但不需要频繁重新渲染整个组件的场景。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值