Vue | Vue.js Composition API

简介: Vue | Vue.js Composition API

一、认识CompositionAPI

Options API的弊端

在Vue2中 编写组件的方式是Options API


       Options API的一大特点就是在 对应的属性 中编写 对应的功能模块


       如 data定义数据 methods中定义方法 computed中定义计算属性 watch中监听属性改变 也包括生命周期钩子


这种代码有很大的弊端:


       当我们 实现某一个功能 时 这个功能 对应的代码逻辑 会被 拆分到各个属性 中


       当组件变得更大更复杂时 逻辑关注点的列表 就会增长, 那么 同一个功能的逻辑就会被拆分的很分散;


       尤其对于那些一开始 没有编写这些组件的人 来说 这个组件的代码 是难以阅读和理解的

认识Composition API

为了使用Composition API 我们需要一个可以实际使用它(编写代码)的地方


在Vue组件中,这个位置就是 setup函数


setup其实就是组件的另外一个选项:


       这个选项强大到我们可以用它来替代之前所编写的大部分其他选项


       如 methods computed watch data 生命周期等

二、Setup函数的基本使用

setup函数的参数

它主要有两个参数:propscontext


prop=>父组件传递过来的属性 放到 props对象中, 我们在setup中如果需要使用 直接通过props参数获取:


       对于 定义props的类型, 我们还是 和之前的规则是一样的,在props选项中定义


       并且 在template中 依然是可以 正常去使用props中的属性,如 message


       我们在setup函数中想要使用props 那么不可以通过this去获取


       因为props有直接作为参数传递到setup函数中,我们可以直接通过参数来使用


context称之为SetupContext 它里面包含三个属性:


       Attrs: 所有的非prop的attribute


       slots:父组件传递过来的插槽


       emit:当我们组件内部需要发出事件时 会用到emit

setup函数的返回值

setup是一个函数,他也有返回值 它的返回值能用来做什么?


       可以在模版template中被使用


       可以通过setup的返回值来替代data选项


甚至我们可以 返回一个执行函数 来 代替methods中定义的方法:

JavaScript
let counter = 100
const addClick = ()=>{
  // console.log("123")
  //.value 才能拿到里面的数据
  counter.value++
}
const subClick = ()=>{
  // console.log("456")
  counter.value--
}
JavaScript
return {
//  想要绑定谁 就写谁
  counter,
  addClick,
  subClick
}

如果我们将 counter 在 addClick 或者 subClick进行操作时 是否可以实现界面的响应式?


       不可以!  对于一个 定义的变量来说 默认情况下,Vue不会跟踪它的变化 来引起界面的响应式操作

三、Setup中数据的响应式

Reactive API(不常用,但是是核心)

如果想要在setup中定义的数据提供响应式的特性,那么我们可以使用reactive的函数

JavaScript
const account = reactive({
  username:"xiaoxiong",
  password:"123456"
})

这是什么原因?为什么就可以变成响应式?


       因为 当我们使用 reactive函数处理我们的数据后,数据再次被使用时就会进行依赖收集


       当 数据发生改变 时 所有收集到的依赖 都是 进行对应的响应式操作(如:更新界面)


       事实上,我们编写的 data选项,也是在内部 交给了reactive函数 将其变成响应式对象的

Ref API

Reactive API 对 传入的类型是有限制的 它要求我们必须传入的是 一个对象或数组类型:


       如果传入一个 基本数据类型 会报一个警告


这个时候 Vue3提供了另外一个API:ref API


       ref会返回一个 可变的响应式对象,该对象作为一个 响应式的引用 维护着它内部的值,这就是ref名称的来源;


       它内部的值是 在ref的value属性 中被维护的

JavaScript
const counter = ref(0)
const message = ref("Hello World")

注:


       在模版中引入ref的值时 Vue会自动帮助我们进行解包操作,我们并不需要在模版中通过ref.value的方式来使用


       但在setup函数内部,他依然是一个ref引用,对其进行操作时 依然需要使用ref.value的方式

四、Reactive知识点补充

认识readonly(了解)

通过reactive或ref可以获取到一个响应式的对象, 但在某些情况下,我们传入给其他地方(组件)的这个响应式对象 希望在 另外一个地方(组件)被使用,但是不能被修改, 我们如何防止这种情况出现?


       Vue3为我们提供了 readonly的方法


       readonly会返回原始对象的只读代理(它依然是一个Proxy 这是一个proxy的set方法被劫持并且不能对其进行修改)


在开发中常见的readonly方法会传入三个类型的参数:


一:普通对象 二:reactive返回的对象 三:ref的对象


readonly的使用


在readonly的使用过程中 有以下规则:


       Readonly 返回的对象都是不允许修改的


       经过readonly处理的原来的对象是允许被修改的


               如 const info = readonly(obj) info对象是不允许被修改的


               当obj被修改时 readonly返回的info对象 也会被修改


               但是 我们不能去修改readonly返回的对象info


本质上就是 readonly返回的对象是setter方法 被劫持了

69141b3c469b4652a755f03cf78bfc9d.png

readonly的应用

       在我们传递给其他组件数据时 往往希望其他组件使用我们传递的内容 但是不允许它们修改 就用readonly.

Reactive判断的API(了解)

isProxy


       检查对象 是否是由 reactive或readonly创建的proxy


isReactive


       检查对象 是否由reactive创建的响应式代理;


       如果 该代理是readonly建的 但是 包裹了由 reactive创建的另一个代理,他也会返回true


isReadonly


       检查对象 是否由readonly创建的只读代理


