首页 > 其他分享 >在vue中 使用v-if时它的响应式系统会作哪些优化

在vue中 使用v-if时它的响应式系统会作哪些优化

时间:2024-03-29 10:13:13浏览次数:20  
标签:vue DOM show 会作 响应 Vue isVisible 组件

前言:

  有时我们没在一个组件做初始化数据的工作,只是在template下的根元素加了个v-if控制显示,这样一来也能达到初始化数据的目的。

  但其背后的原理是什么?

 

在Vue 2.x中,当你使用v-if指令将一个组件或元素的条件设置为false,使得它在DOM中不可见时,Vue的响应式系统会进行一些优化。具体来说,当v-if的值为false时,Vue会从DOM中移除该元素及其所有子元素,并且会“销毁”该元素及其子元素的响应式数据。

这意味着,如果v-if控制的是根组件,那么当条件变为true,组件再次变得可见时,根组件的响应式数据会被重新初始化。这是因为Vue会为重新插入的DOM元素创建一个新的响应式数据对象。

这种行为对于组件的生命周期钩子也有影响。当v-iffalse时,组件的beforeDestroydestroyed钩子会被调用。当v-if再次变为true时,组件的beforeCreatecreated钩子会被再次调用,就像组件被重新创建了一样。

这里有一个例子来说明这个过程:

<template>
  <div>
    <button @click="toggle">Toggle Component</button>
    <ChildComponent v-if="isVisible" />
  </div>
</template>

<script>
export default {
  data() {
    return {
      isVisible: true
    };
  },
  methods: {
    toggle() {
      this.isVisible = !this.isVisible;
    }
  },
  components: {
    ChildComponent: {
      data() {
        return {
          count: 0;
        };
      },
      created() {
        console.log('ChildComponent created');
      },
      beforeDestroy() {
        console.log('ChildComponent beforeDestroy');
      }
    }
  }
};
</script>

在这个例子中,点击按钮切换isVisible的值会导致ChildComponent被销毁和重新创建。每次isVisible变为true时,ChildComponentcreated钩子都会被调用,因为它被视为一个新创建的组件。

因此,如果你依赖于组件的响应式数据在v-if切换时保持不变,你可能需要考虑使用其他解决方案,如v-show(它只是简单地切换元素的CSS display属性,而不会影响组件的生命周期或响应式数据),或者使用组件的key属性来管理组件的重新渲染。

 

在Vue 3中,v-ifv-show的行为与Vue 2.x有所不同,尤其是在组件的生命周期和响应式数据的处理上。Vue 3引入了Composition API,这改变了处理组件状态和逻辑的方式。

对于v-if

在Vue 3中,如果你使用v-if来条件性地渲染组件,当条件为false时,Vue 3会将组件从DOM中移除,并且组件的状态(包括组件的响应式数据和计算属性等)会被保留。这意味着,当条件再次变为true时,组件不会被重新创建,而是重新挂载到DOM中,并且其状态会保持不变。

这是Vue 3的一个改进,因为它减少了不必要的组件重创建,从而提高了性能。然而,如果你在组件中使用了key属性,并且key值在组件被移除和重新挂载之间发生了变化,Vue 3会将组件视为一个新的实例,并重新创建组件。

对于v-show

v-show仅仅是通过CSS的display属性来控制元素的可见性。无论v-show的值如何变化,元素始终保留在DOM中,因此组件的响应式数据和状态不会受到影响。

使用Composition API:

在Vue 3中,你可以使用Composition API来更好地管理组件的状态和逻辑。通过使用refreactive来创建响应式数据,你可以在组件的setup函数中组合和重用逻辑。

例如,使用setup函数和ref来管理响应式数据:

<script>
import { ref, onMounted } from 'vue';

export default {
  setup() {
    const isVisible = ref(true);

    onMounted(() => {
      // 组件挂载后执行的代码
    });

    function toggle() {
      isVisible.value = !isVisible.value;
    }

    return {
      isVisible,
      toggle
    };
  }
};
</script>

在这个例子中,isVisible是一个响应式的布尔值,它控制着组件的显示和隐藏。即使isVisible的值发生变化,组件的响应式数据isVisible.value也会保持不变。

