广告
返回顶部
首页 > 资讯 > 精选 >Vue3中的script setup语法糖怎么使用
  • 768
分享到

Vue3中的script setup语法糖怎么使用

2023-07-04 15:07:13 768人浏览 独家记忆
摘要

这篇文章主要介绍了vue3中的script setup语法糖怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Vue3中的script setup语法糖怎么使用文章都会有所收获,下面我们一起来看看吧。scr

这篇文章主要介绍了vue3中的script setup语法糖怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Vue3中的script setup语法糖怎么使用文章都会有所收获,下面我们一起来看看吧。

script setup 语法糖

组合式 API:setup()

基本使用

Vue 3 的 Composition api 系列里,推出了一个全新的 setup 函数,它是一个组件选项,在创建组件之前执行,一旦 props 被解析,并作为组合式 API 的入口点。

setup 选项是一个接收 props 和 context 的函数,我们参考文档进行讨论。此外,我们将 setup 返回的所有内容都暴露给组件的其余部分 (计算属性、方法、生命周期钩子等等) 以及组件的模板。

<script>// 这是一个基于 typescript 的 Vue 组件import { defineComponent } from 'vue'export default defineComponent({  setup(props, context) {    // 在这里声明数据,或者编写函数并在这里执行它    return {      // 需要给 `<template />` 用的数据或函数,在这里 `return` 出去    }  },})</script>

新的 setup 选项是在组件创建之前props 被解析之后执行,是组合式 API 的入口。

注意:
在 setup 中你应该避免使用 this,因为它不会找到组件实例。setup 的调用发生在 data property、computed property 或 methods 被解析之前,所以它们无法>在 setup 中被获取。

在添加了setup的script标签中,我们不必声明和方法,这种写法会自动将所有顶级变量、函数,均会自动暴露给模板(template)使用
这里强调一句 “暴露给模板,跟暴露给外部不是一回事

TIP:说的通俗一点,就是在使用 Vue 3 生命周期的情况下,整个组件相关的业务代码,都可以放在 setup 里执行。

因为在 setup 之后,其他的生命周期才会被启用,我们对比一下Vue2的Vue3生命周期的变化

组件生命周期

关于 Vue 生命周期的变化,可以从下表直观地了解:

Vue 2 生命周期Vue 3 生命周期执行时间说明
beforeCreatesetup组件创建前执行
createdsetup组件创建后执行
beforeMountonBeforeMount组件挂载到节点上之前执行
mountedonMounted组件挂载完成后执行
beforeUpdateonBeforeUpdate组件更新之前执行
updatedonUpdated组件更新完成之后执行
beforeDestroyonBeforeUnmount组件卸载之前执行
destroyedonUnmounted组件卸载完成后执行
errorCapturedonErrorCaptured当捕获一个来自子孙组件的异常时激活钩子函数

可以看到 Vue 2 生命周期里的 beforeCreate 和 created ,在 Vue 3 里已被 setup 替代。

script setup 语法糖

它是 Vue3 的一个新语法糖,在 setup 函数中。所有 ES 模块导出都被认为是暴露给上下文的值,并包含在 setup() 返回对象中。相对于之前的写法,使用后,语法也变得更简单。

自动注册属性和方法无需返回,直接使用

1.<script setup> 语法糖并不是新增的功能模块,它只是简化了以往的组合API(compositionApi)的必须返回(return)的写法,并且有更好的运行时性能。

2.在 setup 函数中:所有 ES 模块导出都被认为是暴露给上下文的值,并包含在 setup() 返回对象中。相对于之前的写法,使用后,语法也变得更简单。

你不必担心setup语法糖的学习成本,他是组合式API的简化,并没有新增的知识点。你只需要了解一些用法和细微的不同之处,甚至比之前写setup()还要顺手!

使用方式也很简单,只需要在 script 标签加上 setup 关键字即可

<script setup></script>

组件核心 API 的使用

组件自动注册

在 script setup 中,引入的组件可以直接使用,无需再通过components进行注册,并且无法指定当前组件的名字,它会自动以文件名为主,也就是不用再写name属性了。

示例

<template><Child /></template><script setup>import Child from '@/components/Child.vue'</script>

定义组件的 props

defineProps ----> [用来接收父组件传来的 props] 代码示列

通过defineProps指定当前 props 类型,获得上下文的props对象。

示例:

<script setup>  import { defineProps } from 'vue'  const props = defineProps({    title: String,  })</script><!-- 或者 --><script setup>     import { ref,defineProps } from 'vue';        type Props={         msg:string     }    defineProps<Props>(); </script>

