您现在的位置是:网站首页> 编程资料编程资料
Vue组合式API--setup中定义响应式数据的示例详解_vue.js_
2023-05-24
376人已围观
简介 Vue组合式API--setup中定义响应式数据的示例详解_vue.js_
一、Options API(选项式API)的弊端
1.1 什么是选项式API
在Vue2.x中,编写组件的方式是使用Options API,它的特点是在对应的属性中编写对应的功能模块。
比如data中定义数据、methods中定义方法、computed中定义计算属性、watch中监听属性改变。
生命周期钩子也属于Options API(选项式API)。
1.2 选项式API的弊端
- 当我们实现某一个功能时,这个功能对应的代码逻辑会被拆分到各个属性中。
当组件变得很大、很复杂时,逻辑关注点的列表就会增长,那么同一个功能的逻辑就会被拆分的很分散。
特别是对于那些一开始没有编写这些组件的人(阅读组件的人)来说,这个组件的代码是难以阅读和理解的。
- 碎片化的代码使用理解和维护这个复杂的组件变得非常困难,很容易隐藏了潜在的逻辑问题。
- 当处理单个逻辑关注点时,需要不断的跳到相应的代码块中,增加了代码维护的成本。
二、Composition API(组合式API)概述
2.1 Composition API的作用
如果能将同一个逻辑关注点相关的代码收集在一起会更好一些,这就是Composition API想 要做的事情。
Vue Composition API可以简称为VCA。
2.2 Composition API的编码位置
Vue3.x提供了setup函数来编写各种组合式API。
setup其实也是组件的另外一个选项,只不过这个选项可以用来替代大部分其他选项式API选项。
比如methods、computed、watch、data、各种生命周期钩子函数等等。
三、setup函数的参数和返回值
3.1 setup函数的参数
setup函数主要由两个参数:
props:父组件传递过来的属性会被放到props对象中props的类型,和选项式API中的的规则一样,在props选项中定义props的使用,在template中依然是可以把props中的属性当成普通Vue变量去使用。- 在
setup函数中用props,不可以通过this去获取
context:也称之为SetupContext,是setup函数的上下文对象,它主要由三个属性attrs:所有的非props的的属性slots:父组件传递过来的插槽,在以渲染函数返回时会有作用emit:当组件内部需要发出事件时会用到emit- 主要是因为
setup函数中不能访问this,所以无法通过this.$emit发出事件
3.2 setup函数的返回值
setup的返回值可以来替代data选项,因此setup的返回值可以在模板template中使用。
setup的返回值可以来替代methods中定义的方法
四、setup中如何定义响应式数据
4.1 reactive函数
代码示例:
账号: {{ account.username }}
密码: {{ account.password }}
由代码示例可知,使用reactive函数注意好三步即可:
- 从
Vue中引入reactive函数 - 把要定义的复杂数据类型(对象或者数组)传入
reactive函数,reactive函数的返回值就是响应式数据不要 - 忘记在
setup函数中返回才可以在模板上使用
为什么加了reactive函数后数据就变成了响应式的:
当我们使用reactive函数处理我们的数据之后,数据再次被使用时就会进行依赖收集。
当数据发生改变时,所有收集到的依赖都是进行对应的响应式操作。
选项式API中的data选项中的复杂数据,在底层也是交给了reactive函数将其编程响应式对象的。
4.2 ref函数
1)ref函数的基本使用
reactive函数对传入的类型是有限制的,它要求必须传入的是一个对象或者数组类型。
如果传入一个基本数据类型,比如String、Number、Boolean等等就会报出一个警告:
value cannot be made reactive : xxx
Vue3给我们提供了另外一个ref函数。
ref函数返回可变的响应式对象,该对象作为一个 响应式的引用维护着它内部的值,这也是ref名称的来源。
它内部的值是在ref的value属性中被维护的,因此使用ref函数定义的变量,使用时需要从value属性取值。
代码示例:
当前计数: {{ counter }}
2)ref浅层解包
当前计数: {{ info.counter }}
注意点:
- 在模板中引入
ref函数定义的值时,Vue会自动帮助我们进行解包操作 - 解包就是
Vue自动取出ref函数所定义的变量中的value值 - 所以使用者并不需要在模板中通过
ref.value的方式来使用 - 在
setup函数内部,ref函数定义的值是一个ref引用, 所以需要使用ref.value的方式去操作 - 关于
ref的浅层解包 - 直接在
template中使用ref变量,会进行自动解包 - 如果把
ref变量放在一个对象当中会有下面的情况- 使用时,会进行自动解包
- 修改时,不会进行自动解包,因此需要使用
value属性去获取值
4.3 关于如何选择reactive函数和ref函数
1)选择reactive函数的场景
reactive函数应用于本地的数据的定义,本地数据代表这个数据并不是来源于服务器reactive函数定义的复杂数据的多个属性之间是有一定联系的
import {reactive} from 'vue' const user = reactive({ username: '张三', password: '123456' }) 例如收集一个表单中的数据,就是很适合使用reactive函数的场景
2)选择ref函数的场景
定义本地的简单类型的数据
import {ref} from 'vue' const message = ref('hello ref') 定义从服务器中获取的数据
import {ref} from 'vue' const music = ref([]) // 定义一个本地数组 const serverMusicList = ['小星星', '虫儿飞'] // 模拟从服务器获取到的数据 music.value = serverMusicList // 把数据赋值给music变量 这是经验之谈,很多优秀的开源项目中也都是这么取做的,文档中并没有明确说明什么情况使用什么
这其实也是程序员本身应该自己去考虑的问题
五、单向数据流和readonly的使用
5.1 单向数据流规范
1)什么是单向数据流规范
父组件传递给子组件的对象数据,子组件只能使用,不允许修改。
虽然是能修改的,但是违反了单向数据流的原则。
如果真的想修改这个数据,应该发出事件,让父组件监听这个事件,然后在父组件中进行修改。
2)为什么要遵循这个原则
今后项目中可能会有很多子组件,父组件的一个数据可能会传递给多个子组件。
由于传递的是数据对象的引用,因此其中一个子组件中修改了数据,会导致全部引用它的地方,全部受到影响。
而且维护时,难以知道是哪个位置修改的这个数据。
其它地方也有很多类似的概念规范:
react中react有一个重要的原则:任何一个组件都应该像纯函数一样,不能修改传入的propsjs中- 在
js中也有类似原则,熟悉js的可能会知道一个纯函数的概念。纯函数意思就是函数不要对传入的参数进行修改。
这些规范如果不遵守,代码确实也能实现功能。但是将来维护性将会非常差,谁试谁知道。
5.2 readonly的使用
在给组件传递数据时,如果希望组件使用传递的内容。但是不允许它们修改时,就可以使用readonly了。
因为单向数据流原则在Vue2.x的时候时没法从代码上避免的。如果一个程序员根本不知道这个原则。
就有可能写出难以维护的代码。
而Vue3.x则提供了readonly函数从编码层面去避免这个问题。
readonly返回的对象都是不允许修改的;但是经过readonly处理的原来的对象是允许被修改的。
比如 对于语句const info = readonly(obj),info对象
相关内容
- 在react中使用tailwind的问题_React_
- Vue自定义部分页面显示导航栏功能_vue.js_
- React Native系列之Recyclerlistview使用详解_React_
- 微信小程序view与scroll-view组件的使用介绍_javascript技巧_
- 在react中使用windicss的问题_React_
- React中过渡动画的编写方式实例详解_javascript技巧_
- 用electron 打包发布集成vue2.0项目的操作过程_vue.js_
- vue中动态添加style样式的几种写法总结_vue.js_
- IntersectionObserver判断是否在可视区域详解_javascript技巧_
- vue中post请求报400的解决方案_vue.js_