toRaw


       返回 reactive或readonly代理的原始对象(不建议保留对原始对象的引用,谨慎使用)


shallowReactive


       创建一个响应式代理 他跟踪其自身property的响应性,但不执行嵌套对象的深层响应式转换(深层还是原生对象)


shallowReadonly


       创建一个proxy 使其自身的property为只读,但 不执行嵌套对象的深度只读转换(深层还是可读,可写的)

五、Ref知识点补充

toRefs(偶尔使用)

       如果我们使用ES6的解构语法,对reactive返回的对象进行解构获取值,之后 无论是修改解构后的变量,还是修改reactive返回的info 对象,数据都不再是响应式的:

JavaScript
const info = reactive({
  name:"xiong",
  age:18,
  height:1.88
})
const {name,age} = info

那么 我们怎么让解构出来的属性是响应式的?


       Vue提供了一个toRefs的函数,可以将 reactive返回的对象中的属性都转为ref


       那么我们再次进行解构出来的name和age本身就是ref的了

JavaScript
// 当我们这样做的时候 会返回两个ref对象,它们是 响应式的
const {name,age} = toRefs(info)

       这种做法相当于在 info.name和ref.value之间建立了 链接 任何一个修改都会引起另外一个变化

toRef

       我们希望只转换一个 reactive对象中的属性ref 那么可以使用toRef的方法:

JavaScript
const height = toRef(info,"height")

ref其他的API


unref


       如果我们想要获取一个ref引用中的value,那么可以通过unref方法:


               如果参数是一个ref 则返回内部值,否则返回参数本身;


               这是 val = isRef(val) ? val.value : val 的语法糖函数


isRef


       判断值 是否是一个ref对象


shallowRef


       创建一个 浅层的ref对象


triggerRef


       手动触发和shallowRef相关联的副作用

JavaScript
const info = shallowRef({name:"xiong"});
// 下面修改的不是响应式
const changeInfo = ()=>{
    info.value.name = "xiaoxiong",
    // 手动触发
    triggerRef(info)
}

六、setup中禁用this

setup不可以使用this

官方在this上有这样一段描述 :


       表达的含义是 this并没有指向当前组件实例;


       并且在setup被调用前,data computed methods等都没有被解析


       所以 无法在setup中获取this

相关文章
|
1月前
|
JavaScript 前端开发 开发者
VUE 开发——Node.js学习(一)
VUE 开发——Node.js学习(一)
70 3
|
1月前
|
JavaScript API
vue中api统一管理
【10月更文挑战第4天】
|
8天前
|
JSON JavaScript API
深入浅出Node.js:从零开始构建RESTful API
【10月更文挑战第39天】 在数字化时代的浪潮中,API(应用程序编程接口)已成为连接不同软件应用的桥梁。本文将带领读者从零基础出发,逐步深入Node.js的世界,最终实现一个功能完备的RESTful API。通过实践,我们将探索如何利用Node.js的异步特性和强大的生态系统来构建高效、可扩展的服务。准备好迎接代码和概念的碰撞,一起解锁后端开发的新篇章。
|
19天前
|
JavaScript 中间件 API
Node.js进阶:Koa框架下的RESTful API设计与实现
【10月更文挑战第28天】本文介绍了如何在Koa框架下设计与实现RESTful API。首先概述了Koa框架的特点,接着讲解了RESTful API的设计原则,包括无状态和统一接口。最后,通过一个简单的博客系统示例,详细展示了如何使用Koa和koa-router实现常见的CRUD操作,包括获取、创建、更新和删除文章。
36 4
|
25天前
|
JavaScript 前端开发 持续交付
构建现代Web应用:Vue.js与Node.js的完美结合
【10月更文挑战第22天】随着互联网技术的快速发展,Web应用已经成为了人们日常生活和工作的重要组成部分。前端技术和后端技术的不断创新,为Web应用的构建提供了更多可能。在本篇文章中,我们将探讨Vue.js和Node.js这两大热门技术如何完美结合,构建现代Web应用。
24 4
|
12天前
|
JavaScript 前端开发 NoSQL
深入浅出:使用Node.js构建RESTful API
【10月更文挑战第35天】在数字时代的浪潮中,后端技术如同海洋中稳固的灯塔,为前端应用提供数据和逻辑支撑。本文旨在通过浅显易懂的方式,带领读者了解如何利用Node.js这一强大的后端平台,搭建一个高效、可靠的RESTful API。我们将从基础概念入手,逐步深入到代码实践,最终实现一个简单的API示例。这不仅是对技术的探索,也是对知识传递方式的一次创新尝试。让我们一起启航,探索Node.js的奥秘,解锁后端开发的无限可能。
|
1月前
|
JavaScript 前端开发 API
探索Vue.js 3的组合式API:一种更灵活的组件状态管理方式
【10月更文挑战第5天】探索Vue.js 3的组合式API:一种更灵活的组件状态管理方式
|
1月前
|
JSON JavaScript 前端开发
使用 Node.js 和 Express 构建 RESTful API 服务器
【10月更文挑战第3天】使用 Node.js 和 Express 构建 RESTful API 服务器
|
2月前
|
JavaScript 前端开发 API
Vue学习笔记3:对比纯JavaScript和Vue实现数据更新的实时视图显示
Vue学习笔记3:对比纯JavaScript和Vue实现数据更新的实时视图显示
|
1月前
|
JavaScript 前端开发 应用服务中间件
vue前端开发中,通过vue.config.js配置和nginx配置,实现多个入口文件的实现方法
vue前端开发中,通过vue.config.js配置和nginx配置,实现多个入口文件的实现方法
146 0
下一篇
无影云桌面