vue3 组合式 API:setup()

Vue3.0组合式API:setup()函数 setup() 函数是一个新的组件选项,它是组件内部使用组合式 API 的入口。setup() 函数在组件实例创建之前,初始化 Prop 之后调用,而且setup() 函数是在 beforeCreate 钩子函数之前调用。setup() 函数可以返回一个对象或函数,对象的属性会合并到组件模板渲染的上下文中。setup() 函数可以接收两个可选的参数。第一个参数是响应式的 props 对象,第二个参数是一个上下文(context)对象。 阅读详情

查看vue3官网介绍:组合式 API:setup()

在 Vue 3 中,组合式 API 的 setup() 函数是一个非常重要的特性,它提供了一种更灵活和可维护的方式来组织组件的逻辑。

基本概念

setup() 函数是在组件实例创建之前执行的,它用于组合组件的逻辑,包括响应式数据、方法、计算属性、监听等。它接收两个参数:props 和 context,并返回一个对象,其中包含可以在组件模板中使用的属性和方法。

特点

  • setup函数返回的对象中的内容,可直接在模板中使用。
  • setup中访问this是undefined。
  • setup函数会在beforeCreate之前调用,它是“领先”所有钩子执行的。

示例:

<template>
  <div>
    <div>姓名:{{name}}</div>
    <div>年龄:{{age}}</div>
    <button @click="changeName">修改名字</button>
    <button @click="changeAge">修改年龄</button>
  </div>
</template>
<script lang="ts">
export default {
  name: 'Person',
  setup() {
  	console.log(this);  // undefined
    // 数据(在setup中直接声明变量,此时的name、age、tel都不是响应式的数据)
    // 注意:直接声明变量,数据不是响应式的。
    let name = '张三'
    let age = 36

    // 方法
    function changeName() {
      console.log('change name')
      name = 'John'  // 这样修改name,页面是不会响应的
      console.log('changed name: ' + name); // changed name: John
      //  成功修改 name ,但是页面没有响应
    }
    function changeAge() {
      age--
      console.log(age);
      // 成功修改 age ,但是页面没有响应
    }
    // 在 setup() 函数中返回的对象会暴露给模板和组件实例。
    // 将数据、方法暴露出去,模板中才可以使用
    return { name, age, changeName, changeAge}
  }
}
</script>

setup函数的返回值

  • 若返回一个对象:则对象中的:属性、方法等,在模板中均可以直接使用。
  • 若返回一个渲染函数:则可以自定义渲染内容。代码如下:
// 不论页面模板是什么样,直接渲染返回的内容
setup(){
  return ()=> 'vue3起飞!'
}

参数 Props

setup 函数的第一个参数是组件的 props。和标准的组件一致,一个 setup 函数的 props 是响应式的,并且会在传入新的 props 时同步更新。

通过参数props,组件可以接收来自父组件传递下来的属性值。

<template>
  <div>{{ message }}</div>
</template>

<script>
export default {
  setup(props) {
    // props.message 是响应式的,当父组件传递的 message 属性值变化时,这里也会更新
    return {
      message: props.message,
    };
  },
  props: {
    message: String,
  },
};
</script>

在这个例子中,setup函数接收 props作为参数,并将 props.message的值返回给模板使用。当父组件中修改 message属性的值时,子组件中的显示也会同步更新。

如果解构props 对象,解构出来的变量会失去响应性。因此,通过 props.xxx 的形式来使用其中的 props。

如果要解构props 对象,并且要解构出来的变量保持响应性,可以使用 vue3响应式工具 toRefs() 和 toRef() :

import { toRefs, toRef } from 'vue'

export default {
  setup(props) {
    // 将 `props` 转为一个其中全是 ref 的对象,然后解构
    const { title } = toRefs(props)
    // `title` 是一个追踪着 `props.title` 的 ref
    console.log(title.value)

    // 或者,将 `props` 的单个属性转为一个 ref
    const title = toRef(props, 'title')
  }
}

更多关于Props的使用,请看vue3 Props的用法(父传子)

参数 context(Setup 上下文)

传入 setup 函数的第二个参数是一个 Setup 上下文对象。上下文对象暴露了其他一些在 setup 中可能会用到的值:

