Vue3知识干货分享

在 Vue 3 中,setup 函数的写法有两种主要方式:一种是使用 <script setup> 标签,另一种是写在 export default 对象中作为 setup 函数。它们之间的区别如下:

  1. <script setup> 标签

    • 位置:使用 <script setup> 标签来编写 setup 函数。

    • 作用:是 Vue 3 的 Composition API 的一种语法糖,简化了 setup 函数的使用。

    • 优点

      • 简化语法: 省去了显式地定义 setup 函数,代码更简洁。
      • 更好支持 TypeScript: 更好的类型推断和更简洁的 TypeScript 支持。
      • 自动导入: 可以自动导入一些 Vue 内置的 API 和自定义的组件、函数等。
      <template><div>{{ message }}</div>
      </template><script setup>
      import { ref } from 'vue';const message = ref('Hello Vue 3!');
      </script>
      
    • 注意:此写法,definePropsdefineEmits是自动使用,无需显式导入

  2. export default 对象中的 setup 函数

    • 位置:在 export default 对象中定义 setup 函数。

    • 作用:这种方式是 Vue 3 提供的标准方式,允许在对象中定义 setup 方法。

    • 优点

      • 与 Options API 兼容: 适用于需要结合使用 Composition API 和 Options API 的情况。
      • 传统方式: 适合于逐步迁移旧代码或与传统 Vue 2.x 的 Options API 结合使用。
      <template><div>{{ message }}</div>
      </template><script>
      import { ref } from 'vue';export default {setup() {const message = ref('Hello Vue 3!');return { message };}
      }
      </script>
      
总结
  • <script setup>: 更简洁、易读,适合新开发的 Vue 3 组件和更复杂的逻辑组织。
  • export default 对象中的 setup: 更兼容旧有代码和 Options API,适合需要逐步迁移的项目。

声明变量

  • ref

    • 适用场景:主要用于定义单一的基本类型(如字符串、数字、布尔值)或对非响应式对象的包装。它也适用于创建响应式的引用类型数据(浅层响应式)。

    • 使用方法:创建一个包含 .value 属性的响应式对象,你需要通过 .value 来访问和修改其值。

    • 示例

      <template><div>{{ count }}</div><button @click="increment">Increment</button>
      </template><script setup>
      import { ref } from 'vue';// 创建一个响应式的基本类型变量
      const count = ref(0);// 修改变量值
      function increment() {count.value++;
      }
      </script>
      
  • reactive:

    • 适用场景:用于创建一个深度响应式的对象。它主要用于处理复杂的数据结构,如嵌套对象和数组。reactive 会对对象的所有嵌套属性进行响应式处理。

    • 使用方法:使用 reactive 创建的对象本身就是响应式的,你可以直接访问和修改对象的属性,而不需要通过 .value

    • 示例

      <template><div>{{ user.name }}</div><button @click="updateName">Change Name</button>
      </template><script setup>
      import { reactive } from 'vue';// 创建一个响应式的对象
      const user = reactive({name: 'John Doe'
      });// 修改对象属性
      function updateName() {user.name = 'Jane Doe';
      }
      </script>
      

