本文为翻译文章,局部内容不免了解有偏差,如有谬误欢送大家斧正。原文链接见文章开端。
在应用Vue.js中的组合式时,有时你曾经有了一个想要应用的ref
,而有时你没有。本文将介绍一种模式,让你能够以两种形式应用组合式,从而在编写应用程序时提供更多的灵活性。
本篇是这个系列文章的第二篇,全副涵盖内容如下:
- 1.如何通过选项对象参数使您的组合更加可配置;
- 2.应用ref和unref使咱们的参数更加灵便; 本篇主题
- 3.如何使你的返回值更有用;
- 4.为什么从接口定义开始能够使你的组合式函数更弱小;
- 5.如何应用异步代码而无需“期待” - 使您的代码更易于了解;
应用ref和unref来实现更灵便的参数传递
通常,组合式API须要某些类型的参数作为输出,通常会应用到响应式变量参数。它也能够是原始的Javascript类型,如字符串,数字或对象。然而,为了使组合式更具灵活性和可重用性,咱们会心愿它能够承受任意类型的参数,并在运行时将其转换为所需的类型。
// Works if we give it a ref we already have const countRef = ref(2); useCount(countRef); // Also works if we give it just a number const countRef = useCount(2);
咱们上篇外面提到的useTitle
也实用于这种模式。当咱们传入一个ref
的时候,页面的题目将会被设置成这个ref
的value
。
const title = ref('这里是题目'); useTitle(title); title.value = '这是一个新题目';
如果咱们传入一个字符串变量的话,它将会创立一个新的ref和题目进行关联:
const title = useTitle('这里是题目'); title.value = '这是一个新题目';
下面的例子可能看起来区别不大,然而,在咱们应用到一些办法或者组合式API的时候,咱们可能会有不同的援用起源,从而这个组合式能够适应不同的状况。上面让咱们来看一下如何在咱们的组合式中应用这种模式。
在组合式中实现灵便的参数
想实现灵便的参数模式,咱们须要应用到ref
和unref
办法在参数下面。
// When we need to use a ref in the composable export default useMyComposable(input) { const ref = ref(input); } // When we need to use a raw value in the composable export default useMyComposable(input) { const rawValue = unref(input); }
如果是非响应式的参数变量的话,ref
办法会创立一个新的ref
变量给咱们;如果是响应式的话,它会间接将对应的变量返回给咱们。
// Create a new ref const myRef = ref(0); // Get the same ref back assert(myRef === ref(myRef));
unref
办法相似,只不过它是将变量的实在值返回给咱们
// Unwrap to get the inner value const value = unref(myRef); // Returns the same primitive value assert(value === unref(value));
上面让咱们看看在VueUse
中应用这种模式的例子。
举例-useTitle
让咱们持续来看下咱们曾经相熟的useTitle
办法。它容许咱们传入一个字符串或者是响应式字符串变量:
// 传入字符串变量const titleRef = useTitle('Initial title'); // 传入响应式字符串变量 const titleRef = ref('Initial title'); useTitle(titleRef);
在它的源码中,咱们能够看出,它通过ref
办法来解决咱们传入的变量
// ... const title = ref(newTitle ?? document?.title ?? null) // ...
它应用到了JavaScript中的nullish coalescing(空值合并)运算符
,其语法为“??”,意思是“如果左侧的值为null
或undefined
,则应用右侧的值”。在代码中,如果newTitle
未定义,则应用document.title
,如果document.title
也未定义,则应用null
。这个运算符能够用于简化代码中的条件判断。
另外,useTitle
的类型定义中还应用到了TypeScript 中的 MaybeRef 类型,它能够是 string
类型或 Ref<string>
类型。其中 Ref<T>
是一个带有 T
类型值的 ref
。
type MaybeRef<T> = T | Ref<T>
举例-useCssVar
useCssVar
容许咱们获取到CSS变量的值并在应用程序中应用它。和useTitle
不同的是,咱们须要传入一个string类型的值,来查问对应DOM下面的CSS变量。通过unref
办法,来解决传入的变量 - string
类型或者是一个ref
:
// Using a string const backgroundColor = useCssVar('--background-color'); // Using a ref const cssVarRef = ref('--background-color'); const backgroundColor = useCssVar(cssVarRef);
通过查看它的源码,咱们能够看出它应用了unRef
办法来解决传入的参数。而且,它还应用了一个辅助函数unrefElement
,用于确保获取的是 DOM
元素而不是 Vue
实例。
在VueUse
中很多组合式办法都应用了这个模式,如果你想深入研究的话,抉择一个感兴趣的去看它的源码吧。
小结
本篇咱们次要介绍了Vue.js中的可组合函数(composables)的第二个模式。该模式应用ref
和unref
函数来更灵便地应用参数,使可组合函数可能适应不同的应用状况。还介绍了VueUse库如何实现这种模式,并举例说明了useTitle和useCssVar可组合函数如何应用ref和unref函数。
下一篇中,咱们将会介绍另一种模式,该模式能够依据须要返回单个值或对象,从而使可组合函数更易于应用。该模式能够使可组合函数更简略易用,尤其是在大多数状况下只须要单个值的状况下。
// Returns a single value const isDark = useDark(); // Returns an object of values const { counter, pause, resume, } = useInterval(1000, { controls: true });
原文链接: # Coding Better Composables (2/5)