export default {
  setup(props, context) {
    // 透传 Attributes(非响应式的对象,等价于 $attrs)
    console.log(context.attrs)

    // 插槽(非响应式的对象,等价于 $slots)
    console.log(context.slots)
    // 通过 slots.default() 来获取默认插槽的内容
    const slotContent = context.slots.default();

    // 触发自定义事件(函数,等价于 $emit)
    console.log(context.emit)
    // 自定义事件 customEvent
    const triggerEvent = () => {
      context.emit('customEvent', 'Some data');
    };

    // 暴露公共属性(函数)
    console.log(context.expose)
  }
}

在函数内部:

  • 通过 context.attrs 访问了父组件传递的非 prop 属性。
    • 包含了父组件传递给当前组件的所有非 prop 属性,即没有被组件明确声明为 props 的属性。
  • 通过 context.slots 访问了插槽内容。
    • 通过 slots 对象,可以获取到组件中定义的各种插槽的具体内容,并在组件的逻辑中进行处理和渲染。
  • 通过 context.emit 触发了自定义事件。
    • 通过调用 emit 函数,可以向父组件发送事件通知,并传递相应的数据。
  • 通过 context.expose 显式地限制该组件暴露出的属性。

Setup 上下文对象是非响应式的,可以安全地解构:

export default {
  setup(props, { attrs, slots, emit, expose }) {
    ...
  }
}

暴露公共属性

expose 函数允许开发者明确指定一个组件实例应该对外暴露哪些属性和方法。
当父组件通过模板引用访问该组件的实例时,仅能访问 expose 函数暴露出的内容:

<template>
  <!-- 组件的模板内容 -->
</template>

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

export default {
  setup() {
    const internalData = ref('Internal data');
    const internalMethod = () => {
      console.log('Internal method called');
    };

    const exposedData = ref('Exposed data');
    const exposedMethod = () => {
      console.log('Exposed method called');
    };

    // 使用 expose 函数限制暴露的属性和方法
    expose({
      exposedData,
      exposedMethod,
    });

    return {
      exposedData,
      exposedMethod,
    };
  },
};
</script>

在这个例子中,组件内部有 internalData 、internalMethod 、 exposedData 和 exposedMethod方法。
通过 expose 函数,明确地限制了组件只暴露 exposedData 和 exposedMethod。父组件只能访问 exposedData 和 exposedMethod,不能访问 internalData 、internalMethod 。

setup()与选项式API的区别

  • setup 与 选项式API可以在vue3项目中同时存在。
  • 选项式API(如 data、methods、computed 等)中可以访问到 setup中的属性、方法。
    但在setup中不能访问到选项式API(如 data、methods、computed 等)。
    • 在选项式 API 中可以访问到 setup 中定义的属性和方法,这是因为 Vue 在处理组件时,会先执行 setup 函数,然后将其返回值与选项式 API 的内容进行合并,最终形成组件的实例。
    • 在 setup 函数中不能直接访问选项式 API(如 data、methods、computed 等),这是因为 setup 函数在组件实例创建之前执行,此时选项式 API 的内容还未被处理和合并到组件实例中。
  • 如果与选项式API冲突,则setup优先。
    • setup 的执行优先级更高,setup 返回的属性会覆盖选项式 API 中同名的属性。

示例:

<template>
  <div>
    <div>姓名:{{name}}</div>
    <div>年龄:{{age}}</div>
    <button @click="changeName">修改名字</button>
    <button @click="changeAge">修改年龄</button>

    <br />

    <div>选项式API data 里的数据:{{ otherName }}</div>
    <div>选项式API data 里读取setup函数中声明的变量: {{ setupName }}</div>
    <button @click="handleShow">选项式API methods 定义的方法:点击显示消息</button>
  </div>
</template>
<script lang="ts">
export default {
  name: 'Person',
  data() {
    return {
      otherName: '李四',
      setupName: this.name
    }
  },
  methods: {
    handleShow() {
      // 通过 this 访问 setup()中暴露的变量
      console.log(this.name)
    }
  },
  setup() {
  	console.log(this);  // undefined
    // 数据(在setup中直接声明变量,此时的name、age、tel都不是响应式的数据)
    // 注意:直接声明变量,数据不是响应式的。
    let name = '张三'
    let age = 36

    // 方法
    function changeName() {
      console.log('change name')
      name = 'John'  // 这样修改name,页面是不会响应的
      console.log('changed name: ' + name); // changed name: John
      //  成功修改 name ,但是页面没有响应
    }
    function changeAge() {
      age--
      console.log(age);
      // 成功修改 age ,但是页面没有响应
    }
    // 将数据、方法暴露出去,模板中才可以使用
    return { name, age, changeName, changeAge}
  }
}
</script>