总结来说,在Vue 3中,使用v-if时组件的状态会被保留,而使用v-show时组件始终存在于DOM中,因此它们的响应式数据不会受到影响。这使得Vue 3在处理条件渲染时更加高效和灵活。

标签:vue,DOM,show,会作,响应,Vue,isVisible,组件
From: https://www.cnblogs.com/caihongmin/p/18103165

相关文章

  • vue3项目数字金额转大写
    consttoUpperCaseAmount=(value)=>{ //将数字金额转换为大写的逻辑 constdigitUppercase=['零','壹','贰','叁','肆','伍','陆','柒','捌','玖']; constunit=[......
  • 免费分享一套SpringBoot+Vue个人健康管理系统,帅呆了~~
    大家好,我是java1234_小锋老师,看到一个不错的SpringBoot+Vue个人健康管理系统,分享下哈。项目视频演示【免费】SpringBoot+Vue个人健康管理系统Java毕业设计_哔哩哔哩_bilibili【免费】SpringBoot+Vue个人健康管理系统Java毕业设计项目来自互联网,免费开源分享,严禁商业。更多......
  • JavaScript Fetch API请求和响应
    JavaScriptFetchAPI请求和响应 //加载进场工人不安全行为数据varloadAllWorkerUsafeData=setInterval(function(){consturl=`http://35.98.90.55/api/info?project=23`;fetch(url).then(response=>response.json()).then(data=>{varhandle_c......
  • Ant Design Vue Tree 选中子节点同时半选中父级节点
    需要实现的效果:1、子菜单如果不是全部选中,一级菜单半选。2、子菜单全选,一级菜单选中。3、一级菜单选择,二级菜单全选。4、没有二级菜单,则只控制一级菜单。主要用到的属性是checked和halfCheckedKeys,通过手动控制那些菜单选中,那些半选中实现功能。**页面截图:**完整代码如......
  • 基于vue.js的购物商场的设计与实现
     有需要的同学,源代码和配套文档领取,加文章最下方的名片哦一、项目演示项目演示视频https://graduation-images.oss-cn-beijing.aliyuncs.com/videos/828%E5%A5%97ssm%E5%BD%95%E5%83%8F/10773_ssm616%E5%9F%BA%E4%BA%8Evue.js%E7%9A%84%E8%B4%AD%E7%89%A9%E5%95%86%E5%9C%BA......
  • vue3 mitt事件总线,组件之间通信,通信范围不在局限于父子组件之间
    vue2使用的EventBus事件总线在vue3已经被弃用了;vue3使用的事件总线为mitt,可用父子组件,兄弟组件之间通信我使用的方法如下新建一个mitt.ts文件保存以下内容importmitts,{Emitter}from"mitt";//定义类型别名,因全局使用并且需要自定义事件名称,所以使用索引签名......
  • Vue学习笔记Day01
    软件安装:node.jsvscode一、基于脚手架创建前端工程(一)环境要求:1.node.js:前端项目的运行环境;(查看版本号:node-v)2.npm:JavaScript的包管理工具;(查看版本号:npm-v)3.VueCLI:基于Vue进行快速开发的完整系统,实现交互式的项目脚手架。(安装VueCLI:npmi@vue/cli-g)(二)使用Vue......
  • vue之实现单击与双击、同一标签使用click实现单双击操作、不选最后一个子元素的选择器
    MENUhtmlJavaScriptstyle解析html<template><divclass="box"><divclass="box_content"><pclass="box_p1"@click.prevent="tabSwitch({id:'keyId'})">......
  • vue extends继承后修改template的解决方案
    vueextends继承后怎么注入虚拟DOM节点1.需求使用extends继承一个组件并在上面做功能的修改和扩展,同时需要小小修改一部分的template。2.extend原理使用extends时,你实际上是创建了一个新组件,它包含了父组件的所有选项和数据,但是你可以覆盖或添加新的选项。3.问题修改通过ext......
  • Vue 自定义组件库通过配置调整样式?
      在Vue自定义组件库中,通常可以通过配置来调整样式。为了实现这一点,你可以定义一组样式相关的配置项,并在组件内部使用这些配置项来动态地设置样式。以下是一个简单的示例,演示了如何通过配置调整组件的样式。自定义组件(CustomComponent.vue)<template><div:style......