vue 3.2 已经正式支持 <script setup> 语法,并且现在就可以在生产环境下使用了,接下开始学习基本用法。

<script setup> 是在单文件组件 (SFC) 中使用组合式 API 的编译时语法糖。相比于普通的 <script> 语法,它具有更多优势:

1.更少的样板内容,更简洁的代码。2.能够使用纯 Typescript 声明 props 和抛出事件。3.更好的运行时性能 (其模板会被编译成与其同一作用域的渲染函数,没有任何的中间代理)。4.更好的 IDE 类型推断性能 (减少语言服务器从代码中抽离类型的工作)。

基本语法

要使用这个语法,需要将 setup attribute 添加到 <script> 代码块上:

<script setup>
console.log('hello script setup')
</script>

里面的代码会被编译成组件 setup() 函数的内容。这意味着与普通的 <script> 只在组件被首次引入的时候执行一次不同,<script setup> 中的代码会在每次组件实例被创建的时候执行。

顶层的绑定会被暴露给模板

当使用 <script setup> 的时候,任何在 <script setup> 声明的顶层的绑定 (包括变量,函数声明,以及 import 引入的内容) 都能在模板中直接使用:

<script setup>
// 变量
const msg = 'Hello!'// 函数
function log() {console.log(msg)
}
</script><template><div @click="log">{{ msg }}</div>
</template>

import 导入的内容也会以同样的方式暴露。意味着可以在模板表达式中直接使用导入的 helper 函数,并不需要通过 methods 选项来暴露它:

<script setup>
import { capitalize } from './helpers'
</script><template><div>{{ capitalize('hello') }}</div>
</template>

响应式

响应式状态需要明确使用响应式 APIs 来创建。和从 setup() 函数中返回值一样,ref 值在模板中使用的时候会自动解包:

<script setup>
import { ref } from 'vue'const count = ref(0)
</script><template><button @click="count++">{{ count }}</button>
</template>

使用组件

<script setup> 范围里的值也能被直接作为自定义组件的标签名使用:

<script setup>
import MyComponent from './MyComponent.vue'
</script><template><MyComponent />
</template>

将 MyComponent 看做被一个变量所引用。

动态组件

由于组件被引用为变量而不是作为字符串键来注册的,在 <script setup> 中要使用动态组件的时候,就应该使用动态的 :is 来绑定:

<script setup>
import Foo from './Foo.vue'
import Bar from './Bar.vue'
</script><template><component :is="Foo" /><component :is="someCondition ? Foo : Bar" />
</template>

请注意组件是如何在三元表达式中被当做变量使用的。

递归组件

一个单文件组件可以通过它的文件名被其自己所引用。例如:名为 FooBar.vue 的组件可以在其模板中用 <FooBar/> 引用它自己。

请注意这种方式相比于 import 导入的组件优先级更低。如果有命名的 import 导入和组件的推断名冲突了,可以使用 import 别名导入:

import { FooBar as FooBarChild } from './components'

命名空间组件

可以使用带点的组件标记,例如 <Foo.Bar> 来引用嵌套在对象属性中的组件。这在需要从单个文件中导入多个组件的时候非常有用:

<script setup>
import * as Form from './form-components'
</script><template><Form.Input><Form.Label>label</Form.Label></Form.Input>
</template>

defineProps 和 defineEmits

在 <script setup> 中必须使用 defineProps 和 defineEmits API 来声明 props 和 emits ,它们具备完整的类型推断并且在 <script setup> 中是直接可用的:

<script setup>
const props = defineProps({foo: String
})const emit = defineEmits(['change', 'delete'])
// setup code
</script>

defineProps 和 defineEmits 都是只在 <script setup> 中才能使用的编译器宏。他们不需要导入且会随着 <script setup> 处理过程一同被编译掉。

defineProps 接收与 props 选项相同的值,defineEmits 也接收 emits 选项相同的值。

defineProps 和 defineEmits 在选项传入后,会提供恰当的类型推断。

传入到 defineProps 和 defineEmits 的选项会从 setup 中提升到模块的范围。因此,传入的选项不能引用在 setup 范围中声明的局部变量。这样做会引起编译错误。但是,它可以引用导入的绑定,因为它们也在模块范围内。

如果使用了 Typescript,使用纯类型声明来声明 prop 和 emits 也是可以的。

defineExpose

使用 <script setup> 的组件是默认关闭的,也即通过模板 ref 或者 $parent 链获取到的组件的公开实例,不会暴露任何在 <script setup> 中声明的绑定。

为了在 <script setup> 组件中明确要暴露出去的属性,使用 defineExpose 编译器宏:

<script setup>
import { ref } from 'vue'const a = 1
const b = ref(2)defineExpose({a,b
})
</script>

当父组件通过模板 ref 的方式获取到当前组件的实例,获取到的实例会像这样 { a: number, b: number } (ref 会和在普通实例中一样被自动解包)

useSlots 和 useAttrs

在 <script setup> 使用 slots 和 attrs 的情况应该是很罕见的,因为可以在模板中通过 $slots 和 $attrs 来访问它们。在你的确需要使用它们的罕见场景中,可以分别用 useSlots 和 useAttrs 两个辅助函数:

<script setup>
import { useSlots, useAttrs } from 'vue'const slots = useSlots()
const attrs = useAttrs()
</script>

