服务粉丝

我们一直在努力
当前位置:首页 > 财经 >

Vue3的语法糖

日期: 来源:奇舞精选收集编辑:李佳音

组合式API:setup()

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

setup是一个接收propscontext的函数,最后setup需要return所有内容暴露给模板。

<script>
// 这是一个基于 TypeScript 的 Vue 组件
import { defineComponent } from 'vue'

export default defineComponent({
  setup(props, context) {
    // 在这里声明数据,或者编写函数并在这里执行它
    console.log(context)
    return {
      // 需要给 `<template />` 用的数据或函数,在这里 `return` 出去
    }
  },
})
</script>

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

*注意:在setup中不能使用this,因为他找不到实例。但是在vue2语法和vue3语法混用的时候,vue2语法中可以使用this访问到setup里暴露出的变量。

组件的生命周期

生命周期

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

setup语法糖

<script setup>

</script>

1.它只是简化了以往的组合API(compositionApi)的必须返回(return)的写法,并且有更好的运行时性能。2.在setup函数中所有 ES 模块导出都被认为是暴露给上下文的值,并包含在 setup() 返回对象中。相对于之前的写法,使用后,语法也变得更简单。

ref

ref是最常用的一个响应式 API,它可以用来定义所有类型的数据,包括 Node 节点和组件。返回一个响应式对象,所有的值都通过.value属性获取。

<template>
  <div>{{num}}</div>
</template>
<script setup >
import { ref } from 'vue'

const num = ref(0)

</script>

reactive

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

<template>
  <div>{{state.searchInfo.name}}</div>
</template>
<script setup >
import { reactive } from 'vue'

const state = reactive({
  searchInfo: {
    name: 'Jack',
  },
})
</script>

组件自动注册

setup中不再需要用过components进行注册,直接引入即可食用。

<template>
 <Child />
</template>

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

defineProps

接收父组件传过来的内容,可以定义类型和默认值

const props = defineProps({
  modelValue: {
    type: Array,
    default: (() => {[]}),
  },
})

defineEmit

子组件向父组件传递内容事件

const text = ref(1)
const emit = defineEmits(['update:modelValue'])
emit('update:modelValue', text.value)

defineExpose

向外暴露组件内方法和属性

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

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

// 子组件
const table = ref(null)
defineExpose({
  table,
})
// 父组件
<template>
 <Child ref="child" />
</template>

<script setup>
import { ref, onMounted } from 'vue'
import Child from './Child.vue'

let child = ref(null);

onMounted(() => {
 console.log(child.value.table); // Child Components
})
</script>

watch

watch(
  source, // 必传,要侦听的数据源
  callback // 必传,侦听到变化后要执行的回调函数
  // options // 可选,一些侦听选项
)

watchEffect

<template>
  <div>{{num}}</div>
</template>
<script setup >
import { watchEffect, watch, ref } from 'vue'

const num = ref(1)

var id = setInterval(() => {
  num.value = num.value + 1
  if (num.value === 20) {
    clearInterval(id)
    id = null
  }
}, 1000)

watchEffect(() => {
  console.log(1111)
})

watch(() => num.value, () => {
  console.log(222, num.value)
})
</script>

watchwatchEffect区别:

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

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

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

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

seSlots() 和 useAttrs()

获取插槽数据和获取attrs数据,里面包含了 class、属性、方法。

// 旧
<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>

其他 Hook Api

  1. useCSSModule:CSS Modules 是一种 CSS 的模块化和组合系统。vue-loader 集成 CSS Modules,可以作为模拟 scoped CSS。允许在单个文件组件的setup中访问CSS模块。此 api 本人用的比较少,不过多做介绍。
  2. useCssVars: 此 api 暂时资料比较少。介绍v-bind in styles时提到过。
  3. useTransitionState: 此 api 暂时资料比较少。
  4. useSSRContext: 此 api 暂时资料比较少。

参考:Vue官网、小調不吃辣(掘金)

- END -

关于奇舞团

奇舞团是 360 集团最大的大前端团队,代表集团参与 W3C 和 ECMA 会员(TC39)工作。奇舞团非常重视人才培养,有工程师、讲师、翻译官、业务接口人、团队 Leader 等多种发展方向供员工选择,并辅以提供相应的技术力、专业力、通用力、领导力等培训课程。奇舞团以开放和求贤的心态欢迎各种优秀人才关注和加入奇舞团。


