乐趣区

关于前端:Vue3用组合编写更好的代码动态返回34

有幻想,有干货,微信搜寻 【大迁世界】 关注这个在凌晨还在刷碗的刷碗智。

本文 GitHub https://github.com/qq449245884/xiaozhi 已收录,有一线大厂面试残缺考点、材料以及我的系列文章。

这是《用组合编写更好的代码》第二篇,之前文章:

  • Vue3,用组合的形式来编写更好的代码(1/4)
  • Vue3,用组合编写更好的代码:灵便的参数(2/4)

如果你的组合能够依据其应用状况更改返回的内容会怎么? 如果咱们只须要一个值,它能够这样做。如果须要返回整个对象,它也能做到。

本文将介绍一种向可组合对象增加动静返回的模式。咱们将理解何时应用该模式、如何实现它,并查看正在应用的模式的一些示例。

动静返回值的模式

这种模式连续了上一篇对于灵便参数的文章中 “ 为什么不两败俱伤?” 的思路。一个可组合既能够返回一个繁多的值,也能够返回一个值的对象。

// 返回一个值
const isDark = useDark();

// 返回多个值
const {
  counter,
  pause,
  resume,
} = useInterval(1000, { controls: true});

这是一个不错的性能,因为咱们能够管制复杂程度。当须要的是简略的时候,就简略。当须要复杂性时,则是简单的。

VueUse 的 useInterval 组合就是应用了这种模式。

大多数时候,在应用 useInterval 时,咱们只须要 counter。所以默认状况下,它只是返回这个。

// 默认行为
const counter = useInterval(1000);

// 1...
// 2...
// 3...

如果你想暂停和重置 counter,也能够通过 controls 参数来做到这一点。

const {
  counter,
  pause,
  resume,
} = useInterval(1000, { controls: true});

// 1...
// 2...
pause();
// ...
resume();
// 3...
// 4...

接下来,咱们来看看这种模式怎么实现。

实现

为了实现这一模式,咱们须要做两件事:

  • options 对象中增加一个选项来关上它
  • 应用该选项来扭转 retrun 行为

上面是大略的实现思路:

export default useComposable(input, options) {
  // 1. Add in the `controls` option
  const {controls = false} = options;
  
  // ...

  // 2. Either return a single value or an object
  if (controls) {return { singleValue, anotherValue, andAnother};
  } else {return singleValue;}
}

兴许你想在一个现有的选项上进行切换,而不是只为这个目标应用一个 controls 选项。兴许应用三元表达式或比 if 语句更简洁。也可能有一种齐全不同的形式最适宜你。这种模式的重要之处在于切换,而不是切换的形式。

接下来,让咱们看看 VueUse 的一些组合办法如何实现这一模式。

useInterval

首先,让咱们深刻理解一下 useInterval 的工作原理。

在可组合的最顶层,咱们对 options 对象进行解构,取出 controls 选项并将其重命名为 exposeControls,默认值为 false.

const {
  controls: exposeControls = false,
  immediate = true,
} = options;

最初,在 if 语句,判断 exposeControls,如果为 true 刚返回 counter 及其它属性,否则只返回 counter

if (exposeControls) {
  return {
    counter,
    ...controls,
  };
else {return counter;}

有了这两段代码,咱们能够使任何可组合的有一个更灵便的返回语句。

当初,在来看看 useNow 函数。

useNow 组合式返回一个当初工夫 Date 对象,并进行响度式式更新。

const now = useNow();

默认状况下,它每一帧都会自我更新 – 默认每秒 60 次。咱们能够扭转它的更新频率,也能够暂停和复原更新过程。

const {now, pause, resume} = useNow({controls: true});

这个组合的工作形式与 useInterval 组合十分类似。在外部,它们都应用 VueUse 裸露的useIntervalFn 帮忙器。

首先,咱们对 options 对象进行解构,失去 controls 选项,再次将其更名为exposeControls,以防止命名抵触。

而后咱们在可组合的完结时返回。这里咱们应用 if 语句在两种状况之间切换。

if (exposeControls) {
  return {
    now,
    ...controls,
  };
else {return now;}

正如你所看到的,这种模式在 useInterval 和 useNow 组合中的实现简直是一样的。VueUse 中所有实现这种模式的组合物都是以这种非凡形式实现的。

上面是我能找到的所有在 VueUse 中实现这种模式的可组合的列表,供你本人进一步摸索。

  • useInterval
  • useTimeout
  • useNow
  • useTimestamp
  • useTimeAgo

总结

咱们看到,动静返回值让咱们能够更灵便地抉择如何应用可组合。咱们能够失去一个繁多的值,如果这就是咱们须要的。咱们也能够失去一个蕴含值、办法和其余咱们可能想要的货色的整个对象。

但咱们并不只是看了这个模式自身。咱们看到了 VueUse 的 useIntervaluseNow组件是如何实现这一模式的。

这种模式非常适合在大多数状况下简化咱们的代码,同时在须要的时候依然容许更大的复杂性。这有点像一张带抽屉的桌子。当你须要的时候,你能够把很多货色放在桌子上。但你也能够把它们放在抽屉里以放弃整洁。


编辑中可能存在的 bug 没法实时晓得,预先为了解决这些 bug, 花了大量的工夫进行 log 调试,这边顺便给大家举荐一个好用的 BUG 监控工具 Fundebug。

作者:Michael Thiessen 译者:小智 起源:vuemastery

原文:https://www.vuemastery.com/bl…

交换

有幻想,有干货,微信搜寻 【大迁世界】 关注这个在凌晨还在刷碗的刷碗智。

本文 GitHub https://github.com/qq449245884/xiaozhi 已收录,有一线大厂面试残缺考点、材料以及我的系列文章。

退出移动版