在这里插入图片描述

与传统的选项式 API(如 data、methods、computed 等)相比,组合式 API 更加灵活和可组合。它允许将相关的逻辑封装在函数中,提高了代码的复用性和可读性。同时,组合式 API 也更好地支持 TypeScript,提供了更好的类型推断和代码提示。

setup 语法糖

在 Vue 3 中,<script setup>是一种语法糖,它极大地简化了组合式 API 的使用方式。

<script setup>语法糖,可以把setup独立出去:
在 Vue 组件中,使用<script setup>标签来代替传统的<script>标签。
在<script setup>中,不需要使用传统的export default语法来包裹组件的逻辑。可以直接定义响应式数据、计算属性、方法等,并且这些定义会自动暴露给模板使用(不需要return语句来暴露数据、方法)。

把上面例子中的setup函数改为<script setup>语法糖:

<script setup lang="ts">
console.log(this) // undefined
// 数据(在setup中直接声明变量,此时的name、age、tel都不是响应式的数据)
// 注意:直接声明变量,数据不是响应式的。
let name = '张三'
let age = 36

// 方法
function changeName() {
  console.log('change name')
  name = 'John' // 这样修改name,页面是不会响应的
  console.log('changed name: ' + name) // changed name: John
  //  成功修改 name ,但是页面没有响应
}
function changeAge() {
  age--
  console.log(age)
  // 成功修改 age ,但是页面没有响应
}
</script>

注意:用<script setup>改写setup函数后,现在有两个 <script> 标签:

  • 一个用于使用组合式 API 的 <script setup>。
  • 一个用于传统的选项式 API 和组件配置:
<script lang="ts">
export default {
  name: 'Person'
}
</script>

这个<script> 标签目前只用来配置组件的名称。

是否可以在<script setup>标签上写组件的名称呢?

插件vite-plugin-vue-setup-extend

vite-plugin-vue-setup-extend是一个用于增强 Vue 3 在 Vite 项目中使用<script setup>语法的插件。

在 插件vite-plugin-vue-setup-extend 中,有更详细的用法示例。

安装插件:

npm i vite-plugin-vue-setup-extend -D

在vite.config.js文件中,引入并使用该插件:

import VueSetupExtend from 'vite-plugin-vue-setup-extend'
// https://vitejs.dev/config/
export default defineConfig({
  plugins: [
    vue(),
    VueSetupExtend(),
  ]
})

修改<script setup>标签:

<script setup lang="ts" name="Person">
<script>

<script setup>更多用法,请看 vue3 语法糖<script setup>

vue3 组合式API:透传 Attributes(v-bing与:)—setup() 上下文对象ctx.attrs 阅读详情

相关推荐

Twin Builder CFD 示例:构建、验证和评估静态 ROM

通过我们构建、验证和评估静态 ROM 的综合指南,释放 Twin Builder CFD 的潜力。

jkh920184196的博客 1102

vue3的两种写法(组合式和选项式)

Vue3引入了组合式API,相比Vue2的选项式写法更加灵活简便。组合式写法将数据和方法集中管理,便于维护和复用,而选项式写法则将功能分散在不同选项中。官方推荐在复杂项目中使用组合式API。项目启动时,通过index.html加载main.ts,再引入App.vue根组件,最终呈现所有组件内容。组合式API已经成为Vue开发的主流选择。

2301_78646673的博客 4136

华为昇腾Atlas 200I DK A2实战:从开箱到运行首个AI应用

本文详细介绍了华为昇腾Atlas 200I DK A2开发板从开箱到运行首个AI应用的全过程。包括硬件准备、系统烧录、开发板连接方案、AI应用运行及性能优化技巧,帮助开发者快速上手部署AI项目,提升开发效率。

weixin_27038245的博客 591

VUE 3——4:组件内部的组合式 API

复用与组合对工程化的大项目更有意义,因此我们提前介绍了如何创建 Vue 3 项目,简单创建并使用了一些 SFC,接下来就来介绍如何实现 SPC 的复用与组合。

dangfulin的博客 3644

自适应动态规划硕士博士论文学习

强化学习关注随机过程中的序贯决策问题,而自适应动态规划关注动态系统的控制问题。吸引域:系统渐近稳定的区域。