定义 emit

defineEmit ----> [子组件向父组件事件传递]

使用defineEmit定义当前组件含有的事件,并通过返回的上下文去执行 emit。

代码示列

<script setup>  import { defineEmits } from 'vue'  const emit = defineEmits(['change', 'delete'])  </script>

父子组件通信

defineProps 用来接收父组件传来的 props ; defineEmits 用来声明触发的事件。

//父组件<template><Child @getChild="getChild" :title="msg" /></template><script setup>import { ref } from 'vue'import Child from '@/components/Child.vue'const msg = ref('parent value')const getChild = (e) => {// 接收父组件传递过来的数据console.log(e); // child value}</script>

//子组件<template><div @click="toEmits">Child Components</div></template><script setup>// defineEmits,defineProps无需导入,直接使用const emits = defineEmits(['getChild']);const props = defineProps({title: {type: String,defaule: 'defaule title'}});const toEmits = () => {emits('getChild', 'child value') // 向父组件传递数据}// 获取父组件传递过来的数据console.log(props.title); // parent value</script>

子组件通过 defineProps 接收父组件传过来的数据,子组件通过 defineEmits 定义事件发送信息给父组件

useSlots() 和 useAttrs()

获取 slots 和 attrs

注:useContext API 被弃用,取而代之的是更加细分的 api。

可以通过useContext从上下文中获取 slots 和 attrs。不过提案在正式通过后,废除了这个语法,被拆分成了useAttrsuseSlots

  • useAttrs:见名知意,这是用来获取 attrs 数据,但是这和 vue2 不同,里面包含了 class属性方法

<template>    <component v-bind='attrs'></component></template><srcipt setup>   const attrs = useAttrs();<script>
  • useSlots: 顾名思义,获取插槽数据。

使用示例:

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

defineExpose API

defineExpose ----> [组件暴露出自己的属性]

传统的写法,我们可以在父组件中,通过 ref 实例的方式去访问子组件的内容,但在 script setup 中,该方法就不能用了,setup 相当于是一个闭包,除了内部的 template模板,谁都不能访问内部的数据和方法。

<script setup> 的组件默认不会对外部暴露任何内部声明的属性。
如果有部分属性要暴露出去,可以使用 defineExpose

注意:目前发现defineExpose暴露出去的属性以及方法都是 unknown 类型,如果有修正类型的方法,欢迎评论区补充。

如果需要对外暴露 setup 中的数据和方法,需要使用 defineExpose API。示例

//子组件<template>{{msg}}</template><script setup>import { ref } from 'vue'let msg = ref("Child Components");let num = ref(123);// defineExpose无需导入,直接使用defineExpose({msg,num});</script>

//父组件<template><Child ref="child" /></template><script setup>import { ref, onMounted } from 'vue'import Child from '@/components/Child.vue'let child = ref(null);onMounted(() => {console.log(child.value.msg); // Child Componentsconsole.log(child.value.num); // 123})</script>

定义响应变量、函数、监听、计算属性computed

<script setup > import { ref,computed,watchEffect } from 'vue';const count = ref(0); //不用 return ,直接在 templete 中使用const addCount=()=>{ //定义函数,使用同上     count.value++; } //创建一个只读的计算属性 ref:const plusOne = computed(() => count.value + 1)// 创建一个可写的计算属性 refconst plusOne = computed({get: () => count.value + 1, set: (val) => { count.value = val - 1 } })//定义监听,使用同上 //...some code else watchEffect(()=>console.log(count.value)); </script>
watchEffect和watch区别

1、watch是惰性执行,也就是只有监听的值发生变化的时候才会执行,但是watchEffect不同,每次代码加载watchEffect都会执行(忽略watch第三个参数的配置,如果修改配置项也可以实现立即执行)

2、watch需要传递监听的对象,watchEffect不需要

3、watch只能监听响应式数据:ref定义的属性和Reactive定义的对象,如果直接监听reactive定义对象中的属性是不允许的,除非使用函数转换一下

4、watchEffect如果监听reactive定义的对象是不起作用的,只能监听对象中的属性。

reactive

返回一个对象的响应式代理。

<script setup>import { reactive, onUnmounted } from 'vue'const state = reactive({    counter: 0})// 定时器 每秒都会更新数据const timer = setInterval(() => {    state.counter++}, 1000);onUnmounted(() => {    clearInterval(timer);})</script><template>    <div>{{state.counter}}</div></template>

