赞
踩
在Vue2
中,我们编写组件的方式是Options API
在对应的属性中编写对应的功能模块
但是这种代码有一个很大的弊端
实现某一个功能
时,这个功能对应的代码逻辑
会被拆分
到各个属性中组件变得更大、更复杂时
,逻辑关注点的列表就会增长,那么同一个功能的逻辑就会被拆分的很分散
难以阅读和理解
的如果我们能将同一个逻辑关注点相关的代码收集在一起会更好
Composition API想要做的事情
,以及可以帮助我们完成的事情VCA
那么既然知道Composition API想要帮助我们做什么事情,接下来看一下到底是怎么做呢?
实际使用它(编写代码)的地方
setup 函数
setup其实就是组件的另外一个选项
可以用它来替代之前所编写的大部分其他选项
我们先来研究一个setup函数的参数,它主要有两个参数
props
context
props非常好理解,它其实就是父组件传递过来的属性会被放到props对象中
,我们在setup中如果需要使用,那么就可以直接通过props参数获取
定义props的类型
,我们还是和之前的规则是一样的,在props选项中定义
在setup函数中想要使用props
,那么不可以通过 this 去获取
(后面我会讲到为什么)直接通过参数来使用
即可另外一个参数是context,我们也称之为是一个SetupContext,它里面包含三个属性
attrs
:所有的非prop的attributeslots
:父组件传递过来的插槽(这个在以渲染函数返回时会有作用,后面会讲到)emit
:当我们组件内部需要发出事件时会用到emit(因为我们不能访问this,所以不可以通过 this.$emit发出事件)下面通过一个例子来说明怎样使用这两个参数
假设我们现在有一个home组件,里面接收一个props
假设app.vue为父组件,传一个message的prop属性,和id、class两个非prop属性
setup既然是一个函数,那么它也可以有返回值,它的返回值用来做什么呢?
模板template中被使用
替代data选项
还是上面的那个例子
甚至是我们可以返回一个执行函数
来代替在methods中定义的方法
但是,如果我们将 counter 在 increment 或者 decrement进行操作时,是否可以实现界面的响应式呢?
不可以
因为对于一个定义的变量
来说,默认
情况下,Vue并不会跟踪它的变化
,来引起界面的响应式
操作上面的示例,通过控制台可以发现,counter的值确实发生了改变,但在页面上并不会看到跟着一起改变
如果想为在setup中定义的数据提供响应式
的特性,那么我们可以使用reactive
的函数
还是上面的例子,按照下面这样写就可以响应式了,counter会在页面随着点击发生改变
那么这是什么原因呢?为什么就可以变成响应式的呢?
使用reactive函数处理我们的数据之后
,数据再次被使用时
就会进行依赖收集
数据发生改变时
,所有收集到的依赖
都是进行对应的响应式操作
(比如更新界面)data选项
,也是在内部交给了reactive函数
将其编程响应式对象的Reactive判断的API
isProxy
是否是由 reactive 或 readonly创建的 proxy
。isReactive
是否是由 reactive创建的响应式代理
:该代理是 readonly 建的
,但包裹了由 reactive 创建的另一个代理
,它也会返回 true;是否是由 readonly 创建的只读代理
。reactive 或 readonly 代理的原始对象
(不建议保留对原始对象的持久引用。请谨慎使用)。不执行嵌套对象的深层响应式转换
(深层还是原生对象)。不执行嵌套对象的深层只读转换
(深层还是可读、可写的)。reactive API
对传入的类型
是有限制
的,它要求我们必须传入
的是一个对象
或者数组
类型
传入一个基本数据类型
(String、Number、Boolean)会报一个警告ref API
返回一个可变的响应式对象
,该对象作为一个 响应式的引用
维护着它内部的值
,这就是ref名称的来源
在ref的 value 属性中被维护
的模板中引入ref的值时
,Vue会自动帮助
我们进行解包操作
,所以我们并不需要在模板中通过 ref.value 的方式来使用
在 setup 函数内部
,它依然是一个 ref引用
, 所以对其进行操作时,我们依然需要使用 ref.value的方式
模板中的解包是浅层的解包
unref
如果参数是一个 ref,则返回内部值,否则返回参数本身
val = isRef(val) ? val.value : val
的语法糖函数isRef
是否是一个ref对象
。shallowRef
浅层的ref对象
triggerRef
我们通过reactive或者ref可以获取到一个响应式的对象,但是某些情况下,我们传入给其他地方(组件)的这个响应式对象希望在另外一个地方(组件)被使用
,但是不能被修改
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。