前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >初识 vue3的Composition API

初识 vue3的Composition API

原创
作者头像
前端车神
发布于 2024-07-01 12:18:27
发布于 2024-07-01 12:18:27
20402
代码可运行
举报
运行总次数:2
代码可运行

什么是 Composition API?

Composition API 也叫组合式API, 是在vue3中新引入的一种API,vue2中已经有option API了,那为什么要新稿这么一套呢,其实主要原因是要解决vue2中的option API的在处理复杂组件逻辑的局限性,例如逻辑分散、代码复用性差、类型推断困难、组件组织混乱、响应式系统限制、模板逻辑复杂性、组件测试困难等问题。为此Composition API通过函数的方式来组织代码,使得逻辑更加模块化和可组合,这就变得很灵活。

核心概念

setup 函数

setup 是使用组合式API的入口函数,用于替代vue2中的data、computed 、methods等选项,setup函数参数为(props, context)props可以理解为vue2中的props属性,用来访问父级传来的参数值。

context 则是一个对象集合包括:

  • attrs:包含了父组件传递给子组件的所有属性(非prop的属性),它们是响应式的,可以动态地绑定到模板中。
  • slots:包含了所有传入的插槽内容,这些内容可以用于渲染作用域插槽。
  • emit:是一个函数,用于向父组件发出自定义事件。它是this.\$emit的替代。
  • expose:是一个函数,用于显式地暴露子组件内部的属性或方法,使得父组件可以通过ref访问到这些属性或方法。

setup声明方式有两种语法方式

第一种

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<script>
export default {
  props: {
    msg: String
  },
  setup(props) {
    console.log('setup',props.msg)
  }
}
</script>

第二种 更简洁 官方称为更符合人体工程学

但 props 要更改写法,使用defineProps,放心虽然没有声明,但它将自动在setup 中可用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<script setup>
defineProps({
  msg: String,
})
</script>

核心api

ref

ref 用于创建一个可修改的响应式的基本数据类型或引用(可以对 .value 赋值来进行修改, 如果将一个对象赋值给 ref,那这个对象则通过 reactive 转化为深层次响应式的数据),

如果这个对象中存在ref也会被深层解包,为避免这种深层次的转化,官方建议用 shallowRef替代

使用方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// .vue
<template>
  <h1>{{age}}</h1>
</template>
<script setup>
import { ref } from 'vue'

let age = ref(18)

age.value = 20
</script>

reactive

reactive 用于创建一个响应式对象。有一点需要注意,当访问到某个响应式数组或 Map 这样的原生集合类型中的 ref 元素时,不会执行 ref 的解包。

只有当你直接访问这个ref内部的值时,比如使用.value属性,Vue才会“解包”这个ref,把它内部的值当作响应式值进行追踪。

这样做的好处是提高了性能,避免了不必要的响应式转换,因为在某些情况下,你可能并不需要数组或Map中的每个ref元素都是响应式的。

所以要避免深层响应式的转换,只想保留对这个对象顶层次访问的响应式,可以用shallowReactive做为替代

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { ref, reactive } from 'vue'
let age = ref(18)
let obj = reactive(['123',age])

// 直接访问数组中的 obj 元素,不会执行解包
console.log(obj[1]);  // 输出是 ref 对象本身,而不是 18

// 要获取 obj 中的值,需要使用.value
console.log(obj[1].value);  // 输出 18

</script>

readonly

readonly和 reacitve 类似,只不过从字面意义上就不难理解,only 它是只读的,而且代理是深层的,所以同理要避免深层层级的转换行为,可以用shallowReadonly 来替代

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
...
<!--19-->
<div>{{ man.age }}</div> 
<!--19-->
<div>{{ man2.age }}</div>
<!--20-->
<div>{{ man3.age }}</div>
...
import { reactive, ref, readonly, watchEffect } from 'vue'
...
let man = reactive({ age: 18 })

let man2 = readonly(man)

let man3 = readonly({age: 20})
watchEffect(() => {
  // 用来做响应性追踪
  console.log(man.age)
})

// 会触发 watchEffect
man.age++

// 下面man2和man3的操作会执行失败而且会触发警告
// Set operation on key "age" failed: target is readonly.
man2.age++

man3.age++

computed、watch

computed、watch和vue2中的含义相同

computed用法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
...
<h1 @click="count ++">{{ addCount }}</h1>
...
import { ref, reactive } from 'vue'
...


let count = ref(1)
const addCount = computed(() => count.value + 1)
// addCount.value++  // 错误写法,因为addCount是只读的 会报错

watch 默认懒监听: 仅在监听源发生变化时才执行回调函数

