理解 Vue 的 setup 应用程序钩子

简介: 【10月更文挑战第3天】`setup` 函数是 Vue 3 中的新组件选项,在组件创建前调用,作为初始化逻辑的入口。它接收 `props` 和 `context` 两个参数,内部定义的变量和函数需通过 `return` 暴露给模板。`props` 包含父组件传入的属性,`context` 包含组件上下文信息。`setup` 可替代 `beforeCreate` 和 `created` 钩子,并提供类似 `data`、`computed` 和 `methods` 的功能,支持逻辑复用和 TypeScript 类型定义。
  1. setup 函数的基本概念
  • 定义与位置:在 Vue 3 中,setup函数是一个新的组件选项。它是在组件创建之前,属性解析之前被调用的,是组件初始化逻辑的入口点。这个函数接收两个参数:propscontext。例如,在一个简单的 Vue 组件中:


<script>
   import { ref } from 'vue';
   export default {
       setup(props, context) {
           // 组件逻辑代码
       }
   };
   </script>


  • 作用范围setup函数内部的变量和函数只在setup函数执行期间存在,不会自动暴露给模板。如果要在模板中使用setup函数内部定义的变量或函数,需要通过return语句将它们返回。


  1. setup 函数的参数
  • props 参数
  • 数据传递props是一个对象,包含了父组件传递给当前组件的属性。这些属性是响应式的,意味着当父组件传递的属性值发生变化时,在setup函数内部可以感知到这种变化。例如,如果父组件传递了一个名为message的属性,在setup函数中可以这样访问:


<script>
     export default {
         setup(props) {
             console.log(props.message);
         }
     };
     </script>


  • 只读性质:在setup函数中,props是只读的。这是为了防止子组件意外地修改父组件的数据,从而破坏数据的单向流动原则。如果试图修改props中的属性,Vue 会在控制台发出警告。
  • context 参数
  • 属性和方法概述context是一个包含了一些组件上下文信息的对象,包括attrsslotsemit等。attrs包含了父组件传递过来的非props属性,slots用于访问组件的插槽内容,emit则用于在子组件中触发自定义事件,向父组件传递数据。
  • 示例:使用 emit:假设在子组件中有一个按钮,点击按钮时要向父组件发送一个事件。在setup函数中可以这样使用emit


<script>
     import { ref } from 'vue';
     export default {
         setup(props, context) {
             const count = ref(0);
             const increment = () => {
                 count.value++;
                 context.emit('increment', count.value);
             };
             return {
                 count,
                 increment
             };
         }
     };
     </script>


increment函数被调用时,不仅会更新count的值,还会通过emit触发一个名为increment的自定义事件,并将count的值传递给父组件。

3. 返回值的作用


  • 暴露给模板setup函数返回的对象中的属性和函数可以在组件的模板中直接使用。例如,如果在setup函数中返回了一个名为count的响应式变量和一个名为increment的函数,在模板中可以这样使用:


<template>
       <div>
           <p>Count: {{ count }}</p>
           <button @click="increment">Increment</button>
       </div>
   </template>


  • 响应式数据的返回:返回的响应式数据(如通过refreactive创建的数据)在模板中可以自动更新。例如,当count的值在setup函数中被修改后,模板中{{ count }}的显示内容也会随之更新。


  1. 与其他组件选项的关系
  • 替代 beforeCreate 和 created 钩子:在 Vue 3 中,setup函数的执行时机类似于beforeCreatecreated钩子函数的执行时机。实际上,当使用setup函数后,就不需要再使用beforeCreatecreated钩子了,因为setup函数已经涵盖了它们的功能。
  • 与 data、computed 和 methods 的比较
  • data:在 Vue 2 中,组件的数据是通过data函数返回一个对象来定义的。在 Vue 3 的setup函数中,可以使用refreactive来定义响应式数据,替代了data函数的功能。
  • computed:在setup函数中,可以使用computed函数来创建计算属性。例如:


<script>
     import { ref, computed } from 'vue';
     export default {
         setup() {
             const count = ref(0);
             const doubleCount = computed(() => count.value * 2);
             return {
                 count,
                 doubleCount
             };
         }
     };
     </script>


  • methods:在setup函数中定义的函数可以替代Vue 2中的methods选项中的方法,并且这些函数可以方便地访问setup函数中定义的响应式数据。


  1. 使用场景和优势
  • 逻辑复用setup函数可以方便地将组件的逻辑提取出来,通过组合多个setup函数,可以实现逻辑的复用。例如,可以创建一个包含数据获取和格式化功能的setup函数,然后在多个组件中使用这个setup函数。
  • 更好的类型支持(与 TypeScript 结合):在使用 TypeScript 开发 Vue 3 应用时,setup函数提供了更好的类型支持。可以明确地定义propscontext的类型,以及返回值的类型,使得代码更加健壮和易于维护。例如:


