79.Options Object 模式

ops/2024/11/9 16:46:12/

有许多模式可以用来改进你的组合式函数(composables)。 使用对象来传递参数是一种非常有用的模式,在很多地方都有使用 — 只需看看 VueUse 的源码就知道了。 但是,虽然这种模式乍看起来很简单,在实现时还是有一些需要考虑的事项:

  • 当你有很多选项时会发生什么?真的很多?

  • 当你只有几个选项时该怎么办?

  • 如何判断你是否在错误地使用这种模式?

在本文中,我们将探讨 Options Object 模式。我们将介绍实现的基础知识,然后转向高级用例以及权衡使用它时的利弊。

该模式如何工作

为了使我们的代码更具可重用性,我们需要它能覆盖广泛的情况。 我们通过传入一个包含所有配置选项的对象来实现这一点,这些选项决定了我们希望组合式函数如何表现:

const state = ref({ email: '' });const { history, undo, redo } = useRefHistory(state, {// 递归跟踪历史deep: true,// 限制我们保存的变更数量capacity: 10,
});

我们在这里使用对象而不是一长串参数:

const { history, undo, redo } = useRefHistory(state, true, 10));

使用选项对象而不是参数给我们带来了几个好处。

首先,它是自文档化的。我们在值旁边直接有参数的名称,所以我们永远不会忘记每个值的作用。 我们还可以为整个选项对象创建一个类型:

export type RefHistoryOptions {deep?: boolean;capacity?: number;
};export type RefHistoryReturn {history: Ref;undo: () => void;redo: () => void;
};export function useRefHistory(ref: Ref,options: RefHistoryOptions
): RefHistoryReturn {};

其次,我们不需要担心顺序或未使用的选项。我们用组合式函数覆盖的潜在边缘情况越多,就会有越多的选项。但我们通常只需要一次关注其中的几个 — 它们都是可选的。

第三,添加新选项变得更加容易。因为顺序无关紧要,并且没有任何选项是必需的,所以向我们的组合式函数添加新功能不会破坏任何东西。我们只需将它添加到可能的选项列表中并继续前进。

实现该模式

实现这个模式也不需要太多工作:

export function useRefHistory(ref, options) {const {deep = false,capacity = Infinity,} = options;// ...
};

首先,我们将选项对象作为最后一个参数传入。这使得选项对象本身成为一个可选参数成为可能。

必需的参数排在前面。通常,只会有一两个。更多的参数是代码异味,很可能意味着你的组合式函数试图做太多事情。

必需的参数(或参数们)通常是一个 Ref,或者如果我们也在实现灵活参数模式,则是一个 MaybeRef。


http://www.ppmy.cn/ops/109700.html

相关文章

flink的大状态复用

在 Apache Flink 中,实现大状态复用主要涉及在不同任务、不同生命周期阶段,甚至不同作业之间共享或重用状态数据。复用大状态可以减少重新加载和重新计算的开销,从而提升作业的效率和业务连续性。下面是几种在 Flink 中复用大状态的常见方法&…

最直接显示 ubuntu 版本号的命令

有时候去看ubuntu版本号,去网上查,很多文章都列出一堆命令,复制命令运行一下,都是打印一些不相关的信息,我只是想看ubuntu版本号而已,能否直接列出版本号就可以了。 有,下面这条命令就是直接的…

Java题集练习1

Java题集练习1 1.排序算法&#xff1a;冒泡 &#xff0c;选择 &#xff0c;插入 &#xff0c;快排&#xff0c;优化冒泡排序使其效率更高 代码如下&#xff1a; public class Test101 {//1 直接插入排序public void InsertSort(int[] a,int size){for (int i 0;i < size…

在linux下,找到指定命令对应的路径信息

如果 which 和 whereis 命令都没有找到某个命令的原文件位置&#xff0c;可以尝试以下方法&#xff1a; 一、使用 type 命令 type 命令可以显示一个命令是内置命令还是外部命令&#xff0c;并给出其路径&#xff08;如果是外部命令&#xff09;。 例如&#xff1a; type co…

Kafka 基础与架构理解

目录 前言 Kafka 基础概念 消息队列简介&#xff1a;Kafka 与传统消息队列&#xff08;如 RabbitMQ、ActiveMQ&#xff09;的对比 Kafka 的组件 Kafka 的工作原理&#xff1a;消息的生产、分发、消费流程 Kafka 系统架构 Kafka 的分布式架构设计 Leader-Follower 机制与…

高效+灵活,万博智云全球发布AWS无代理跨云容灾方案!

摘要 近日&#xff0c;万博智云推出了基于AWS的无代理跨云容灾解决方案&#xff0c;并与拉丁美洲&#xff0c;中东&#xff0c;亚洲的合作伙伴面向全球开展了联合发布。这一方案以AWS应用环境为基础&#xff0c;将HyperBDR平台的高效、灵活和成本效益优势与无代理功能相结合&a…

构建Vue项目的侧边栏组件:Aside

构建Vue项目的侧边栏组件&#xff1a;Aside 在Vue项目中&#xff0c;侧边栏&#xff08;Aside&#xff09;是一个常见的组件&#xff0c;用于展示导航菜单。本文将详细介绍如何创建一个侧边栏组件&#xff0c;包括如何引入el-menu组件、定义路由、传递props以及编写MenuTree子…

Spring boot启动过程详解

程序设计的所有原则和方法论都是追求一件事——简单——功能简单、依赖简单、修改简单、理解简单。因为只有简单才好用&#xff0c;简单才好维护。因此&#xff0c;不应该以评论艺术品的眼光来评价程序设计是否优秀&#xff0c;程序设计的艺术不在于有多复杂多深沉&#xff0c;…