watch一共三个参数,watch(source,callback,options)

  • source: 这个参数是要侦听的响应式引用或响应式对象的属性,或者是返回响应式值的getter函数。 可以是 ref、reactive 对象、computed 计算属性或者一个自定义的getter函数。
  • callback:当侦听的源发生变化时会被调用的回调函数。这个函数接收三个参数:新值、旧值和onCleanup函数。onCleanup可以用来注册清理回调,在下次侦听器执行前会被调用。
  • options (可选): 包含配置选项json对象
    • immediate: 值为true,会在侦听器创建时立即执行回调。
    • deep: 值为true 会深度监听对象内部的变化。
    • flush: 指定回调函数的执行时机
      • post (默认值): 侦听器回调会在 DOM 更新之后执行。
      • pre: 与post相反,表示侦听器回调会在 DOM更新之前执行 的更新。这个选项适用于需要在 DOM 更新之前访问旧 DOM 的场景。
      • sync: 表示侦听器回调会在数据变化时立即同步执行。这通常会导致更高的性能开销,因为它会阻止其他任务的执行,直到侦听器回调完成。这个选项适用于需要立即响应数据变化,并且变化不频繁的场景。
    • onCleanup: 一个在侦听器停止侦听之前执行的函数(可以用来清除无效的副作用,例如等待中的异步请求。)
    • onTrack: 在依赖项被追踪时触发
    • onTrigger: 在依赖项的值发生变化并触发更新时触发
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { ref, watch } from 'vue';

const data = ref(0);

watch(data, (newValue, oldValue, onCleanup) => {
  let timeoutId;
  onCleanup(() => {
    clearTimeout(timeoutId);
  });

  timeoutId = setTimeout(() => {
    console.log(`数据变化了,新值是 ${newValue}`);
  }, 1000);
}, { 
    immediate: true,
    onTrack: (dep, info) => {
        console.log(`在依赖项被追踪时触发:${dep}`);
     },
    onTrigger: (dep, newValue, oldValue) => {
        console.log(`依赖项触发更新:${dep},新值为 ${newValue},旧值为 ${oldValue}`);
    }
});

watchEffect()

自动追踪依赖:当你需要根据多个响应式数据的变化来执行某些操作时,不需要显式地指定依赖,watchEffect() 会自动追踪

立即执行:watchEffect()在组件初始化时会立即执行一次,确保依赖状态的最新值被正确应用。

无需关心具体响应式属性:当你不需要关心响应式数据具体是哪个属性变化,只是想在其变化时做一些事情时。

代码和效果图如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
...
  <div>
    <input v-model="num1" type="number">
    <input v-model="num2" type="number">
    <h1>结果:{{ result }}</h1>
  </div>
...
...
import { ref, watchEffect } from 'vue'
let result = ref(0)
let num1 = ref(0)
let num2 = ref(0)
watchEffect(() => {
   result.value = num1.value + num2.value
});
...

我正在参与2024腾讯技术创作特训营最新征文,快来和我瓜分大奖! 邀请人:iwhao

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Hive补充之窗口函数
窗口函数 1、hive窗口函数语法 hive中的窗口函数over() ,over()窗口函数的语法结构
Maynor
2021/04/09
1.1K0
大数据快速入门(10):Hive窗口函数
首先,需要认识到,窗口函数并不是只有 hive 才有的,SQL 语法标准中,就有窗口函数。
kk大数据
2020/11/11
2.6K0
hive sql 窗口函数
1) 窗口函数 Lag, Lead, First_value,Last_value Lag, Lead、这两个函数为常用的窗口函数,可以返回上下数据行的数据. LAG(col,n,DEFAULT) 用于统计窗口内往上第n行值 LEAD(col,n,DEFAULT) 用于统计窗口内往下第n行值, 与LAG相反 -- 组内排序后,向后或向前偏移 -- 如果省略掉第三个参数,默认为NULL,否则补上。
用户1217611
2020/06/19
1.2K0
hive sql 窗口函数
Hive 窗口函数最全讲解和实战
在深入研究Over字句之前,一定要注意:在SQL处理中,窗口函数都是最后一步执行,而且仅位于Order by子句之前 可以想象成sql的输出结果,就是窗口函数输入的结果。
kk大数据
2019/12/18
2.1K0
MySQL窗口函数,你最熟悉的陌生人~
  这三个点虽然平时用得少,但在面试中却常被问到。值得一提的是,很多面试官对问题竟然也是一知半解。。
