Vue3——Composition API-2(特别重要)

求一键三连

希望大家看完觉得有用的话点赞、关注和收藏,感谢!!!
在这里插入图片描述

前言

这么多看下来,最大的感受就是,以前放在的data、methods、computed等函数里面的东西,都变成了使用这些函数,比如computed,谁是computed的,就用一下这个函数computed(),然后就可以了,函数化

在composition api中,所使用的函数,例如ref(),reactive(),computed(),还有生命周期函数等都需要提前在export default{ }外面进行导入后才可以使用,别忘了导读
在这里插入图片描述


script setup语法糖(重要)

后面写项目都会用这个语法糖,所以这个语法糖所以必须要掌握
vue3.2版本之后,setup直接写在script里面,不用return,因为只有一个setup函数,所以有了这个语法糖。
在这里插入图片描述

在这里插入图片描述
同时非常重要的一点,在导入组件使用时,不用在componment里面注册了,直接导入就可以使用
这个最后的一句话感觉是个废话?因为本来实例多次创建,每个实例都是不一样的,就像组件是类,实例是类创建的实例化对象,每一个对象都是不一样的,所以这个最后一句话有点懵逼
这是我用options api写的,可以看到创建了三个实例,但是每个实例的计数器都不一样,每个实例都是不一样的,每次调用组件创建都是一个新的实例
在这里插入图片描述

(ps:这里有一点需要特别注意,那就是语法糖写法和非语法糖写法中很多函数使用是不一样的,例如emit,就完全不一样)
如果是这样的话,那么一定要熟记语法糖里面各种方法的写法,因为最后用的最多的还是语法糖写法的。
具体的区别,可以看这篇文章,遇到的时候查就可以了。
Vue3.2 setup语法糖

语法糖里其他语法的使用

注意在function里面的就不是顶层的了
在这里插入图片描述
所以模板也可以有一个新的位置,script放在顶部更好一点,因为这样template和css就可以在一起,比较好找一点,但是之前那样也没有问题。

在这里插入图片描述
这样就是不用注册组件了。

父子组件通信

父子之间通信的props和emit和以前也完全不一样了,要掌握这个写法
这两个参数都是在作用域里面被定义好的,可以直接使用
在这里插入图片描述

想要获得组件实例里面的方法或者数据,是要在需要使用组件里面在defineExpose()里面暴露这个方法,写一下方法名。然后在父组件里面就通过组件实例就可以获取到这个方法了
在这里插入图片描述

computed()函数

之前写法:全都放在computed里面
在这里插入图片描述

现在的写法:每个需要计算的都使用computed函数,内容包含在这个函数里面
在这里插入图片描述

不管怎么写,本质都是在函数里进行拼接操作,然后返回
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
computed返回的是一个ref对象,所以在函数的操作里应该用fullname.value来进行操作,否则会报错

setup中通过ref获取元素和组件