相关阅读

  • uni-app 黑魔法探秘 (一)——重写内置标签

  • 一、背景政采前端团队的移动端跨端解决方案选择的是 uni-app。跨端方案的好处就是一码多端,即书写一次就可以输出到 web、小程序、Anroid、iOS 等各端。既然是开发,那必然少不
  • 查理·芒格:顶尖高手决策的7种武器!

  • 导读思维模型会给你提供一种视角或思维框架,从而决定你观察事物和看待世界的视角。顶级的思维模型能提高你成功的可能性,并帮你避免失败。打造多元思维模型想法来自查理·芒格
  • 分享一份2022年全球手游年度数据报告

  • 2022年于移动游戏而言,是充满波折和变化的一年。后疫情时代,全球经济缓慢复苏,数字经济发展趋势凸显,移动游戏行业也成为不少国家和地区视作提振经济的发力点之一。用户增长逐渐
  • (待会删)yyds,付费搞来的,请大家低调浏览!!!

  • 今天想跟大家分享个事儿。我不是有个要好的朋友嘛?最近我发现她天天准点下班。记得有一阵子,她还天天跟我抱怨:“工作量大,每天加班加点才能完成,累得跟狗一样“。刚好前几天她不
  • 就在明天,4时29分

  • ·惊JING ZHE蛰惊蛰3月6日4时29分,我们将迎来惊蛰节气。惊蛰,又名“启蛰”,是二十四节气中的第三个节气。因为避汉景帝刘启的名讳,最终被改为惊蛰。惊蛰反映的是自然生物受节律
  • 读懂政府工作报告|China的一天

  • 春回大地,万物复苏,神州大地处处涌动着实干奋进的热潮。2023年《政府工作报告》出炉,回首过去一年的每一天,中国是怎么度过的?来源:大江网/大江新闻客户端监制:何宝庆统筹:黄铭策划:
  • 今天,东部战区官兵用实际行动向他致敬!

  • 综合各单位来稿今年是毛泽东等老一辈革命家为雷锋同志题词60周年无论时代如何变迁雷锋精神永不过时在第60个“学雷锋纪念日”来临之际东部战区座座军营组织开展形式多样的学
  • 甲流病例激增!现在打疫苗还来得及吗?

  • 近日,“甲流”“奥司他韦”等关键词频登热搜。冬春交际,气候乍暖还寒,昼夜温差起伏,季节性传染病进入了高发和流行期。近日各大医院接诊的甲流等患者增多。多地疾控部门陆续发布

热门文章

  • “复活”半年后 京东拍拍二手杀入公益事业

  • 京东拍拍二手“复活”半年后,杀入公益事业,试图让企业捐的赠品、家庭闲置品变成实实在在的“爱心”。 把“闲置品”变爱心 6月12日,“益心一益·守护梦想每一步”2018年四

最新文章

  • uni-app 黑魔法探秘 (一)——重写内置标签

  • 一、背景政采前端团队的移动端跨端解决方案选择的是 uni-app。跨端方案的好处就是一码多端,即书写一次就可以输出到 web、小程序、Anroid、iOS 等各端。既然是开发,那必然少不
  • Vue3的语法糖

  • 组合式API:setup()Vue 3 的 Composition API 系列里,推出了一个全新的 setup 函数,它是一个组件选项,在创建组件之前执行,一旦 props 被解析,并作为组合式 API 的入口点。setup是
  • 奇舞周刊第 484 期 浅谈前端组件设计

  • 记得点击文章末尾的“ 阅读原文 ”查看哟~下面先一起看下本期周刊 摘要 吧~ 奇舞推荐■ ■ ■ 浅谈前端组件设计与仅承担数据处理逻辑的后端不同,前端需要负责界面渲染、数据
  • 查理·芒格:顶尖高手决策的7种武器!

  • 导读思维模型会给你提供一种视角或思维框架,从而决定你观察事物和看待世界的视角。顶级的思维模型能提高你成功的可能性,并帮你避免失败。打造多元思维模型想法来自查理·芒格