使用ref也能达到我们预期的'counter',并且在模板中,vue进行了处理,我们可以直接使用counter而不用写counter.value.

ref和reactive的关系:

ref是一个{value:'xxxx'}的结构,value是一个reactive对象

ref 暴露变量到模板

曾经的提案中,如果需要暴露变量到模板,需要在变量前加入export声明:

export const count = ref(0)

不过在新版的提案中,无需export声明,编译器会自动寻找模板中使用的变量,只需像下面这样简单的声明,即可在模板中使用该变量

<script setup >import { ref } from 'vue'const counter = ref(0);//不用 return ,直接在 templete 中使用const timer = setInterval(() => {    counter.value++}, 1000)onUnmounted(() => {    clearInterval(timer);})</script><template>    <div>{{counter}}</div></template>

其他 Hook Api
  • useCSSModuleCSS Modules 是一种 CSS 的模块化和组合系统。vue-loader 集成 CSS Modules,可以作为模拟 scoped CSS。允许在单个文件组件的setup中访问CSS模块。此 api 本人用的比较少,不过多做介绍。

  • useCssVars: 此 api 暂时资料比较少。介绍v-bind in styles时提到过。

  • useTransitionState: 此 api 暂时资料比较少。

  • useSSRContext: 此 api 暂时资料比较少。

支持 async await 异步

注意在vue3的源代码中,setup执行完毕,函数 getCurrentInstance 内部的有个值会释放对 currentInstance 的引用,await 语句会导致后续代码进入异步执行的情况。所以上述例子中最后一个 getCurrentInstance() 会返回 null,建议使用变量保存第一个 getCurrentInstance() 返回的引用.

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

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

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

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

注意
async setup() 必须与 Suspense 组合使用,Suspense 目前还是处于实验阶段的特性。我们打算在将来的某个发布版本中开发完成并提供文档 - 如果你现在感兴趣,可以参照 tests 看它是如何工作的。

定义组件其他配置

配置项的缺失,有时候我们需要更改组件选项,在setup中我们目前是无法做到的。我们需要在上方再引入一个 script,在上方写入对应的 export即可,需要单开一个 script。

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

  • 无法在 <script setup> 声明的选项,例如 inheritAttrs 或通过插件启用的自定义的选项。

  • 声明命名导出。

  • 运行副作用或者创建只需要执行一次的对象。

在script setup 外使用export default,其内容会被处理后放入原组件声明字段。

<script>// 普通 `<script>`, 在模块范围下执行(只执行一次)runSideEffectOnce()// 声明额外的选项  export default {    name: "MyComponent",    inheritAttrs: false,    customOptions: {}  }</script><script setup>    import HelloWorld from '../components/HelloWorld.vue'    // 在 setup() 作用域中执行 (对每个实例皆如此)    // your code</script><template>  <div>    <HelloWorld msg="Vue3 + TypeScript + Vite"/>  </div></template>

注意:Vue 3 SFC 一般会自动从组件的文件名推断出组件的 name。在大多数情况下,不需要明确的 name 声明。唯一需要的情况是当你需要 <keep-alive> 包含或排除或直接检查组件的选项时,你需要这个名字。

关于“Vue3中的script setup语法糖怎么使用”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“Vue3中的script setup语法糖怎么使用”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网精选频道。

--结束END--

本文标题: Vue3中的script setup语法糖怎么使用

