百科狗-知识改变命运!
--

<script setup> - 单文件组合(SFC)

乐乐1年前 (2023-11-21)阅读数 23#技术干货
文章标签组件

里面的代码会被编译成组件setup()函数的内容。这意味着与普通的

{{ msg }}

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

 
{{ capitalize('hello') }}


响应式

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

 {{ count }} 


使用组件

MyComponent看做被一个变量所引用。如果你使用过 JSX,在这里的使用它的心智模型是一样的。其kebab-case格式的同样能在模板中使用。不过,我们强烈建议使用PascalCase格式以保持一致性。同时也有助于区分原生的自定义元素。


动态组件

由于组件被引用为变量而不是作为字符串键来注册的,在

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


递归组件

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

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

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


命名空间组件

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

 label 


使用自定义指令

<script setup> - 单文件组合(SFC)

全局注册的自定义指令将以符合预期的方式工作,且本地注册的指令可以直接在模板中使用,就像上文所提及的组件一样。

但这里有一个需要注意的限制:必须以vNameOfDirective的形式来命名本地自定义指令,以使得它们可以直接在模板中使用。

 

This is a Heading


defineProps 和 defineEmits

  • definePropsdefineEmits都是只在

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


    useSlots 和 useAttrs

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

    与普通的

    警告:该场景下不支持使用render函数。请使用一个普通的

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

    asyncsetup()必须与Suspense组合使用,Suspense目前还是处于实验阶段的特性。我们打算在将来的某个发布版本中开发完成并提供文档。


    仅限 TypeScript 的功能

    仅限类型的 props/emit 声明

    propsemits都可以使用传递字面量类型的纯类型语法做为参数给definePropsdefineEmits来声明:

    const props = defineProps()
    
    const emit = defineEmits()
    
    • definePropsdefineEmits只能是要么使用运行时声明,要么使用类型声明。同时使用两种声明方式会导致编译报错。
    • 使用类型声明的时候,静态分析会自动生成等效的运行时声明,以消除双重声明的需要并仍然确保正确的运行时行为。

      • 在开发环境下,编译器会试着从类型来推断对应的运行时验证。例如这里从foo: string类型中推断出foo: String。如果类型是对导入类型的引用,这里的推断结果会是foo: null(与any类型相等),因为编译器没有外部文件的信息。
      • 在生产模式下,编译器会生成数组格式的声明来减少打包体积(这里的 props 会被编译成['foo','bar'])。
      • 生成的代码仍然是有着类型的 Typescript 代码,它会在后续的流程中被其它工具处理。
    • 截至目前,类型声明参数必须是以下内容之一,以确保正确的静态分析:

      • 类型字面量
      • 在同一文件中的接口或类型字面量的引用

      现在还不支持复杂的类型和从其它文件进行类型导入。理论上来说,将来是可能实现类型导入的。


    使用类型声明时的默认 props 值

    仅限类型的defineProps声明的不足之处在于,它没有可以给 props 提供默认值的方式。为了解决这个问题,提供了withDefaults编译器宏:

    interface Props {
        msg?: string
        labels?: string[]
    }
    
    const props = withDefaults(defineProps(), {
        msg: 'hello',
        labels: () => ['one', 'two']
    })
    

    上面代码会被编译为等价的运行时 props 的default选项。此外,withDefaults辅助函数提供了对默认值的类型检查,并确保返回的props的类型删除了已声明默认值的属性的可选标志。


    限制:没有 Src 导入

    由于模块执行语义的差异,中的代码依赖单文件组件的上下文。当将其移动到外部的.js或者.ts文件中的时候,对于开发者和工具来说都会感到混乱。因而不能和src attribute 一起使用。

鹏仔微信 15129739599 鹏仔QQ344225443 鹏仔前端 pjxi.com 共享博客 sharedbk.com

免责声明:我们致力于保护作者版权,注重分享,当前被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理!邮箱:344225443@qq.com)

图片声明:本站部分配图来自网络。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

内容声明:本文中引用的各种信息及资料(包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主体(包括但不限于公司、媒体、协会等机构)的官方网站或公开发表的信息。部分内容参考包括:(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供参考使用,不准确地方联系删除处理!本站为非盈利性质站点,本着为中国教育事业出一份力,发布内容不收取任何费用也不接任何广告!)