获取原生的DOM元素
之前获取元素:
this.$refs.name
在这里插入图片描述
现在的做法:
因为setup里不可以使用this
创建一个ref对象,然后绑定到元素上就可以获得了。(感觉就是多一个注册ref对象
在这里插入图片描述

在这里插入图片描述
也可以在mounted里使用:
在setup中mounted函数是onMounted( ),记住使用是要加value值的,因为是用了ref
在这里插入图片描述
生命周期函数要再复习一下,有些遗忘

生命周期函数

在原有的生命周期函数上多加一个on,但是 beforeCreate() 、created() 没有,因为不需要(no needed),他们的操作都合并到setup里面了,所以这些生命周期函数里面要做的事情放到setup里面做就好了
在这里插入图片描述

在执行setup函数的过程中, 你需要导入要使用的生命周期函数

  import { onMounted, onUpdated, onUnmounted } from 'vue'

provide 和inject(了解即可)

都变成了函数 provide()、inject()
options api写法:

是一个数组:provide:[ 'name' ,  'age']

还是和之前一样,因为后面不用,数据传输都比较复杂,所以后面都用piana
唯一要注意的是这些都要导入后才可以使用

import { provide, inject } from 'vue'

composition api写法:

provide(‘属性名’,属性值)

在这里插入图片描述
在这里插入图片描述

 const height = inject("height", 1.88)  //1.88就是默认值

在原始数据上使用响应式,则传入后可以是响应式
在这里插入图片描述

在composition api中ref拿到的数据会自动给我们解包,所以拿到(name)直接用就可以了
(如果是options api用ref就要手动解包)

侦听数据(了解)

也是变成函数
在这里插入图片描述

watch

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
深度侦听和浅侦听要回顾一下之前的watch

侦听给的都是proxy对象,如果想要获得普通对象
在这里插入图片描述

watch的immediate属性

Vue之watch的immediate属性和deep属性
watch 的一个特点是,最初绑定的时候是不会执行的,要等到 firstName 改变时才执行监听计算。那我们想要一开始就让他最初绑定的时候就执行改怎么办呢?我们需要修改一下我们的 watch 写法,修改过后的 watch 代码如下:

watch: {
  firstName: {
    handler(newName, oldName) {
      this.fullName = newName + ' ' + this.lastName;
    },
    // 代表在wacth里声明了firstName这个方法之后立即先去执行handler方法
    immediate: true
  }
}

mmediate:true代表如果在 wacth 里声明了 firstName 之后,就会立即先去执行里面的handler方法,如果为 false就跟我们以前的效果一样,不会在绑定的时候就执行。

属性 deep,默认值是 false,代表是否深度监听,true表示深度监听

watcheffect

自动收集,不用手动绑定
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

编程方式的选择

以前的options api就特别好用,简单好用!
compositions aip就比较复杂,但是自由灵活,可以抽取,像react,那这样为什么不直接react呢?
哈哈哈,所以说,我目前觉得options api挺不错的,所以如果你觉得options api好用也可以不用切换的,适合自己的才是最好的。
composition api最好的作用就是可以抽取模块,因为都是函数,所以好抽取,把相同逻辑的抽到一个组件里,这样代码的复用性就很强了,就更高效一些,但是用起来可能并没有直接的更加高效。
函数式编程和java还是不一样的,java是面向对象的
js支持函数式编程和面向对象编程,两个都支持

记住一句话:适合自己才是最好的


hooks:钩子函数(回调函数)

hooks定义(摘录):

系统运行到某一时期时,会调用被注册到该时机的回调函数
vue中的定义:
在 vue 组合式API里,以 “use” 作为开头的,一系列提供了组件复用、状态管理等开发能力的方法。
但主观来说,我认为vue 组合式API其本身就是“vue hooks”的关键一环,起到了 react hooks里对生命周期、状态管理的核心作用。(如 onMounted、 ref 等等)
在这里插入图片描述

关于hooks也有很多的知识要说,这里看这篇文章
浅谈:为啥vue和react都选择了Hooks🏂?
主要是针之前的mixin,hooks用来做代码复用的抽取好了太多。
相比于 mixins,它们简直太棒了!


// 单个name的写法
const { name, setName } = useName();

// 梅开二度的写法
const { name : firstName, setName : setFirstName } = useName();

const { name : secondName, setName : setSecondName } = useName();

  1. 方法和属性好追溯吗?这可太好了,谁产生的,哪儿来的一目了然。
  2. 会有重名、覆盖问题吗?完全没有!内部的变量在闭包内,返回的变量支持定义别名。
  3. 多次使用,没开N度?你看上面的代码块内不就“梅开三度”了吗?

concomposition api本身来说,其实就是一个hooks的写法:

无论是 vue 还是 react, 通过 Hooks 写法都能做到,将分散在各种声明周期里的代码块”,通过 Hooks 的方式将相关的内容聚合到一起。

这样带来的好处是显而易见的:“高度聚合,可阅读性提升”。伴随而来的便是 效率提升,bug变少

Hooks 写法直接告别了 this,从“函数”来,到“函数”去。

函数每次执行都会是新的对象。
函数本身是一个对象,还有就是函数的闭包(这个没有掌握)

自定义hooks:
注意hooks的文件是.js
在这里插入图片描述
注意学这个的思路:
因为在组件中可能多次使用useTitle,但是多次调用,并不好,所以返回一个title在组件里面直接更改就好。
有一个小小的疑问就是,这样还符合单向数据流吗?(我觉得可能是因为这个不属于组件,只算抽取的逻辑,所以可以这样用,因为抽取出来的都是js)
immediate:true,表示一开始也要执行一次
在这里插入图片描述

在组件中使用uesTitle():

在这里插入图片描述
自己写出不来并没有关系,多看看别人怎么写,多学学就好,因为很多东西都不是自己写出来的,都是在借鉴别人的基础上写出来的。写算法题也是这样,很多时候不要死磕,多学习,多记忆,多掌握就好

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值