DarlingLSA的博客 1425

英飞凌TLF35584 SBC实战:手把手教你配置WDG看门狗与ERR监控(基于AUTOSAR架构)

本文详细介绍了基于AUTOSAR架构的英飞凌TLF35584 SBC芯片WDG看门狗与ERR监控功能的配置方法。通过硬件平台搭建、寄存器级配置、AUTOSAR模块集成及诊断策略优化,帮助开发者快速掌握关键配置技巧,提升嵌入式系统的安全性和可靠性。

weixin_30256901的博客 477

Vue3中的API——选项式API、组合式API

和。对于熟悉Vue2的人来说,选项式api是一个很好的选择,但Vue3提供的组合式api对于代码复用效果更为突出。博主之前是用的React框架,现在由于工作原因换成了Vue,所以个人更倾向于Vue3的组合式api。现在博主将为大家详细介绍这两者的区别以及具体的操作。

weixin_73318685的博客 6532

基于ESP32的智能健康监测系统开发

本文介绍了如何基于ESP32开发智能健康监测系统,从硬件选型、系统架构到软件实现的每一个环节。通过ESP32的Wi-Fi功能、传感器模块和云平台的结合,我们实现了实时健康数据监测、远程查看、报警等功能。系统的低功耗特性使得其适用于长期健康监测,能够为用户提供更便捷的健康管理方案。随着技术的不断发展,未来智能健康监测系统将进一步发展。例如,增加更多的传感器,提升数据分析能力,甚至通过人工智能算法来预测用户的健康趋势,为用户提供个性化的健康建议。

2201_76125393的博客 1104

vue3选项式api与组合式api

选项式api与组合式api

weixin_45233925的博客 4511

Python爬虫实战:采集行业协会、研究机构等平台的政策文件列表与PDF链接批量收集系统,支持自动下载、分类归档和数据库管理(SQLite持久化存储)!

我长期专注 Python 爬虫工程化实战,主理专栏 👉 《Python爬虫实战》:从采集策略到反爬对抗,从数据清洗到分布式调度,持续输出可复用的方法论与可落地案例。内容主打一个“能跑、能用、能扩展”,让数据价值真正做到——抓得到、洗得净、用得上。

喵手的博客 640

基于 Simulink 的单相 PWM 整流器(四象限变流器)在高铁辅助电源系统中的建模与仿真实战教程

这是一份基于 Simulink 的实战教程。在高铁牵引供电与辅助电源系统中,单相 PWM 整流器(又称四象限变流器,4QC)是极其核心的“绿色电源”枢纽。传统的二极管整流器虽然结构简单,但会导致严重的输入电流畸变和低功率因数,对电网造成极大的谐波污染。而 PWM 整流器通过高频主动控制,不仅能将单相交流电转换为平稳的直流电,还能实现输入电流正弦化、单位功率因数(PF=1)运行,并支持能量双向流动(如列车再生制动时的能量回馈)。本教程将带你从数学模型出发,搭建一套高性能的电压电流双闭环控制系统。

amy_mhd的博客 47

Vue3:使用setup实现组合式开发

Vue

Brave_heart4pzj的博客 661

Video Diffusion Models:基于扩散模型的视频生成

Diffusion Models专栏文章汇总:入门与实战 前言:扩散模型已经被广泛运用到图像生成、image-to-image转换、时间序列生成、3D点云生成、文本生成、音频生成等领域,谷歌研究院最新的研究成果成功将diffusion models运用到视频生成领域。 目录 模型结构 分解时空体系联合训练 梯度条件法 恐怖的实验结果 论文和代码 个人启发 个人疑问? 模型结构 在前面的博文中,我详细介绍了为什么绝大部分的diffusion models都使用Unet结构.

沉迷单车的追风少年 6671

Vue 3 组合式 API 完全指南:从 Setup() 开始

Vue 3 组合式 API 彻底改变了 Vue 开发方式,通过 setup() 函数作为入口,提供了更灵活的逻辑组织方式。核心特性包括:响应式 API(ref/reactive)、生命周期钩子(onMounted等)、侦听器(watch)和计算属性(computed)。相比选项式 API,它能更好地处理复杂逻辑,提高代码复用性和可维护性。本文详细介绍了从基础概念到高级用法的完整知识体系,帮助开发者掌握这一现代化开发范式。