useSlots 和 useAttrs 是真实的运行时函数,它会返回与 setupContext.slots 和 setupContext.attrs 等价的值,同样也能在普通的组合式 API 中使用。

与普通的 script 一起使用

<script setup> 可以和普通的 <script> 一起使用。普通的 <script> 在有这些需要的情况下或许会被使用到:

1.无法在 <script setup> 声明的选项,例如 inheritAttrs 或通过插件启用的自定义的选项。2.声明命名导出。3.运行副作用或者创建只需要执行一次的对象。

<script>
// 普通 <script>, 在模块范围下执行(只执行一次)
runSideEffectOnce()// 声明额外的选项
export default {inheritAttrs: false,customOptions: {}
}
</script><script setup>
// 在 setup() 作用域中执行 (对每个实例皆如此)
</script>

顶层 await

<script setup> 中可以使用顶层 await。结果代码会被编译成 async setup()

<script setup>
const post = await fetch(`/api/post/1`).then(r => r.json())
</script>

另外,await 的表达式会自动编译成在 await 之后保留当前组件实例上下文的格式。

vue 3.2 的 script setup 语法相关推荐

  1. 介绍一下 Vue Conf 21 大会上:尤大提到 script setup 语法!

    作者:Matt Maribojoc 译者:前端小智 来源:stackabuse 有梦想,有干货,微信搜索 [大迁世界] 关注这个在凌晨还在刷碗的刷碗智. 本文 GitHub https://githu ...

  2. Vue3 script setup 语法糖详解

    前言: 目前setup sugar已经进行了定稿,vue3 + setup sugar + TS的写法看起来很香,写本文时 Vue 版本是 "^3.2.6" 1.script se ...

  3. script setup 语法使用

    vue3.2正式版已经发布,script setup语法已经由实验性质改为了正式语法,可以放心大胆的在项目中用了. 官方文档:https://v3.cn.vuejs.org/api/sfc-scrip ...

  4. script setup 实验性 vue 语法

    这是一个简单的计数器例子,模板中使用 count 变量,inc 函数. <template><button @click="inc">{{count}}&l ...

  5. Vue setup语法糖

    Vue setup语法糖 setup语法糖指的是Vue组件当中的setup字段 是 Vue3 的一个新语法糖,在 setup 函数中. 所有 ES 模块导出都被认为是暴露给上下文的值,并包含在 set ...

  6. vue3 setup语法糖与原始写法对比

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

  7. vue3.2 setup语法糖,你值得拥有

    0.前言 在vue3中删除了vue2中的data函数,因此,vue3.0要在template中使用某些变量就必须在最后return出来,多次声明变量,不太方便,也不太友好.而在vue3.2版本之后,我 ...

  8. vue3之语法糖script setup的父子组件、兄弟组件传值

    背景:随着vue的使用范围越来越广,使用人数越来越多,其的发展更新速度也是再上一个台阶,vue2故好,但组件化过程中的某些组件化操作稍微有一些弊端,从而vue3随之诞生,vue3兼容typescrip ...

  9. vue3 + ts <script setup>语法糖

    这里是引用 1.data 2.computed 3.父传子 4.子传父 5.原型链绑定和组件使用 6.父子组件 v-model 7.nextTick 8.插槽 9.路由useRoute和useRout ...

最新文章

  1. nmap 获取主机名
  2. mybatis获取表名_mybatis动态调用表名和字段名
  3. 网络排错模型之我见----模型,基线,协议,数据包
  4. creat-react-app 支持 less
  5. Linux中,根目录下文件夹的含义
  6. 查看数据库开了inodb_Mysql中查看表的类型InnoDB
  7. Java编程提高性能时需注意的地方
  8. 结构体、文件操作、指针
  9. 管家婆 经营历程 Date exceeds maximum of 19-12-31 报错解决补丁包
  10. 一些排序算法的Python实现
  11. 轻盈潇洒卓然不群,敏捷编辑器Sublime text 4中文配置Python3开发运行代码环境(Win11+M1 mac)
  12. 软件测试行业到底有没有前景和出路?软件测试职业发展方向总结
  13. 面试最常问的设计模式
  14. 小程序转码机器人-微信小程序转二维码
  15. 学姐的大厂面试总结,想进大厂的必看!!!
  16. 关于motionevent的使用
  17. 电子邮件头Received分析
  18. Linux中超级用户root的密码破解与防止破解方法
  19. 网页自动保存的密码忘记 如何查看密码
  20. System.ArgumentNullException: Value cannot be null. (Parameter connectionString)at Microsoft.Entit

热门文章

  1. 你知道怎么用Python发送邮件吗?
  2. 华为轮值董事长郭平:5“机”协同是基础电力,ICT行业应用将像家用电器和工业电气化
  3. 一文入魂!聊透分布式系统一致性!
  4. Vue.js 作者尤雨溪:TypeScript 与 JavaScript 并行才切合实际!
  5. 移动互联网这十年,跨平台技术的演进及 Flutter 的未来
  6. 微软员工揭秘 Windows 的 Linux 子系统研发全过程
  7. 三十年软件开发之路:老码农的自我修养!
  8. 你的早鸟票特权仅剩2天!百度、快手、商汤、图森等重磅嘉宾确认出席AI ProCon 2019...
  9. 漫画:如何给女朋友解释什么是编译与反编译
  10. 如果 AI 技术可以让你永生,你愿意么?