Ref&toRef

81 阅读2分钟
toRef和ref都可以用来创建响应式数据,但它们有以下关键区别:
  • 数据来源不同

ref是直接创建响应式数据;

toRef是基于已有的响应式对象创建的一个ref对象。

  • 数据关系不同

ref创建的数据和原数据没有任何关系;

toRef创建的ref数据与源对象中的属性保持引用关系。

  • 使用场景不同

ref常规的响应式数据场景;

toRef适合需要保留数据关系的场景,比如解构中的一个属性需要为ref。

  
代码示例:  
  
Copy code  
  
// refdemo  
  
const count ref(1)  
  
// toRef demo  
  
const state reactive({  
  foo1,  
  bar2  
})  

const fooRef = toRef(state, 'foo')
fooRef与state.foo之间仍然保留着引用关系,这就是toRef的特点。

总结:

ref直接创建响应式数据,toRef基于已有的响应式数据创建
toRef的响应式数据保持与源数据的引用关系

我们可以将响应式数据比作一个箱子,箱子里可以装各种物品。

ref就像是在空地上直接造了一个新箱子,然后把物品放入箱子里。
而toRef more像是我们已经有了一个装满东西的大箱子,需要从里面取出一样物品放到一个单独的小箱子中。这个小箱子和大箱子之间还有联系,如果大箱子里的这个物品变了,小箱子里的也会变。
举个例子:

//ref  
let fruitsBox = ref(['Apple','Banana'])   
  
// toRef  
let basket = reactive({  
  fruits: ['Apple','Banana'],  
  books: []  
})  

let fruitsBox = toRef(basket, 'fruits')
ref直接创建了一个果篮作为箱子
而toRef是从装满东西的大篮子里取出了一个果篮
它们之间的关系就像直接造箱子和从大箱提出小箱的关系。