本文链接: https://www.lsjlt.com/news/346231.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Vue3中的script setup语法糖怎么使用
    这篇文章主要介绍了Vue3中的script setup语法糖怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Vue3中的script setup语法糖怎么使用文章都会有所收获,下面我们一起来看看吧。scr...
    99+
    2023-07-04
  • 怎么在Vue3中使用<script lang=“ts“ setup>语法糖
    迁移组件以下组件有两个道具(要显示的和一个标志)。通过另一个组件,计算模板中显示的小马图像的URL,基于这两个道具。该组件还会在用户单击它时发出一个事件。The image selected while the Ponypony ...
    99+
    2023-05-16
    Vue3 setup
  • 一文详解Vue3中的script setup语法糖
    在添加了setup的script标签中,我们不必声明和方法,这种写法会自动将所有顶级变量、函数,均会自动暴露给模板(template)使用这里强调一句 “暴露给模板,跟暴露给外部不是一回事”TIP:说的通俗一点,就是在使用 Vue 3 生命...
    99+
    2022-11-22
    前端 Vue.js
  • 如何在Vue3中使用<script lang=“ts“ setup>语法糖
    这篇“如何在Vue3中使用<script lang=“ts“ setup>语法糖”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下...
    99+
    2023-07-06
  • vue3:setup语法糖使用教程
    目录1.setup语法糖简介2.setup语法糖中新增的api2.1defineProps2.2defineEmits2.3defineExpose补充:与普通的script一起使用...
    99+
    2022-11-13
  • vue3更新的setup语法糖怎么用
    本文小编为大家详细介绍“vue3更新的setup语法糖怎么用”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue3更新的setup语法糖怎么用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。语法糖用法://&nb...
    99+
    2023-06-30
  • Vue3怎么使用setup语法糖拒绝写return
    defineProps 代替props接收父组件传递的数据(父组件向子组件传参)父组件:<template> <div>父组件</div> <Child :title="msg&q...
    99+
    2023-05-14
    Vue3 return setup
  • Vue3中setup script怎么用
    这篇文章主要为大家展示了“Vue3中setup script怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Vue3中setup script怎么用”这篇文章吧。前言Vu...
    99+
    2023-06-29
  • vue3基于script setup语法$refs的使用
    目录一、vue2语法二、vue3使用1. 组件设置ref值2. 组件实例获取3. 子组件内设置对外公开的变量一、vue2语法 vue2语法在组件上设置ref属性后,在代码里可以通过 ...
    99+
    2022-11-12
  • Vue3中的setup语法糖、computed函数、watch函数怎么使用
    这篇文章主要介绍“Vue3中的setup语法糖、computed函数、watch函数怎么使用”,在日常操作中,相信很多人在Vue3中的setup语法糖、computed函数、watch函数怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简...
    99+
    2023-07-05
  • vue3 setup语法糖各种语法新特性的使用方法(vue3+vite+pinia)
    目录一、背景二、vue3语法的使用2.1. 父子通信props2.2. EventBus2.3. 计算属性computed2.4. pinia状态管理器的使用2.4.1. 模块化2....
    99+
    2022-11-13
  • Vue3如何使用setup语法糖拒绝写return
    这篇“Vue3如何使用setup语法糖拒绝写return”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Vue3如何使用set...
    99+
    2023-07-06
  • 如何在vue3中同时使用tsx与setup语法糖
    目录前言Tsx与setup语法糖的优势遇到的问题最后前言 想这样做的原因是在vue3里使用tsx开发时,props的声明显得异常麻烦,不禁想到defineProps的便利,但同时在v...
    99+
    2022-11-13
  • 详解如何在Vue3使用<scriptlang=“ts“setup>语法糖
    目录迁移组件隐式返回definePropsdefineEmits默认关闭和defineExposeVue 3.2 引入了语法,这是一种稍微不那么冗长的声明组件的方式。您可以通过向 S...
    99+
    2022-11-13
  • script setup 语法的使用方法
    这篇文章主要介绍“script setup 语法的使用方法”,在日常操作中,相信很多人在script setup 语法的使用方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”...
    99+
    2022-10-19
  • 如何进行vue3基于script setup语法$refs的使用
    如何进行vue3基于script setup语法$refs的使用,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、vue2语法vue2语法在组件上设置ref属性后...
    99+
    2023-06-22
  • Vue3中的setup语法糖、computed函数、watch函数如何用
    computed函数computed 函数的使用:其实我们什么情况下会使用计算属性呢,那一定是通过依赖的数据得到新的数据!1)从Vue中引入computed 2)在setup中进行使用,将一个函数,函数的返回值就是计算好的数据 3)最后呢通...
    99+
    2023-05-17
    Vue3 setup computed
  • Vue3中的setup语法糖、computed函数、watch函数详解
    目录 写在前面 setup 语法糖 computed函数 watch 函数 写在最后 写在前面 专栏介绍:凉哥作为 Vue 的忠实 粉丝输出过大量的 Vue 文章,应粉丝要求开始更新...
    99+
    2023-03-01
    Vue3 setup语法糖 Vue3  computed函数 Vue3  watch函数
  • 详解Vue3中的setup语法糖、computed函数、watch函数
    computed函数在上篇文章中我们学了两个组合式API分别是 ref 和 reactive,现在呢我们学习cmputed函数,相信大家一定知道他即使我们的计算数据定义函数,之前呢是 computed 选项,现在是computed函数;我们...
    99+
    2023-05-14
    setup computed watch vue3
  • Vue3编程流畅技巧使用setup语法糖拒绝写return
    目录Vue3.2 setup语法糖1.<script setup>在<template/>使用2、<script setup>引入组件将自动注册3...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作