到目前为止,可组合是组织Vue 3应用中业务逻辑的最佳方式。
它们让你把小块的逻辑提取到函数中,我们可以轻松地重复使用,这样的代码更容易编写和阅读。
由于这种编写Vue代码的方式相对较新,你可能想知道在编写可组合代码的最佳做法是什么。本系列教程将作为一个指南,告诉你如何编写值得信赖且可靠组合式代码。
以下是我们将讨论的内容。
首先, 我们先不看什么是可组合式?
根据Vue文档,可组合是 "利用Vue Composition API来封装和重用有状态逻辑的函数"。
这意味着任何使用响应式的代码都可以变成一个可组合的。
下面是一个来自Vue.js文档的useMouse可组合的简单例子。
import { ref, onMounted, onUnmounted } from 'vue'
export function useMouse() {
const x = ref(0)
const y = ref(0)
function update(event) {
x.value = event.pageX
y.value = event.pageY
}
onMounted(() => window.addEventListener('mousemove', update))
onUnmounted(() => window.removeEventListener('mousemove', update))
return { x, y }
}
我们将状态定义为 refs
,然后在鼠标移动时更新该状态。通过返回x
和y
refs,我们可以在任何组件(甚至是另一个可组合的组件)中使用它们。
下面是我们如何在一个组件中使用这个可组合的。
<template>
X: {{ x }} Y: {{ y }}
</template>
<script setup>
import { useMouse } from './useMouse';
const { x, y } = useMouse();
</script>
正如你所看到的,使用 useMouse
组合就可以重复使用所有这些逻辑。只需很少的额外代码,我们就能在我们的组件中抓取鼠标坐标。
大多数可组合程序有一个或两个必要的输入。然后有一系列的可选参数来帮助配置可组合的工作方式。
当配置你的可组合的时候,你可以传入一个选项对象,而不是传入一长串的参数,。
// 使用一个选项对象
const title = useTitle('A new title', { titleTemplate: '>> %s <<' });
// Title is now ">> A new title <<"
// 使用入一长串的参数
const title = useTitle('A new title', '>> %s <<');
// Title is now ">> A new title <<"
将选项作为一个整体对象而不是参数传入,给我们带来一些好处。
首先,我们不需要记住参数的正确顺序。现在有了TypeScript和编辑器自动完成功能,这已经不是一个问题了,但它仍然有区别。对于一个Javascript对象,键的顺序并不重要。
第二,代码更易读,因为我们知道这个选项是做什么的。代码即注释。我们不需要在源代码中寻找,也不需要依靠我们的IDE来让我们知道。
第三,以后再添加新的选项就容易多了。这既适用于向可组合本身添加新选项,也适用于在使用可组合时添加选项。
所以,使用一个选项对象会更好。但我们如何实现呢?
下面是如何在一个可组合的中实现选项对象模式。
export function useMouse(options) {
const {
asArray = false,
throttle = false,
} = options;
// ...
};
在这里,如果参数是必需的,我们可以接受一两个参数,然后最后一个参数是选项对象。所以在这个例子中,useMouse
没有必要的参数,只有选项对象。
下一步是分解选项对象。通过解构,我们可以访问所有的值,并明确地为每个可能的选项提供默认值。
现在,我们将看看VueUse中的两个不同的组合是如何应用该模式的。VueUse是Vue 3的一个开源组合集合,编写得非常好。它是学习如何编写可组合代码的一个很好的资源
https://vueuse.org/
首先,我们看看useTitle
,然后再看看useRefHistory
是如何工作的。
useTitle是一个相当简单的组合。它用来更新页面的标题。
const title = useTitle('Initial Page Title');
// Title: "Initial Page Title"
title.value = 'New Page Title';
// Title: "New Page Title"
它也有几个选项以获得额外的灵活性。
可以提供一个 titleTemplate
,还可以设置它来观察(observe)其他脚本可能做出的任何改变的标题(使用MutationObserver)。
const titleOptions = {
titleTemplate: '>> %s <<',
observe: true,
};
下面是使用选项对象的方式:
const title = useTitle('Initial Page Title', {
titleTemplate: '>> %s <<',
observe: true,
});
// Title: ">> Initial Page Title <<"
title.value = 'New Page Title';
// Title: ">> New Page Title <<"
当你查看useTitle的源码时,它是这么做的:
export function useTitle(newTitle, options) {
const {
document = defaultDocument,
observe = false,
titleTemplate = '%s',
} = options;
// ...
}
useTitle
可组合式有一个必要的参数,然后是一个 options
对象。在这之后,它完全按照这里描述的模式实现其余部分。
现在让我们看看一个稍微复杂的可组合,它也使用这个选项对象模式。
useRefHistory
更有趣一些。它可以让你跟踪对一个 ref
所做的所有改变,可以容易地执行撤销和重做操作。
// Set up the count ref and track it
const count = ref(0);
const { undo } = useRefHistory(count);
// Increment the count
count.value++;
// Log out the count, undo, and log again
console.log(counter.value); // 1
undo();
console.log(counter.value); // 0
此可组合可采用许多不同的选项
{
deep: false,
flush: 'pre',
capacity: -1,
clone: false,
// ...
}
我们可以把选项对象作为第二个参数传入,以进一步配置这个可组合的行为方式,与我们之前的例子一样。
const state = ref({});
const { undo, redo } = useRefHistory(state, {
deep: true, // 追踪对象和数组内部的变化
capacity: 15, // 限制我们追踪的步骤数量
});
如果我们看一下这个源代码,我们会发现它使用了与useTitle
完全相同的对象重构模式。
export function useRefHistory(source, options) {
const {
deep = false,
flush = 'pre',
eventFilter,
} = options;
// ...
}
然而,在这个例子中,我们只在开始时从选项对象中抽出几个值。
这是因为useRefHistory
在内部依赖于useManualRefHistory
可组合程序。其余的选项将作为该可组合的选项对象在后面的可组合中传递。
// ...
const manualHistory = useManualRefHistory(
source,
{
// Pass along the options object to another composable
...options,
clone: options.clone || deep,
setSource,
},
);
// ...
本文是我们“编写更好的组合”系列的第一部分。
我们研究了如何将一个选项对象作为参数添加到组件中,从而使组件的可配置性大大增强。例如,你不需要担心参数的排序,也不需要记住每个参数的作用,而且向一个对象添加更多的选项要比更新传入的参数容易得多。
但我们并不只是看了这个模式本身。我们还看到了VueUse的组合物 useTitle
和useRefHistory
是如何实现这一模式的。他们的方式略有不同,但由于这是一个简单的模式,你可以做的变化不多。
本系列的下一篇文章将探讨我们如何接受Refs和常规Javascript值作为参数。
// 传递一个 ref 值,可以工作
const countRef = ref(2);
useCount(countRef);
// 或者只给一个简单的数字
const countRef = useRef(2);
这增加了灵活性,允许我们在应用程序的更多情况下使用组合。
本文由哈喽比特于2年以前收录,如有侵权请联系我们。
文章来源:https://mp.weixin.qq.com/s/9H_0jFqU6sxyeJnyzi8jkA
京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。
日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。
据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。
今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。
日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。
近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。
据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。
9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...
9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。
据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。
特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。
据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。
近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。
据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。
9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。
《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。
近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。
社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”
2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。
罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。