vue3 setup语法糖请注意在script标签里加setup,不用return

Vue3引入了`setup`语法糖,通过在`<script setup>`标签中使用,可以省略组件注册、属性和方法的返回。本文介绍了`defineProps`、`defineEmits`和`useContext`这三个新API的用途,帮助开发者更便捷地处理父组件传值、声明事件和获取组件上下文。同时,展示了如何在使用语法糖后,无需配合`async`即可直接使用`await`,并提到了CSS变量注入和`nextTick`在路由导航守卫中的应用。

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

虽然Composition API用起来已经非常方便了,但是我们还是有很烦的地方,比如

  • 组件引入了还要注册

  • 属性和方法都要在setup函数中返回,有的时候仅一个return就十几行甚至几十行

  • 不想写啊怎么办

好办,Vue3官方提供了script setup语法糖

只需要在script标签中添加setup,组件只需引入不用注册,属性和方法也不用返回,setup函数也不需要,甚至export default都不用写了,不仅是数据,计算属性和方法,甚至是自定义指令也可以在我们的template中自动获得。

但是这么过瘾的语法糖,还是稍微添加了一点点心智负担,因为没有了setup函数,那么propsemitattrs怎么获取呢,就要介绍一下新的语法了。

setup script`语法糖提供了三个新的`API`来供我们使用:`defineProps`、`defineEmits`和`useContext

  • defineProps 用来接收父组件传来的值props

  • defineEmits 用来声明触发的事件表。

### 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]^。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值