计算属性

  • 基本用法:用来进行数据的衍生计算。

    <template><div><p>Count: {{ count }}</p><p>Doubled Count: {{ doubledCount }}</p><button @click="count++">Increment</button></div>
    </template><script>
    import { ref, computed } from 'vue';export default {setup() {const count = ref(0);// 定义计算属性const doubledCount = computed(() => count.value * 2);return {count,doubledCount};}
    };
    </script>
    
  • 特性:

    • 响应式:计算属性会自动依赖其内部使用的数据,并且在这些数据发生变化时会重新计算。Vue 会智能地缓存计算属性的值,直到它的依赖数据发生变化。

    • 只读:默认情况下,计算属性是只读的。如果你需要计算属性具有 setter(写入)功能,可以提供一个对象的形式来定义计算属性,如下所示:

      import { ref, computed } from 'vue';export default {setup() {const count = ref(0);// 定义具有 getter 和 setter 的计算属性const doubledCount = computed({get: () => count.value * 2,set: (newValue) => {count.value = newValue / 2;}});return {count,doubledCount};}
      };
      

生命周期钩子函数

  • onBeforeMount

    • 用途: 在组件挂载之前被调用。此钩子在模板编译完成但尚未挂载到 DOM 上时触发。

    • 函数签名:

      import { onBeforeMount } from 'vue';onBeforeMount(() => {console.log('Component is about to mount');
      });
      
  • onMounted

    • 用途: 在组件挂载到 DOM 后调用。用于访问 DOM 元素或执行需要在 DOM 渲染后才能完成的操作。

    • 函数签名

      import { onMounted } from 'vue';onMounted(() => {console.log('Component has been mounted');
      });
      
  • onBeforeUpdate

    • 用途: 在组件更新之前被调用。此钩子在组件的数据发生变化并将要重新渲染时触发。

    • 函数签名

      import { onBeforeUpdate } from 'vue';onBeforeUpdate(() => {console.log('Component is about to update');
      });
      
  • onUpdated

    • 用途: 在组件更新之后调用。用于处理更新后的逻辑或与新的 DOM 状态相关的操作。

    • 函数签名

      import { onUpdated } from 'vue';onUpdated(() => {console.log('Component has been updated');
      });
      
  • onBeforeUnmount

    • 用途: 在组件卸载之前被调用。用于清理资源或移除事件监听器等操作。

    • 函数签名

      import { onBeforeUnmount } from 'vue';onBeforeUnmount(() => {console.log('Component is about to unmount');
      });
      
  • onUnmounted

    • 用途: 在组件卸载后调用。用于执行卸载后需要完成的操作,如清理外部资源或停止定时器。

    • 函数签名

      import { onUnmounted } from 'vue';onUnmounted(() => {console.log('Component has been unmounted');
      });
      
  • onErrorCaptured

    • 用途: 当组件的子组件发生错误时调用。可以用于捕获错误并处理它们。

    • 函数签名

      import { onErrorCaptured } from 'vue';onErrorCaptured((error, instance, info) => {console.error('Error captured:', error);return false; // 如果返回 false,错误不会被进一步处理
      });
      
  • onActivated

    • 用途: 当组件被激活时调用。主要用于 <keep-alive> 包裹的组件,组件从缓存中激活时触发。

    • 函数签名

      import { onActivated } from 'vue';onActivated(() => {console.log('Component has been activated');
      });
      
  • onDeactivated

    • 用途: 当组件被停用时调用。主要用于 <keep-alive> 包裹的组件,组件被缓存时触发。

    • 函数签名

      import { onDeactivated } from 'vue';onDeactivated(() => {console.log('Component has been deactivated');
      });
      

响应式属性监听

  • watch

    • 作用:一个用于监听数据变化并执行回调函数的 API。可以用于监视响应式数据的变化、执行副作用操作或处理复杂的逻辑。提供了更灵活的方式来处理数据变化,与计算属性 (computed) 的响应性相比,watch 更适合处理需要副作用的场景。

    • 基本用法

      • 允许你观察一个或多个响应式数据源,并在这些数据源发生变化时执行回调函数

        import { ref, watch } from 'vue';export default {setup() {const count = ref(0);// 监视 `count` 的变化watch(count, (newValue, oldValue) => {console.log(`Count changed from ${oldValue} to ${newValue}`);});const info = reactive({name: 'dfc'});// 监视 `name` 的变化watch(() => info.name, (newName, oldName) => {console.log(`info.name changed from ${oldName} to ${newName}`);})return {count};}
        };
        
        import { ref, watch, toRefs } from 'vue';export default {setup() {const count = ref(0);const name = ref('Alice');// 监视多个数据源watch([count, name], ([newCount, newName], [oldCount, oldName]) => {console.log(`Count changed from ${oldCount} to ${newCount}`);console.log(`Name changed from ${oldName} to ${newName}`);});const info = reactive({name: 'dfc',age: 12,});// 监视多个数据源watch([() => info.name, () => info.age], ([newName, oldName], [newAge, oldAge]) => {console.log(`info.name changed from ${oldName} to ${newName}`);console.log(`info.age changed from ${oldAge} to ${newAge}`);});return {count,name,info,// ...toRefs(info)};}
        };
        
    • 其他特性

      • 深度监视:需要深度监视对象的嵌套属性,可以使用 deep 选项

        import { ref, watch } from 'vue';export default {setup() {const user = ref({ name: 'Alice', age: 30 });// 深度监视 `user` 对象watch(user, (newValue, oldValue) => {console.log('User object changed:', newValue);}, { deep: true });return {user};}
        };
        
      • 立即执行:初始化时立即执行一次回调,可以使用 immediate 选项

        import { ref, watch } from 'vue';export default {setup() {const count = ref(0);// 立即执行回调watch(count, (newValue, oldValue) => {console.log(`Count changed from ${oldValue} to ${newValue}`);}, { immediate: true });return {count};}
        };
        
      • 停止监听:需要在某些条件下停止监听,可以使用 watch 函数返回的停止函数

        import { ref, watch } from 'vue';export default {setup() {const count = ref(0);const stopWatch = watch(count, (newValue, oldValue) => {console.log(`Count changed from ${oldValue} to ${newValue}`);});// 停止监听setTimeout(() => {stopWatch();console.log('Stopped watching count');}, 5000);return {count};}
        };
        
  • watchEffect

    • 作用:一个用于自动追踪响应式数据并执行副作用的 API。它与 watch 不同,因为 watchEffect 不需要明确地指定要观察的数据源,而是自动追踪函数内部使用的所有响应式数据。这使得 watchEffect 更加简洁和直观,特别是当你不需要对数据变化做复杂的处理时。

    • 基本用法

      import { ref, watchEffect } from 'vue';export default {setup() {const count = ref(0);// 使用 watchEffect 追踪 count 的变化watchEffect(() => {console.log(`Count is: ${count.value}`);});// 修改 count 的值setTimeout(() => {count.value = 1;}, 1000);return {count};}
      };
      
    • 处理副作用: watchEffect 主要用于处理副作用,如更新 DOM、发送网络请求等。它在数据源变化时会重新执行回调函数,因此非常适合处理那些与数据变化有关的操作。

    • 停止追踪

      import { ref, watchEffect } from 'vue';export default {setup() {const count = ref(0);// 使用 watchEffect 追踪 count 的变化const stop = watchEffect(() => {console.log(`Count is: ${count.value}`);});// 停止追踪setTimeout(() => {stop();console.log('Stopped watching count');}, 5000);return {count};}
      };
      
    • watch 的对比

      watchEffectwatch 都可以用来处理响应式数据的变化,但它们的使用场景和方式有所不同:

      • watchEffect: 自动追踪函数内所有响应式数据的变化,适合处理简单的副作用,不需要手动指定数据源。
      • watch: 需要明确指定要观察的数据源,适合处理更复杂的逻辑和副作用,允许对数据源变化进行更细粒度的控制。
    • 深度追踪
      import { ref, watch } from 'vue';export default {setup() {const user = ref({ name: 'Alice', age: 30 });// 使用 watch 进行深度追踪watch(user, (newValue, oldValue) => {console.log('User object changed:', newValue);}, { deep: true });return {user};}
      };
      

内置组件

  • Teleport
    • 作用:允许你将子组件的渲染内容“传送”到 DOM 中的不同位置

    • 示例

      // teleport 将模态框渲染到 body 元素中,而不是其父组件的 DOM 结构中
      <template><div><button @click="showModal = !showModal">Toggle Modal</button><teleport to="body"><div v-if="showModal" class="modal"><p>This is a modal!</p><button @click="showModal = false">Close</button></div></teleport></div>
      </template><script>
      import { ref } from 'vue';export default {setup() {const showModal = ref(false);return {showModal};}
      };
      </script><style>
      .modal {position: fixed;top: 0;left: 0;width: 100%;height: 100%;background: rgba(0, 0, 0, 0.5);display: flex;align-items: center;justify-content: center;
      }
      </style>
      
  • Suspense
    • 作用:用于处理异步组件的加载过程,它可以在组件异步加载时显示一个加载状态。这个功能非常适合在渲染异步数据或组件时提供用户反馈。

    • 示例

      // Suspense 组件会在 AsyncComponent 加载时显示一个“Loading...”的文本,直到异步组件加载完成。
      <template><suspense><template #default><AsyncComponent /></template><template #fallback><p>Loading...</p></template></suspense>
      </template><script>
      import { defineAsyncComponent } from 'vue';const AsyncComponent = defineAsyncComponent(() => import('./AsyncComponent.vue'));export default {components: {AsyncComponent}
      };
      </script>
      
  • Fragment
    • 作用:支持多个根节点的功能,它允许一个组件返回多个根元素,而不需要额外的包裹元素。这个功能可以简化组件结构,避免不必要的 DOM 节点。

    • 示例

      <template><div></div><p>First element</p><p>Second element</p>
      </template><script>
      export default {setup() {return {};}
      };
      </script>
      

      在Vue3中使用Fragment只需要在模板中使用template标签包裹多个根节点即可。

组件通信

组件通信

异步组件

  • defineAsyncComponent

    • 作用:用于定义异步组件的函数,允许你动态地加载组件,通常用于按需加载,以提高应用的性能和响应速度。

    • 示例

      // 定义一个异步组件 AsyncComponent,它会在组件需要被渲染时才会被动态加载。import { defineAsyncComponent } from 'vue';const AsyncComponent = defineAsyncComponent(() =>import('./MyAsyncComponent.vue')
      );export default {components: {AsyncComponent}
      };
      
    • 配置选项

      选项是否必填含义
      loader返回一个 Promise,Promise 解析为异步组件
      loadingComponent指定一个加载中组件,在异步组件正在加载时显示
      errorComponent指定一个错误组件,如果异步组件加载失败时显示
      delay指定加载组件的延迟时间(以毫秒为单位)
      timeout指定加载组件的超时时间(以毫秒为单位)
    • 完整示例

      // AsyncComponent 将在加载时显示一个“Loading...”组件,如果加载失败,则显示一个错误组件。如果异步组件的加载超过了 10 秒,则会显示错误组件。import { defineAsyncComponent } from 'vue';// 定义异步组件,带有加载、错误处理和延迟配置
      const AsyncComponent = defineAsyncComponent({loader: () => import('./MyAsyncComponent.vue'),loadingComponent: {template: '<div>Loading...</div>'},errorComponent: {template: '<div>Error loading component</div>'},delay: 200, // 200ms 延迟显示 loadingComponenttimeout: 10000 // 10秒超时
      });export default {components: {AsyncComponent}
      };
      

Vueuse(工具函数)

  • 介绍:用于 Vue 3 的工具库,提供了一系列有用的 Composition API 组合函数,帮助开发者更高效地处理常见任务。它通过简化状态管理、响应式数据和副作用的处理,提高了开发效率。

  • 主要功能

    • 状态管理:如 useLocalStorageuseSessionStorage 让状态在浏览器存储中持久化。
    • 副作用:如 useFetch 用于进行 HTTP 请求,useIntervaluseTimeout 用于定时任务。
    • 事件处理:如 useEventListener 用于添加和移除事件监听器。
    • 响应式数据:如 useDark 处理暗黑模式,useMouse 跟踪鼠标位置。
  • 安装与使用

    • 安装

      npm install @vueuse/core
      
    • 使用

      // 使用 useLocalStorage 管理本地存储:<template><input v-model="name" placeholder="Enter your name" />
      </template><script lang="ts">
      import { useLocalStorage } from '@vueuse/core';export default {setup() {const name = useLocalStorage('name', '');return { name };}
      };
      </script>
      

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/877592.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

联想闪电鲨移动硬盘文件没删除却消失了怎么办

在日常的数据存储与管理中&#xff0c;移动硬盘作为便携且容量可观的存储设备&#xff0c;深受用户青睐。然而&#xff0c;当您发现联想闪电鲨移动硬盘中的文件突然消失&#xff0c;而您确信并未进行删除操作时&#xff0c;这无疑会令人感到困惑与焦虑。本文旨在为您揭开这一谜…

vue-element-admin——<keep-alive>不符合预期缓存的原因

vue-element-admin——<keep-alive>不符合预期缓存的原因 本文章&#xff0c;以现在中后台开发用的非常多的开源项目vue-element-admin为案例。首先&#xff0c;列出官方文档与缓存<keep-alive>相关的链接&#xff08;请认真阅读&#xff0c;出现缓存<keep-ali…

在IEDA里打包Maven项目记录

之前在网上查找到的方式发现比较繁琐&#xff0c;所以把自己的解决办法记录一下分享给兄弟们 <plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-shade-plugin</artifactId><version>3.2.4</vers…

集合及数据结构第一节————初识集合框架和数据结构

系列文章目录 集合及数据结构第一节————初识集合框架和数据结构 初始集合框架和数据结构 什么是集合框架&#xff1f;集合框架的重要性背后所涉及的数据结构以及算法数据结构的基本概念和术语逻辑结构和物理结构数据类型 文章目录 系列文章目录集合及数据结构第一节——…

文件的读写(标准库函数与系统调用函数),文件描述符的复制

文件描述符 为了解决内核对象在可访问性与安全”性之间的矛盾&#xff0c;Unix系统通过所谓的文件描述符&#xff0c;将位于内核空间中的文件表项间接地提供给运行于用户空间中的程序代码。为了便于管理在系统中运行的各个进程&#xff0c;内核会维护一张存有各进程信息的列表&…

C++智能指针配合STL模板类

代码 #include <unordered_map> #include <set> #include <memory> class ResID { public:using SP std::shared_ptr<ResID>;ResID() default;ResID(const std::string& id, const std::string& type): m_id(id), m_type(type){}public:~Re…

HoloLens 坐标系统 Coordinate systems

Hololens 和 Unity 空间坐标系统-CSDN博客文章浏览阅读79次。这意味着&#xff0c;在 X、Y 或 Z 轴上相距 2 个单位的物体&#xff0c;在混合现实中的渲染效果是相距 2 米。虽然左手坐标和右手坐标是最常见的系统&#xff0c;但 3D 软件中也会使用其他坐标系。例如&#xff0c;…

Veritas NBU8.3.0.2 安装部署环境备份实施介绍(篇一)

1、本次有两台NBU服务器&#xff0c;都是Windows Server 2016 Standard 2、一台作为Master Server角色&#xff0c;另外一台则作为Media Server角色 3、两台服务器均已加入域并关闭防火墙 4、后期备份客户端会有Linux和Windows系统&#xff0c;也会对接VCenter无代理备份虚拟…

xss靶场详解

目录 1.第一题 2.第二题 3.第三题 4.第四题 5.第五题 6.第六题 7.第七题 8.第八题 1.第一题 在源码script标签里边&#xff0c;innerhtml是用于访问或修改 HTML 元素内的 HTML 内容的&#xff0c;这里是访问spaghet这个元素的&#xff0c;并通过括号里面的东西搜索当前…

图搜v1.1.3 - 图库几千张图片再也不怕了

图搜是一款使用先进的自然语言处理技术的相册搜索助手&#xff0c;支持通过简单的描述来搜索相册中的图片&#xff0c;如“草丛中的猫”或“公园里的狗”。这款应用完全免费、无需内购&#xff0c;且完全离线使用&#xff0c;保证了用户数据的安全与私密性。它的高效索引系统确…

法律知识有奖竞答

关于开展线上法律知识竞赛活动的通知 根据字【2024】008号 《关于进一步推动普法贯穿于各行业各领域的倡议》的相关要求&#xff0c;特举办本次线上答题活动。 一、活动时间 2024年08月19日08:00至08月25日24:00 二、活动对象 公司全体成员 三、竞赛规则 1、每人每天拥有1次…

Jenkins UI与接口自动化测试持续集成实战

篇幅较长&#xff0c;要耐心阅读哦~ 基础知识简要回顾 持续集成、持续交付的好处与产生的必然性Jenkins服务的搭建方法Jenkins节点管理与用户权限Jenkins插件Jenkins父子多任务关联运行Jenkins报警机制 目录 SeleniumUI自动化测试持续集成演练接口自动化测试持续集成演练 …

vue+echarts:echarts地图页面跳转

在setOption的平级写点击事件&#xff0c;给chart添加click监听 getmapChart.setOption({......})//和数据对应即可 //点击区域实现页面跳转getmapChart.on(click,function(params){// console.log(params);switch(params.name){case "xxxx":top.location.href"…

JUC阻塞队列(四):DelayQueue

1、DelayQueue介绍 DelayQueue 是一个延迟队列&#xff0c;生产者写入一个数据&#xff0c;这个数据具有被直接消费的延迟时间&#xff0c; 让数据具有延迟的特性。 DelayQueue底层也是基于二叉堆来实现的&#xff0c;DelayQueue本就是基于PriorityBQueue 实现的。 二叉堆结构每…

Kubernetes Pod入门

在 Kubernetes 中&#xff0c;一个重要的概念就是 Pod(豆英)&#xff0c;Kubernetes 并不是直接管理容器他的最小管理单元叫做 Pod。的&#xff0c; 在 Docker 的应用中&#xff0c;我们把一个应用程序封装在一个镜像中&#xff0c;之后启动这个镜像并映射一个宿主机端…

x-cmd pkg | dua - 一个可以方便地了解给定目录的磁盘空间使用情况的工具

目录 简介用户首次快速实验指南技术特点竞品和相关项目进一步阅读 简介 dua 是 Disk Usage Analyzer 的简写&#xff0c;该工具可以快速查看给定目录的磁盘空间使用情况。 对于想要深入了解磁盘空间使用情况并有效管理存储的用户来说&#xff0c;Dua 是一个很有价值的工具。通…

华硕飞行堡垒键盘全部失灵【除电源键】

华硕飞行堡垒FX53VD键盘全部失灵【除电源键】 前言一、故障排查二、发现问题三、使用方法总结 前言 版本型号&#xff1a; 型号 ASUS FX53VD&#xff08;华硕-飞行堡垒&#xff09; 板号&#xff1a;GL553VD 故障情况描述&#xff1a; 键盘无法使用&#xff0c;键盘除开机键外…

轮式自主移动机器人的研究发展与ROS环境搭建

前言&#xff1a; 在轮式自主移动机器人的研发过程中&#xff0c;编程技术的重要性不言而喻。编程不仅涉及到机器人各种功能模块的协调运作&#xff0c;还决定了机器人能否实现复杂的行为决策和控制。首先&#xff0c;编程技术为机器人提供了“大脑”&#xff0c;从而使其能够感…

暑假请停止躺平!0门槛赚22万奖金!

在这个数字化时代&#xff0c;数据成为推动社会进步的重要力量。您是否想运用手中的数据&#xff0c;为治理与环保领域贡献力量&#xff1f;现在&#xff0c;机会就在眼前&#xff01; 2024年厦门市大数据创新应用大赛正在火热进行中&#xff0c;我们诚邀全国高等院校在校学生…

工厂现场多功能帮手,三防平板改善管理体验

随着制造业的智能化变革&#xff0c;信息化、自动化和智能化逐渐成为工厂管理的新常态。在这一波技术浪潮中&#xff0c;三防平板作为一种多功能的工作工具&#xff0c;正在逐步改善工厂现场的管理体验。 一、三防平板的定义与特点 三防平板&#xff0c;顾名思义&#xff0c;是…