有梦想,有干货,微信搜索【大千世界】关注这位凌晨还在洗碗的洗碗智慧。本文已收录到GitHubhttps://github.com/qq449245884/xiaozhi,里面有完整的测试站点、资料和我的一线厂商访谈系列文章。这是《用组合编写更好的代码》的第二篇文章,上一篇:Vue3,使用组合写出更好的代码(1/5)正文开始。在使用vue组合的时候,有时候想用ref,有时候又不想用。本节介绍一种模式,可以让我使用ref或不使用ref,让组件更加灵活。使用ref和unref获得更灵活的参数几乎所有可组合对象都需要某种类型的参数作为输入。通常,这是一个反应性参考。它也可以是原始Javascript类型,例如字符串、数字或对象。但是我们想写出更灵活和可重用的组合,所以我们不仅接受ref类型参数,还接受raw类型参数,然后我们将参数转换为我们需要的参数。如下所示://传递一个refconstcountRef=ref(2);使用计数(计数参考);//或者直接一个数字constcountRef=useRef(2);VueUse中的useTitle也是采用这种模式。当我们传入一个ref时,页面的标题可以通过.value的方式动态改变。consttitle=ref('这是标题');useTitle(title);title.value='请输入新标题';如果传入的是字符串,useTitle内部会用我们传入的字符值创建一个ref,最后返回一个ref变量,然后使用.value方法动态变化。consttitle=useTitle('这是标题');title.value='请输入新标题';在组合中实现灵活的参数为了使灵活的参数模式起作用,我们需要使用ref函数或unref函数。exportdefaultuseMyComposable(input){constref=ref(input);}exportdefaultuseMyComposable(input){constrawValue=unref(input);ref函数将为我们创建一个新的ref。但是如果我们给它传递一个ref,它只会将ref返回给我们//创建一个refconstmyRef=ref(0);//结果相等assert(myRef===ref(myRef));unref函数的工作方式相同,但它要么解包ref要么返回我们的原始值。constvalue=unref(myRef);//结果相等assert(value===unref(value));让我们看看VueUse中的一些组合是如何实现这种模式的。VueUse是一个开源的Vue3合成合集,写的非常好。它是学习如何编写可组合代码的绝佳资源。useTitle又回到了useTitle,我们已经很熟悉了。这种可组合模式让我们可以传入字符串或字符串的引用。它不关心我们提供哪一个。//传入一个字符串consttitleRef=useTitle('Initialtitle');//传入一个字符串的refconsttitleRef=ref('Initialtitle');useTitle(titleRef);在源代码中,您可以看到在我们解构选项对象之后,我们创建了标题ref。这里使用了ref函数,它允许我们使用ref或字符串来创建标题的ref。//...consttitle=ref(newTitle??document?.title??null)//...这里的意思是先取newTitle作为初始化值,如果不取document?.title,还是不行,采取null。对于TypeScript用户,这里有一些有趣的事情需要注意。这里使用的newTitle变量的类型是MaybeRef