import { ref } from 'vue';
   interface Props {
       message: string;
   }
   export default {
       setup(props: Props, context) {
           const count = ref(0);
           // 其他逻辑
           return {
               count
           };
       }
   };


相关文章
|
14天前
|
安全 Java 应用服务中间件
JVM常见面试题(三):类加载器,双亲委派模型,类装载的执行过程
什么是类加载器,类加载器有哪些;什么是双亲委派模型,JVM为什么采用双亲委派机制,打破双亲委派机制;类装载的执行过程
JVM常见面试题(三):类加载器,双亲委派模型,类装载的执行过程
|
14天前
|
人工智能 运维 安全
聚焦API安全未来,F5打造无缝集成的解决方案
聚焦API安全未来,F5打造无缝集成的解决方案
65 26
|
14天前
|
消息中间件 资源调度 API
Apache Flink 流批融合技术介绍
本文源自阿里云高级研发工程师周云峰在Apache Asia Community OverCode 2024的分享,内容涵盖从“流批一体”到“流批融合”的演进、技术解决方案及社区进展。流批一体已在API、算子和引擎层面实现统一,但用户仍需手动配置作业模式。流批融合旨在通过动态调整优化策略,自动适应不同场景需求。文章详细介绍了如何通过量化指标(如isProcessingBacklog和isInsertOnly)实现这一目标,并展示了针对不同场景的具体优化措施。此外,还概述了社区当前进展及未来规划,包括将优化方案推向Flink社区、动态调整算子流程结构等。
277 31
Apache Flink 流批融合技术介绍
|
14天前
|
存储 API
vue3中如何动态自定义创建组件并挂载
vue3中如何动态自定义创建组件并挂载
206 90
|
10天前
|
JSON 搜索推荐 API
抖音商品详情API接口:获取商品信息的指南
抖音商品详情API接口由抖音开放平台提供,允许第三方应用访问抖音小店的商品数据,包括基本信息、价格、库存及用户评价等。其优势在于数据实时性、自动化处理、市场分析及个性化推荐。通过注册账号、获取API密钥、阅读文档和构建请求,用户可高效获取商品信息,提升运营效率。未来,该接口将在电商领域发挥更大作用。
|
13天前
|
机器学习/深度学习 人工智能 算法
植物病害识别系统Python+卷积神经网络算法+图像识别+人工智能项目+深度学习项目+计算机课设项目+Django网页界面
植物病害识别系统。本系统使用Python作为主要编程语言,通过收集水稻常见的四种叶片病害图片('细菌性叶枯病', '稻瘟病', '褐斑病', '稻瘟条纹病毒病')作为后面模型训练用到的数据集。然后使用TensorFlow搭建卷积神经网络算法模型,并进行多轮迭代训练,最后得到一个识别精度较高的算法模型,然后将其保存为h5格式的本地模型文件。再使用Django搭建Web网页平台操作界面,实现用户上传一张测试图片识别其名称。
65 21
植物病害识别系统Python+卷积神经网络算法+图像识别+人工智能项目+深度学习项目+计算机课设项目+Django网页界面
|
10天前
|
人工智能 自然语言处理 机器人
实战精选 | 5分钟利用 OpenVINO™ 部署 Qwen2.5
本文将以 Qwen2.5-7B-Instruct 为例,介绍如何利用 OpenVINO™ 的 Python API 在本地部署 Qwen2.5 系列模型。
实战精选 | 5分钟利用 OpenVINO™ 部署 Qwen2.5
|
1天前
|
移动开发 JavaScript 前端开发
HTML5 表单属性详解
HTML5引入了多种新的表单属性,使表单创建与验证更加便捷高效。新增的输入类型包括`email`、`url`、`tel`等,常用属性有`placeholder`、`required`等。表单元素如`&lt;form&gt;`可设置提交方法和目标URL,`&lt;button&gt;`及`&lt;input type=&quot;submit&quot;&gt;`用于提交。新元素`&lt;datalist&gt;`和`&lt;output&gt;`提供更多功能。HTML5还提供了内置表单验证机制,增强用户体验。
|
1天前
|
移动开发 开发者 UED
HTML5 语义元素详解
HTML5引入了诸多语义元素
|
14天前
|
Windows
windows 11 恢复右键传统菜单
windows 11 恢复右键传统菜单