陈哈哈
2021/12/31
1.1K0
MySQL窗口函数,你最熟悉的陌生人~
Hive窗口函数/分析函数详解
在sql中有一类函数叫做聚合函数,例如sum()、avg()、max()等等,这类函数可以将多行数据按照规则聚集为一行,一般来讲聚集后的行数是要少于聚集前的行数的。但是有时我们想要既显示聚集前的数据,又要显示聚集后的数据,这时我们便引入了窗口函数。窗口函数又叫OLAP函数/分析函数,窗口函数兼具分组和排序功能。
五分钟学大数据
2021/03/04
9020
Hive窗口函数/分析函数详解
Hive学习-lateral view 、explode、reflect和窗口函数
然后挂了FAILED: SemanticException [Error 10081]: UDTF's are not supported outside the SELECT clause, nor nested in expressions
顾翔
2024/09/10
4770
Hive学习-lateral view 、explode、reflect和窗口函数
MySQL8新特性窗口函数详解
本文博主给大家详细讲解一波 MySQL8 的新特性:「窗口函数」,相信大伙看完一定能有所收获。
wayn
2023/06/14
4800
MySQL8新特性窗口函数详解
SQL数据分析实战:好用的窗口函数
感觉这个春节假期在除夕过完之后吧,时间就过的非常快了,余额已经明显不足了。嗯,是开始可以学习起来了!
可以叫我才哥
2022/04/12
7860
SQL数据分析实战:好用的窗口函数
Mysql 窗口函数学习
窗口函数是数据库查询中的一个经典场景,在解决某些特定问题时甚至是必须的。个人认为,在单纯的数据库查询语句层面【即不考虑 DML、SQL 调优、索引等进阶】,窗口函数可看作是考察求职者 SQL 功底的一个重要方面。
王图思睿
2021/06/16
1.2K0
SQL 进阶挑战(26 - 30)
现有用户信息表user_info(uid用户ID,nick_name昵称, achievement成就值, level等级, job职业方向, register_time注册时间):
村雨遥
2022/06/27
4630
Hive常用窗口函数实战
本文介绍了Hive常见的序列函数,排名函数和窗口函数。结合业务场景展示了Hive分析函数的使用
Eights
2020/07/13
2.8K0
Hive窗口函数保姆级教程
在SQL中有一类函数叫做聚合函数,例如sum()、avg()、max()等等,这类函数可以将多行数据按照规则聚集为一行,一般来讲聚集后的行数是要少于聚集前的行数的。但是有时我们想要既显示聚集前的数据,又要显示聚集后的数据,这时我们便引入了窗口函数。窗口函数又叫OLAP函数/分析函数,窗口函数兼具分组和排序功能。
五分钟学大数据
2021/07/07
2.6K0
Hive窗口函数保姆级教程
hive窗口函数/分析函数详细剖析
在sql中有一类函数叫做聚合函数,例如sum()、avg()、max()等等,这类函数可以将多行数据按照规则聚集为一行,一般来讲聚集后的行数是要少于聚集前的行数的。但是有时我们想要既显示聚集前的数据,又要显示聚集后的数据,这时我们便引入了窗口函数。窗口函数又叫OLAP函数/分析函数,窗口函数兼具分组和排序功能。
五分钟学大数据
2021/01/21
9800
hive窗口函数/分析函数详细剖析
MySQL窗口函数怎么用
在 MySQL 8.x 版本中,MySQL 提供了窗口函数,窗口函数是一种在查询结果的特定窗口范围内进行计算的函数。
科技新语
2024/05/17
3080
2021年数据科学家面试:4个基本SQL窗口函数介绍以及示例
墨墨导读:在数据科学家岗位的面试中,窗口函数(WINDOW function)是SQL函数家族中经常会被问到的主题。在本文中,我会根据面试的问题,问题模式和解决问题的基本策略向你展示一些典型的窗口函数,并提供一些示例的分步解决方案。
数据和云
2021/03/09
1.2K0
2021年数据科学家面试:4个基本SQL窗口函数介绍以及示例
数分面试必考题:窗口函数
窗口函数的主要作用是对数据进行分组排序、求和、求平均值、计数等。对于数据从业者来说, sql窗口函数在实际工作中具备非常广泛的应用场景。可以大大的提高数据查询效率,同时也是数据类相关岗位的面试/笔试的必考点。所以不论是在职的分析师,还是准备找工作的同学,都必须要牢牢掌握窗口函数的概念及用法。感谢群友饭小米的投稿,接下来让我们详细了解一下窗口函数的前世今生吧。
Python数据科学
2020/12/15
2.4K0
数分面试必考题:窗口函数
SQL、Pandas、Spark:窗口函数的3种实现
窗口函数是数据库查询中的一个经典场景,在解决某些特定问题时甚至是必须的。个人认为,在单纯的数据库查询语句层面【即不考虑DML、SQL调优、索引等进阶】,窗口函数可看作是考察求职者SQL功底的一个重要方面。
luanhz
2021/04/26
1.6K0
Mysql8.0 新特性 窗口函数 公共表表达式
这里就不一一介绍了,就先介绍几个简单常用的窗口函数 公共表表达式, 感觉挺高级常用的,帮助快速开发.
Java_慈祥
2024/08/06
1930
Mysql8.0 新特性 窗口函数 公共表表达式
SQL 窗口函数的优化和执行
窗口函数(Window Function)是 SQL2003 标准中定义的一项新特性,并在 SQL2011、SQL2016 中又加以完善,添加了若干处拓展。窗口函数不同于我们熟悉的普通函数和聚合函数,它为每行数据进行一次计算:输入多行(一个窗口)、返回一个值。在报表等分析型查询中,窗口函数能优雅地表达某些需求,发挥不可替代的作用。
SQL数据库开发
2024/04/24
2340
SQL 窗口函数的优化和执行
相关推荐
Hive补充之窗口函数
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验