810

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

vue3:组合式 API:setup()

vue3:组合式 API:setup()

前端报刊 1196

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

vue3学习记录:setup()组合式Api 使用

props context

olderandyanger的博客 687

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Vue 3的组合式API中,setup()函数的两个参数:props和context。

参数来获取组件的属性、非响应式属性、插槽和触发事件的方法。函数中访问组件实例、父组件属性、全局属性等。此代码有该AI 助手为您带来的,v信小程序:欢迎评论留言交流学习。对象来使用这些属性。这个参数在Vue 2中是通过。函数在组件初始化期间只会执行一次,并且在。对象提供了一些有用的属性和方法,用于在。对象包含了组件接收的属性。在上面的示例中,我们使用了。函数中通过解构或直接访问。下面是一个示例,展示了。语句返回一个响应式对象。,使其在组件中可用。

lrbfly的博客 1270

vue3语法糖详解(setup()、<script setup>)

vue3语法详解(setup()、<script setup>)

夜空孤狼啸的博客 6893

vue3基础知识》学习笔记Day28-(Period2)组合式API:setup()访问 Props和Setup 上下文

setup()函数的第二个参数是一个Setup上下文对象,上下文对象暴露了其他一些在setup中可能会用到的值。setup函数中可以自动解析浅层解包,此函数访问this是undefined。setup函数的第一个参数是组件的props,会随着传入的值实时更新。可以使用toRefs()和toRef()解构props对象。

qq_38526167的博客 443

Vue 选项式 API vs 组合式 API:区别全解析

Vue3提供了选项式API和组合式API两种编码方式。选项式API沿用Vue2的写法,将代码按data、methods等选项分类,适合新手但逻辑分散;组合式API是Vue3新特性,按功能组织相关代码,无需使用this,支持更好的逻辑复用和TypeScript。核心区别在于代码组织方式和this的使用,前者按类型分组需要this连接,后者按功能分组直接使用变量。建议新手先学选项式API,进阶项目采用组合式API以获得更好的可维护性。

Filotimo_的博客 909

vue3中如何使用 getCurrentInstance()

Vue 3中的getCurrentInstance()API用于在组合式API中获取当前组件实例,主要适用于<script setup>、setup()函数或组合式函数场景。该API允许访问组件底层属性如proxy(替代this)、appContext(全局配置)等,常用于封装通用工具函数。使用时需注意:必须在组件生命周期内同步调用,异步场景需提前保存实例;生产环境优先使用proxy而非ctx;应遵循Vue 3"无this"理念,避免业务代码滥用。典型应用包括访问$refs、

大剑师兰特的GIS世界 711

setup() 函数与语法糖

Vue3的<script setup>语法糖相比传统setup()函数具有显著优势。传统写法需要手动return变量、注册组件,代码冗余;而<script setup>自动处理这些操作,无需return即可在模板使用变量,直接导入组件即可使用。两者功能相同,但<script setup>通过defineProps/defineEmits等API简化了props和emit的使用,代码更简洁。目前官方推荐使用<script setup>,它相当于自动挡版本,极大提

2401_83539958的博客 475

Vue 3 的setup函数与 <script setup>语法糖

Vue 3 的setup函数与 <script setup>语法糖:剥开表象,直击底层原理

前端工程师 · Vue 生态深耕者,专注多端与工程化 979

Vue3 使用 Store 的注意事项:官方推荐的方式始终是在 setup 或 composable 函数内部调用 useStore()

程序启动报错报错信息:pinia.js?

BillKu的博客 88

const { proxy } = getCurrentInstance() 的正确使用方法

Vue 3 中的 const { proxy } = getCurrentInstance() 用于替代 Vue 2 的 this,主要功能包括:访问全局属性/方法、操作 $refs、触发 $emit 事件等。使用时需注意:1) 必须在组件生命周期内同步获取实例;2) 异步场景需提前保存实例;3) 避免依赖 ctx 而应使用 proxy;4) 需做实例为空的兜底处理。典型应用场景包括调用全局 API、访问 DOM 元素和触发自定义事件等。开发中要特别注意生产环境和异步调用的兼容性问题。

大剑师兰特的GIS世界 652
上一篇: 插件vite-plugin-vue-setup-extend
下一篇: vue3 响应式 API:ref() 和 reactive()
fishmemory7sec
博客等级 码龄5年 1165粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值