ref和toRef區別: ref->復制, 修改響應式數據不會影響原始數據 toRef->引用, 修改響應式數據會影響原始數據 ref->數據發生改變, 界面就會自動更新 toRef->數據發生改變, 界面也不會自動更新 toRef應用場景: 如果想讓響應式數據和以前的數據關聯起來, 並且更新響應式數據之后還不想更新UI, 那么就可以使用toRef
1.toRef 創建一個ref類型數據, 並和以前的數據關聯 2.toRefs 批量創建ref類型數據, 並和以前數據關聯 3.toRef和ref區別 ref-創建出來的數據和以前無關(復制) toRef-創建出來的數據和以前的有關(引用) ref-數據變化會自動更新界面 toRef-數據變化不會自動更新界面
ref類型數據代碼
<template> <div> <p>{{state}}</p> <button @click="myFn">按鈕</button> </div> </template> <script> import {ref} from 'vue'; export default { name: 'App', setup() { let obj = {name:'lnj'}; let state = ref(obj.name); function myFn() { state.value = 'zs'; console.log(obj); //{name:'lnj'} console.log(state); // {name:'zs'} } return {state, myFn} } } </script> <style> </style>
通過發現,如果利用ref將某一個對象中的屬性變成響應式的數據,
我們修改響應式的數據是不會影響到原始數據的obj !== state, 會觸發頁面更新
通過toRef
<template> <div> <p>{{state}}</p> <button @click="myFn">按鈕</button> </div> </template> <script> /* 1.toRef 創建一個ref類型數據, 並和以前的數據關聯 2.toRefs 批量創建ref類型數據, 並和以前數據關聯 3.toRef和ref區別 ref-創建出來的數據和以前無關(復制) toRef-創建出來的數據和以前的有關(引用) ref-數據變化會自動更新界面 toRef-數據變化不會自動更新界面 * */ import {ref, toRef} from 'vue'; export default { name: 'App', setup() { let obj = {name:'lnj'}; /* ref(obj.name) -> ref(lnj) -> reactive({value:lnj}) * */ // ref->復制 // let state = ref(obj.name); // toRef->引用 /* ref和toRef區別: ref->復制, 修改響應式數據不會影響以前的數據 toRef->引用, 修改響應式數據會影響以前的數據 ref->數據發生改變, 界面就會自動更新 toRef->數據發生改變, 界面也不會自動更新 toRef應用場景: 如果想讓響應式數據和以前的數據關聯起來, 並且更新響應式數據之后還不想更新UI, 那么就可以使用toRef * */ let state = toRef(obj, 'name'); function myFn() { state.value = 'zs'; /* 結論: 如果利用ref將某一個對象中的屬性變成響應式的數據 我們修改響應式的數據是不會影響到原始數據的obj !== state * */ /* 結論: 如果利用toRef將某一個對象中的屬性變成響應式的數據 我們修改響應式的數據是會影響到原始數據的 但是如果響應式的數據是通過toRef創建的, 那么修改了數據並不會觸發UI界面的更新 * */ console.log(obj); //{name:'zs'} console.log(state); //{name:'zs'} } return {state, myFn} } } </script> <style> </style>
toRefs
<template> <div> <p>{{state}}</p> <button @click="myFn">按鈕</button> </div> </template> <script> /* 1.toRef 創建一個ref類型數據, 並和以前的數據關聯 2.toRefs 批量創建ref類型數據, 並和以前數據關聯 3.toRef和ref區別 ref-創建出來的數據和以前無關(復制) toRef-創建出來的數據和以前的有關(引用) ref-數據變化會自動更新界面 toRef-數據變化不會自動更新界面 * */ import {ref, toRef, toRefs} from 'vue'; export default { name: 'App', setup() { let obj = {name:'lnj', age:18}; // let name = toRef(obj, 'name'); // let age = toRef(obj, 'age'); let state = toRefs(obj); function myFn() { // name.value = 'zs'; // age.value = 666; state.name.value = 'zs'; state.age.value = 666; console.log(obj); //{name:'zs', age:666} console.log(state); //{name:'zs', age:666} // console.log(name); // console.log(age); } return {state, myFn} } } </script> <style> </style>