为什么推荐使用ref而不是reactive

总体来说,非必要的情况下最好避免使用 reactive。官方文档也强烈推荐使用 ref() 作为声明响应式状态的主要API。以下是详细原因:

  1. 局限性问题:reactive本身存在一些局限性,可能会在开发过程中引发一些问题。这些问题需要额外的注意力和处理,否则可能对开发造成麻烦。

  2. 数据类型限制:reactive声明的数据类型仅限于对象,而ref更加灵活,可以容纳任何数据类型。这使得ref更适合一般的响应式状态的声明。

  3. 官方推荐:官方文档强烈建议使用ref()作为声明响应式状态的首选。这是因为ref更简单、更直观、同时避免了reactive可能引发的一些问题。

总的来说,除非有特定的需求使用reactive,否则在大多数情况下更推荐使用ref()

reactive和ref对比

reactive ref
只支持对象和数组(引用数据类型) 支持基本数据类型 + 引用数据类型
<script><template>中无差别使用 <script><template>使用方式不同(在<script>中要使用.value
重新分配一个新对象会丢失响应性 重新分配一个新对象不会丢失响应性
能直接访问属性 需要使用.value访问属性
将对象传入函数时,会丢失响应性 传入函数时,不会丢失响应性
解构时会丢失响应性,需要使用toRefs 解构对象时会丢失响应性,需要使用toRefs

即:

ref用于将基本类型的数据和引用类型数据转换为响应式数据,通过.value访问和修改。

reactive用于将对象转为响应式数据,可以直接访问和修改属性,适用于复杂的嵌套对象和数组。