v-if和v-show的区别

一、v-if

v-if是通过条件判断来控制元素是否渲染到DOM中,当条件为真时才会将元素添加到DOM中,否则不会渲染该元素。当条件发生变化时,v-if会根据新的结果重新创建或销毁DOM元素。因此,v-if在切换频繁的场景中有可能会有性能问题。

<template>
  <div>
    <p v-if="show">Hello World</p>
    <button @click="toggle">Toggle</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      show: true
    }
  },
  methods: {
    toggle() {
      this.show = !this.show
    }
  }
}
</script>

在上面的例子中,当show为true时,p标签会被渲染出来。当用户点击按钮时,toggle方法会改变show的值,从而导致p标签的显示状态发生改变。

二、v-show

v-show是通过CSS样式来控制元素是否显示,当条件为真时,则将元素的display属性设置为默认值,也就是显示元素;当条件为假时,则将元素的display属性设置为none,也就是隐藏元素。因此,v-show的切换速度较快,适合在频繁切换的场景中使用。

<template>
  <div>
    <p v-show="show">Hello World</p>
    <button @click="toggle">Toggle</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      show: true
    }
  },
  methods: {
    toggle() {
      this.show = !this.show
    }
  }
}
</script>

在上面的例子中,当show为true时,p标签的display属性会被设置为默认值,从而显示元素。当用户点击按钮时,toggle方法会改变show的值,从而导致p标签的显示状态发生改变。

总结:

  • v-if:适合在切换不频繁的场景中使用,因为它在渲染DOM时会频繁地创建或销毁元素,影响性能。
  • v-show:适合在切换频繁的场景中使用,因为它只是改变元素的CSS属性值,无需频繁创建或销毁元素,性能更好。
三、v-if和v-show不同点
  1. 编译时机

在Vue2中,v-if和v-for都是在编译阶段被处理的,这意味着它们只有在组件被实例化时才会被处理,而无论条件是否满足,它们的相关DOM都会被创建。这可能会影响性能,尤其是在处理大量数据时。而在Vue3中,v-if和v-for是在渲染时被处理的,这意味着只有在条件满足时,v-if所对应的DOM才会被渲染出来。

  1. 懒渲染

Vue3中,v-if新增了unmountOnExit选项,如果设置为true,则在条件不满足时,相关DOM会被自动卸载,从而减轻内存压力;而在Vue2中,该选项需要手动通过v-if和v-else来实现。

  1. v-show优化

Vue3中,v-show的渲染也进行了优化,当条件不满足时,v-show所对应的DOM只是被隐藏了,而不是被销毁。这样可以避免频繁创建/销毁DOM,提高性能。

  1. 动态组件

在Vue3中,使用v-if来动态切换组件时,可以使用新的元素来控制组件的挂载位置。这比Vue2中使用v-if和v-else要更简洁明了。

总之,虽然Vue2和Vue3中的v-if和v-show用法基本相同,但是在实现和性能方面,Vue3有很多优化和改进,使得它更加高效、易用。

四、v-if和v-show的优先级

在Vue2和Vue3中,v-show的优先级高于v-if。

在Vue2中,当一个元素同时包含v-if和v-show指令时,v-show会先被执行。这是因为v-show只需要根据条件设置元素的样式,而不需要频繁地创建/销毁DOM,因此它的优先级更高。

<template>
  <div>
    <p v-if="show" v-show="visible">Hello World</p>
    <button @click="toggle">Toggle</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      show: true,
      visible: true
    }
  },
  methods: {
    toggle() {
      this.visible = !this.visible
    }
  }
}
</script>

在上面的例子中,当show为true时,p标签才会渲染到DOM中;当visible为true时,p标签才会显示出来。如果visible为false,则p标签会隐藏起来,而不是被销毁。

在Vue3中,v-show和v-if的优先级仍然是相同的,即v-show优先级高于v-if。

<template>
  <div>
    <p v-if="show" v-show="visible">Hello World</p>
    <button @click="toggle">Toggle</button>
  </div>
</template>

<script>
import { ref } from 'vue'

export default {
  setup() {
    const show = ref(true)
    const visible = ref(true)

    const toggle = () => {
      visible.value = !visible.value
    }

    return {
      show,
      visible,
      toggle
    }
  }
}
</script>

在上面的例子中,当show为true时,p标签才会渲染到DOM中;当visible为true时,p标签才会显示出来。如果visible为false,则p标签会隐藏起来,而不是被销毁。

总之,在Vue2和Vue3中,v-show的优先级都是高于v-if的。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值