最新要闻
- 当前快看:用友与百度签署战略合作协议
- 小米13 Ultra保外维修价格出炉:换块屏幕要1400元 环球新要闻
- 环球今头条!孩子打呼噜别大意!23岁男孩打呼噜17年:睡觉差点要命
- 女生回应失业摆摊一天卖5块:摆摊是短期选择
- 转换柱套什么清单_转换柱
- 山西瀚玺能源有限公司 世界百事通
- 天天日报丨希捷全球首发30+TB机械硬盘!十几年的热辅助修成正果
- 如何冷冻绿豆砂锅 焦点热闻
- 阿莱格里:如果没被罚分,尤文可能比现在多拿10分
- 小米13Ultra翻车?网友对比三星、苹果,结果沉默了
- 简讯:SpaceX星舰升空爆炸发射失败 马斯克庆祝:当地居民苦不堪言“太可怕”
- 吃米、吃面:哪个更健康?哪个更容易胖?_热头条
- 设计美学与顶级影像共存!华为P60 Pro成业内最美全能影像旗舰|当前热文
- 天天热头条丨国内上映3天 电影《灌篮高手》票房破了3亿:有望刷新记录
- 天天观察:山西省阳泉市发布道路结冰黄色预警
- 焦点播报:计算机软件是指什么及其有关文档_计算机软件是指什么
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
vue3组合式API介绍 报资讯
为什么要使用Composition API?
根据官方的说法,vue3.0的变化包括性能上的改进、更小的 bundle 体积、对 TypeScript 更好的支持、用于处理大规模用例的全新 API,全新的api指的就是本文主要要说的组合式api。
在 vue3 版本之前,我们复用组件(或者提取和重用多个组件之间的逻辑),通常有以下几种方式:
【资料图】
- Mixin:命名空间冲突 & 渲染上下文中暴露的 property 来源不清晰。例如在阅读一个运用了多个 mixin 的模板时,很难看出某个 property 是从哪一个 mixin 中注入的。
- Renderless Component:无渲染组件需要额外的有状态的组件实例,从而使得性能有所损耗
- Vuex:就会变得更加复杂,需要去定义 Mutations 也需要去定义 Actions
上述提到的几种方式,也是我们项目中正在使用的方式。对于提取和重用多个组件之间的逻辑似乎并不简单。我们甚至采用了 extend 来做到最大化利用已有组件逻辑,因此使得代码逻辑依赖严重,难以阅读和理解。Vue3 中的 Composition API 便是解决这一问题;且完美支持类型推导,不再是依靠一个简单的 this 上下文来暴露 property(比如 methods 选项下的函数的 this 是指向组件实例的,而不是这个 methods 对象)。其是一组低侵入式的、函数式的 API,使得我们能够更灵活地「组合」组件的逻辑。
业务实践
组合式api的出现就能解决以上两个问题,此外,它也对TypeScript类型推导更加友好。在具体使用上,对vue单文件来说,模板部分和样式部分基本和以前没有区别,组合式api主要影响的是逻辑部分。下面是一个经典的vue2的计数器案例.:
vue2 实现
//Counter.vueexport default { data: () => ({ count: 0 }), methods: { increment() { this.count++; } }, computed: { double () { return this.count * 2; } }}
vue3 composition api
当我们在组件间提取并复用逻辑时,组合式API 是十分灵活的。一个组合函数仅依赖它的参数和 Vue 全局导出的 API,而不是依赖其微妙的 this 上下文。你可以将组件内的任何一段逻辑导出为函数以复用它。
- 基于响应式
- 提供 vue 的生命周期钩子
- 组件销毁时自动销毁依赖监听
- 可复用的逻辑
// Counter.vueimport { ref, computed } from "vue";export default { setup() { const count = ref(0); const double = computed(() => count * 2) function increment() { count.value++; } return { count, double, increment } }}
代码提取
Composition API的第一个明显优点是提取逻辑很容易。使用Composition提取上面Counter.vue组件代码。
//useCounter.js 组合函数import { ref, computed } from "vue";export default function () { const count = ref(0); const double = computed(() => count * 2) function increment() { count.value++; } return { count, double, increment }}
代码重用
要在组件中使用该函数,我们只需将模块导入组件文件并调用它(注意导入是一个函数)。这将返回我们定义的变量,随后我们可以从 setup 函数中返回它们。
// MyComponent.jsimport useCounter from "./useCounter.js";export default { setup() { const { count, double, increment } = useCounter(); return { count, double, increment } }}
相比而言,组合式 API:
- 暴露给模板的 property 来源十分清晰,因为它们都是被组合逻辑函数返回的值
- 不存在命名空间冲突,可以通过解构任意命名
- 不再需要仅为逻辑复用而创建新的组件实例
常用api介绍
setup
export default { setup(props, context) { console.log(context); // { attrs, slots, emit } //context.emit("emitFun", {emit: true}) return { privateMsg: props.msg }; }}
setup函数是组件内使用 component API 的入口。是在组件实例被创建时, 初始化了 props 之后调用,处于 created 前。还有以下特点:1.可以返回一个对象或函数,对象的属性会合并到模板渲染的上下文中;2.第一个参数是响应式的props对象,注意不能解构props 对象,会使其失去响应性。 **也不可直接修改 props,会触发警告3.第二个参数是一个上下文对象,暴露了 attrs,slots,emit 对象4.this 在 setup 函数中不可用。**因为它不会找到组件实例。setup 的调用发生在 data、computed 和 methods 被解析之前,所以它们无法在 setup 中被获取。
props与上下文对象attrs的区别:1、props 要先声明才能取值,attrs 不用先声明2、props 声明过的属性,attrs 里不会再出现3、props 不包含事件,attrs 包含。vue2中的$listeners 被整合到 $attrs
reactive
{{data.msg}}
<script>import { reactive } from "vue";export default { name: "ReactiveObject", setup() { const data = reactive({ msg: "hello world" }); const updateData = () => { data.msg= "hello world " + new Date().getTime(); }; return { data, updateData }; },};</script>
reactive函数接收一个普通对象然后返回对象的响应式代理,同 Vue.observable。原理:通过proxy对数据进行封装,当数据变化时,触发模板等内容的更新。
ref
{{msg}}
<script>import { ref } from "vue";export default { name: "ReactiveSingleValue", setup() { const msg= ref("hello world"); const updateMessage = () => { msg.value = "hello world " + new Date().getTime(); }; return { msg, updateMessage }; },};</script>
ref和reactive存在一定的相似性,所以需要完全理解它们才能高效的在各种场景下选择不同的方式,它们之间最明显的区别是ref使用的时候需要通过.value来取值,reactive不用。ref是property而reactive是proxy,reactive能够深度监听各种类型对象的变化,ref是处理诸如number,string之类的基本数据类型。它们的区别也可以这么理解,ref是使某一个数据提供响应能力,而reactive是为包含该数据的一整个对象提供响应能力。在模板里使用ref和嵌套在响应式对象里时不需要通过.value,会自己解开:
除了响应式ref还有一个引用DOM元素的ref,2.x里面是通过this.$refs.xxx来引用,但是在setup里面没有this,所以也是通过创建一个ref来使用:
<script>import { ref, onMounted } from "vue"export default { setup() { const node = ref(null) onMounted(() => { console.log(node.value) // 此处就是dom元素 }) return { node } }}</script>
computed
传入一个 getter 函数,返回一个默认不可修改的 ref 对象,同 vue 2.x 中的计算属性 computed
const count = ref(0)const sum = computed(() => count.value + 1)console.log(sum.value) // 1sum.value = 3 // 错误
也可传入一个 get 和 set 函数对象,创建一个可修改的计算状态
const count = ref(0)const sum = computed({ get: () => count.value + 1, set: (value) => { count.value = value - 1 }})sum.value = 55console.log(sum, count) // 1, 54
watchEffect
import { reactive, watchEffect } from "vue";export default { name: "WatchEffect", setup() { const data = reactive({ count: 1 }); watchEffect(() => console.log(`侦听器:${data.count}`)); setInterval(() => { data.count++; }, 1000); return { data }; },};
watchEffect用来监听数据的变化,它会立即执行一次,之后会追踪函数里面用到的所有响应式状态,当变化后会重新执行该回调函数。
watch
完全等效于 2.x 中 watch 选项,对比 watchEffect,watch 允许我们:
- 懒执行副作用;
- 更明确哪些状态的改变会触发侦听器重新运行副作用;
- 访问侦听状态变化前后的值。
// 监听一个 getterconst state = reactive({ count: 0 })watch( () => state.count, (count, prevCount) => { console.log(count, prevCount) })// 直接监听一个 refconst count = ref(0)watch(count, (count, prevCount) => { console.log(count, prevCount)}, { deep: true, // 深度监听 immediate: true // 初始化执行一次})// 监听多个数据watch([fooRef, barRef], ([foo, bar], [prevFoo, prevBar]) => { console.log([foo, bar], [prevFoo, prevBar])})
toRefs
把一个响应式对象转换成普通对象,该普通对象的每个 property 都是一个 ref,和响应式对象 property 一一对应。可以被解构且保持响应性
解构响应式对象数据
Username: {{username}}
Age: {{age}}
<script>import { reactive, toRefs } from "vue";export default { name: "DestructReactiveObject", setup() { const user = reactive({ username: "haihong", age: 10000, }); return { ...toRefs(user) }; },};</script>
toRef
toRef 可以用来为一个 reactive 对象的属性创建一个 ref。这个 ref 可以被传递并且能够保持响应性。
setup() { const user = reactive({ age: 1 }); const age = toRef(user, "age"); age.value++; console.log(user.age); // 2 user.age++; console.log(age.value); // 3}
Provide/Inject
为了增加 provide 值和 inject 值之间的响应性,我们可以在 provide 值时使用 ref 或 reactive。当使用响应式 provide / inject 值时,建议尽可能将对响应式 property 的所有修改限制在定义 provide 的组件内部。然而,有时我们需要在注入数据的组件内部更新 inject 的数据。在这种情况下,我们建议 provide 一个方法来负责改变响应式 property。最后,如果要确保通过 provide 传递的数据不会被 inject 的组件更改,我们建议对提供者的 property 使用 readonly。
<script>import { provide, reactive, readonly, ref } from "vue"import MyMarker from "./MyMarker.vue"export default { components: { MyMarker }, setup() { const location = ref("North Pole") const geolocation = reactive({ longitude: 90, latitude: 135 }) const updateLocation = () => { location.value = "South Pole" } provide("location", readonly(location)) provide("geolocation", readonly(geolocation)) provide("updateLocation", updateLocation) }}</script>
<script>import { inject } from "vue"export default { setup() { const userLocation = inject("location", "The Universe") const userGeolocation = inject("geolocation") const updateUserLocation = inject("updateLocation") return { userLocation, userGeolocation, updateUserLocation } }}</script>
生命周期函数
与 2.x 版本生命周期相对应的组合式 API~~beforeCreate~~ -> 使用 setup()~~created~~ -> 使用 setup()beforeMount -> onBeforeMountmounted -> onMountedbeforeUpdate -> onBeforeUpdateupdated -> onUpdatedbeforeDestroy -> onBeforeUnmountdestroyed -> onUnmountederrorCaptured -> onErrorCaptured
只需要将之前的生命周期改成onXXX的形式即可,需要注意的是created、beforeCreate两个钩子被删除了,生命周期函数只能在setup函数里使用。
总结
使用组合式api还是需要一点时间来适应的,首先需要能区分ref和reactive,不要在基本类型和引用类型、响应式和非响应式对象之间搞混,其次就是如何拆分好每一个use函数,组合式api带来了更好的代码组织方式,但也更容易把代码写的更难以维护,比如setup函数巨长。
简单总结一下升级思路,data选项里的数据通过reactive进行声明,通过...toRefs()返回;computed、mounted等选项通过对应的computed、onMounted等函数来进行替换;methods里的函数随便在哪声明,只要在setup函数里返回即可。
关键词:
-
剑指 Offer 33. 二叉搜索树的后序遍历序列(java解题)
leetcode《图解数据结构》剑指Offer33 二叉搜索树的后序遍历序列(java解题)的解题思路和java代码,并附上
来源: vue3组合式API介绍 报资讯
剑指 Offer 33. 二叉搜索树的后序遍历序列(java解题)
主从redis部署(docker)
当前快看:用友与百度签署战略合作协议
小米13 Ultra保外维修价格出炉:换块屏幕要1400元 环球新要闻
环球今头条!孩子打呼噜别大意!23岁男孩打呼噜17年:睡觉差点要命
女生回应失业摆摊一天卖5块:摆摊是短期选择
世界报道:TypeScript中的实用工具类型(Utility Types)
转换柱套什么清单_转换柱
山西瀚玺能源有限公司 世界百事通
天天日报丨希捷全球首发30+TB机械硬盘!十几年的热辅助修成正果
如何冷冻绿豆砂锅 焦点热闻
阿莱格里:如果没被罚分,尤文可能比现在多拿10分
小米13Ultra翻车?网友对比三星、苹果,结果沉默了
简讯:SpaceX星舰升空爆炸发射失败 马斯克庆祝:当地居民苦不堪言“太可怕”
吃米、吃面:哪个更健康?哪个更容易胖?_热头条
设计美学与顶级影像共存!华为P60 Pro成业内最美全能影像旗舰|当前热文
天天热头条丨国内上映3天 电影《灌篮高手》票房破了3亿:有望刷新记录
天天观察:山西省阳泉市发布道路结冰黄色预警
焦点播报:计算机软件是指什么及其有关文档_计算机软件是指什么
【新视野】豆瓣9.1分 赵继伟吐槽《灌篮高手》晴子造型“太草率” 本人回应:还会支持电影
今年全球或迎史上最热夏天:“厄尔尼诺”卷土重来
环球热点!软卧车厢分配3男1女引热议 铁路曾试行女性包厢但匆匆退市
世界焦点!中国的民间故宫,位于山西平遥,为中国传统建筑的杰出代表
Java中的堆内存和栈内存_天天速读
【世界新视野】selenium 4(python)快速入门-1 简介
全球报道:github 小技巧
武术视频课程 即时
男生能穿芭蕾舞练功服吗_男生能穿女生芭蕾练功服吗
3699元 一加Ace 2原神定制礼盒下周首销:预售时被抢光 线下人山人海-天天视点
女子喝药一周发现成分是蟑螂 网友科普:中成药、效果很好 环球新资讯
2023年第一条!贵南高铁联调联试 贵州省首次时速350公里-环球资讯
女子酒后当街撕扯男子上衣,警方:属交通事故,已转交警处理|焦点日报
Go中响应式编程库RxGo详细介绍_天天最资讯
CentOS7---基于 CentOS 7 构建 LVS-DR 群集_世界热点
世界速看:Springboot 多实例负载均衡部署
每日热闻!如何干燥落叶以保持鲜艳的颜色_女孩成人礼父母送什么礼物好呢
会计专业特长岗位_会计专业特长_每日消息
根治续航焦虑!比亚迪腾势N7续航里程出炉:最远能跑702km
三体原声黑胶来了:限量1500份 带独立编码|全球即时
淄博鸭货店小哥回应因帅气走红:以为是自己鸭货做的好吃 天天播资讯
天天亮点!语言录制兼容长按跟点击录制
詹姆斯:我认为我会在攻防两端表现更好,我们要保护主场-天天看点
皮耶罗:尤文有些锋无力,不过还好有什琴斯尼 全球观点
瑞幸罚员工抄写差评100遍违法吗?网友吵翻|全球实时
极速下载!百度网盘超级会员12个月SVIP年卡直减100元:198元好价 焦点资讯
天天播报:上海车展已禁止车企送冰淇淋 主办方:属实
《孝庄秘史》被曝抄袭作家朴月小说 网友纷纷惊叹:你觉得可惜吗?-焦点精选
火影忍者鼬出现的集数-火影忍者鼬出场集数
环球热点!广西壮族自治区贺州市2023-04-22 07:55发布雷电黄色预警
真我11 Pro+真机照出炉:圆形镜组、白色素皮后盖
没对比没伤害!谷歌裁员上万人:CEO年薪却高达15亿
【速看料】日本天价芒果再创记录 单颗价格超1.5万人民币!
环球播报:世界读书日丨作家清扬婉兮荐读:《在熟悉的家中向世界道别》
精彩看点:【manim动画教程】--目录(完结)
【全球独家】Rust编程语言入门之模式匹配
滚动:meta标签的一些属性描述
红高粱电视剧主题曲九儿歌词_红高粱主题曲九儿歌词 每日简讯
环球讯息:神速!第200家AITO用户中心开业 余承东:让车主用车更方便、更放心
今日热闻!不止领克08!魅族Flyme Auto生态扩圈:牵手吉利高端品牌极星
国家安全 全民守护!赵全营镇开展全民国家安全日宣传活动
LPR连续8个月“原地踏步” 二季度实体经济融资成本仍有望保持低位
电脑装机兼容性检查
4月份沪牌拍卖结果公布:中标率11%,平均成交价92412元-每日快播
世界快看点丨男子离奇失踪7天 人找到时已失温:科普危害有多大
男子坐飞机和妈祖像邻座:刚开始有点慌 被告知是幸运不用怕
离奇!印度一奶牛被火车撞飞30米砸死铁路边撒尿老人
福岛核污染水排海可能于7月开始实施:海底隧道6月底完工_今日看点
拉萨市绿色工业招商引资推介会在南京举行|当前热闻
最新消息:3239套保障性租赁住房加快建设中哈密市保障性安居工程建设迎新进展
小米AX9000的Docker能做什么
天天观焦点:《操作系统原型--xv6分析与实验》第一章:qemu启动xv6问题记录
HCIP-Datacom-Core 2.1 IS-IS基础实验
每日焦点!vue-admin-template 如何添加快捷导航(标签导航栏)
张歆艺晒和窦骁何超莲合影,被指修图太狠,袁弘穿花衬衫参加晚宴
2.8K高刷屏+天玑9000!vivo Pad2线下提前开售:2799元起 天天头条
斯嘉丽说不会再演黑寡妇了:影迷痛哭 天天新动态
焦点快看:浙江水库大坝端掉罕见一王三后白蚁巢:孕育百万级白蚁集团
樱子小姐的脚下埋着尸体08卷第一章:表与里02
文章学习:基于AVX-512指令集的同态加密算法中大整数运算性能优化与突破
最新消息:Java中常用不可变类
网传深圳二手房参考价取消:有业主连夜涨200万,降价房源比涨价多
险资配置遇压力:资金充沛 优质资产难寻|看热讯
【世界时快讯】多省都要封杀!老头乐事故可构成交通肇事罪 大爷们只能买新能源车、考驾照?
世界通讯!纯净的寓言
天天热讯:性能测试的一些专业概念
环球快消息!昂利康:4月20日召开业绩说明会,投资者参与
责任准备金评估利率或下调 监管部门指导险企储备新产品
使用 Spring Cloud Bus 在微服务之间传递消息示例
北方将现大范围雨雪局地大暴雪:局地冷到破纪录 秋裤快穿回来 全球观点
0秒吸水:亚光加厚纯棉大浴巾23.9元(单条450g)
【全球速看料】学系统集成项目管理工程师(中项)系列03_职业道德规范
【环球时快讯】德宏股份:2022年净利润1107.61万元 同比下降71.54%
【环球财经】英国4月份制造业和服务业复苏分化进一步明显
环球观察:周鸿祎发全员信 确认这类360员工不会被GPT取代!
世界快讯:精研“模考”功能
观察:罗翔在新东方当过三年老师 俞敏洪:讲课幽默风格是被新东方训练的
国内用户无缘!iOS 17将支持三方应用商店或仅限欧洲:苹果准备收费
商品日报(4月21日):负反馈担忧加重黑色系全线下跌 乙二醇逆势涨超2%
快消息!博敏电子:4月21日融券卖出10.9万股,融资融券余额4.75亿元