Vue3 setup

Vue3 中的 `setup` 是一个新配置项,它在组件实例创建前执行,用于设置组件状态和方法。返回的对象或渲染函数会被合并到渲染上下文。在 `setup` 中定义的属性和方法在模板中可以直接使用,但不能访问到 `data` 等配置。建议避免与 `data` 等混用,并注意返回值不能是函数,以免模板无法识别。此外,`setup` 接收 `props` 参数,它是响应式的,同时可以访问到 `slots` 和 `attrs`。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概念

setupVue3.0中一个新的配置项,其值为一个函数。

组件中所用到的数据、方法等等,都要在setup中配置。

执行时机

在创建组件实例时,在beforeCreate之前执行(一次), 此时组件对象还没有创建,在初始化组件解析之后调用setup。(在生命周期方面,在beforeCreate钩子之前调用)

setup 方法是在 components , props , data , Methods , Computed , Lifecycle , methods 之前执行。

返回值

setup 中定义的状态、方法如果要在模板中使用,必须 returnsetup函数有两种return返回值:

1、一般都是返回一个对象,为模板提供数据,对象中的属性、方法被合并到渲染上下文,在模板中可以直接使用此对象中的所有属性/方法;

2、若返回一个渲染函数:则可以自定义渲染内容。

例如: return () => h(‘div’, [count.value, object.foo])

注意点

  1. setup 尽量不要与 Vue2.x 配置混用
  2. Vue2.x配置(data、methos、computed…)中可以访问到setup中的属性、方法
  3. 但是在setup中不能访问到Vue2.x配置(data、methos、computed…
  4. 如果有重名, setup优先
  5. setup不能是一个async函数,因为返回值不再是return的对象, 而是promise,模板看不到return对象中的属性。(后期也可以返回一个Promise实例,但需要Suspense和异步组件的配合)

实例

<template>
  <div>
    <h1></h1>
    <div>
      <p>msg is: {
   
   {
   
    msg }}<
### Vue 3 中 `setup` 语法糖的使用指南 #### 什么是 `setup` 语法糖? Vue 3 的 `<script setup>` 是一种新的语法糖,它简化了组件开发流程。通过这种语法糖,开发者无需显式调用 `setup()` 函数或手动返回对象即可直接访问响应式数据和方法[^1]。 --- #### 基础用法 以下是 `<script setup>` 的基本结构: ```html <script setup> import { ref, reactive } from &#39;vue&#39; // 定义响应式数据 const count = ref(0) // 定义复杂状态管理 const state = reactive({ name: &#39;Vue&#39;, version: 3, }) // 自定义方法 const increment = () => { count.value++ } </script> <template> <div> <h1>{{ state.name }} {{ state.version }}</h1> <p>Count is: {{ count }}</p> <button @click="increment">Increment</button> </div> </template> ``` 在这个例子中,`count` 和 `state` 都可以在模板中直接使用而无需显式的 `return {}` 操作[^2]。 --- #### 组件间的通信 当父组件需要操作子组件的状态时,可以通过 `defineExpose` 显式暴露特定的数据或方法给外部引用[^5]。 ##### 子组件 (Child.vue) ```html <script setup> import { reactive, toRefs } from &#39;vue&#39; const data = reactive({ modelVisible: false, }) defineExpose({ ...toRefs(data) }) </script> <template> <p v-if="modelVisible">Model Visible!</p> </template> ``` ##### 父组件 (Parent.vue) ```html <script setup> import Child from &#39;./Child.vue&#39; import { ref } from &#39;vue&#39; const childRef = ref(null) const toggleVisibility = () => { if (childRef.value) { childRef.value.modelVisible = !childRef.value.modelVisible } } </script> <template> <Child ref="childRef" /> <button @click="toggleVisibility">Toggle Visibility</button> </template> ``` 在这里,`defineExpose` 将子组件的部分状态暴露给了父组件,从而实现了跨组件交互。 --- #### 属性绑定与事件监听 在 `<script setup>` 中,属性 (`props`) 和事件 (`emits`) 可以通过解构的方式直接声明并使用[^4]。 ##### 示例代码 ```html <script setup> import { defineProps, defineEmits } from &#39;vue&#39; // 解构 props const props = defineProps([&#39;title&#39;]) // 定义 emits const emit = defineEmits([&#39;update:title&#39;]) </script> <template> <div> <h1>{{ title }}</h1> <input :value="title" @input="$emit(&#39;update:title&#39;, $event.target.value)" /> </div> </template> ``` 此示例展示了如何利用 `defineProps` 接收父级传递的参数,并通过 `defineEmits` 向外发送事件通知[^4]。 --- #### 路由集成 对于基于 Vue Router 的项目,在 `<script setup>` 下依然能够轻松实现动态路由跳转等功能[^3]。 ```html <script setup> import { useRouter } from &#39;vue-router&#39; const router = useRouter() function navigateToHome() { router.push(&#39;/&#39;) } </script> <template> <button @click="navigateToHome">Go Home</button> </template> ``` 上述片段说明了如何借助组合 API 提供的功能完成页面导航逻辑。 --- ### 总结 综上所述,Vue 3 的 `<script setup>` 不仅大幅减少了样板代码量,还提升了可读性和维护效率。无论是简单的 UI 渲染还是复杂的业务场景处理,都可以依靠这一特性快速构建高效的应用程序[^1]^。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值