vue3的ref,computed,reactive和toRefs你都了解嗎
在vue2中,data函數(shù)里返回的值直接為響應式的,但在vue3中我們需要使用一些函數(shù)才能達到這個效果。
setup函數(shù)中拿不到vue的this
1、ref
本質(zhì)為一個函數(shù),輸入?yún)?shù)為一個值(原始類型),返回響應式的對象
2、computed
本質(zhì)為一個函數(shù),輸入?yún)?shù)是一個函數(shù),可以將我們需要的值作為輸入函數(shù)的返回值
例子:實現(xiàn)點擊按鈕,屏幕上的數(shù)加1
<template>
<div id='app'>
<img alt="vue logo" src="./assets/logo.png">
<!-- ref對象在模板中引用時,vue可以直接把內(nèi)部的值展示出來,不需要寫count.value -->
<h1>{{count}}</h1>
<h1>{{double}}</h1>
<button @click='increase'>點擊</button>
</div>
</template>
<script lang='ts'>
//ref API:是一個函數(shù),輸入?yún)?shù)為一個值,返回一個響應式對象
//computed API:是一個函數(shù),輸入?yún)?shù)為函數(shù)類型,該輸入函數(shù)中包含咱們需要的值
//reactive:將響應式變量包裹在一起,更加清晰
import {computed, ref,reactive} from 'vue'
export default({
name: 'App',
/*data(){
return{
count: 0
}
},
methods:{
increase(){
this.count++
}
}*/
// 注意:在vue3中不使用data和methods,可以使用ref函數(shù),完成響應式
setup(){
const count = ref(0) //將0傳入,返回一個對象
const double = computed(()=>{
return count.value*2
})
const increase = ()=>{
count.value++ //通過返回對象的value屬性獲得響應式的數(shù)據(jù)
}
return{ //要在外面使用的變量都要先通過return導出,才能使用
count,
increase,
double
}
}
});
</script>3、reactive
本質(zhì)為一個函數(shù),接受一個object作為傳入?yún)?shù)
上述代碼在setup函數(shù)中,有很多響應式數(shù)據(jù),它們都是分散的,我們可以使用reactive將它們都包裹起來。輸出對象類型,模板中需要用data.屬性取出來。
<template>
<div id='app'>
<img alt="vue logo" src="./assets/logo.png">
<h1>{{data.count}}</h1>
<h1>{{data.double}}</h1>
<button @click='data.increase'>點擊</button>
</div>
</template>
<script lang='ts'>
import {computed, ref,reactive} from 'vue'
export default({
name: 'App',
// 注意:在vue3中不使用data和methods,可以使用ref函數(shù),完成響應式
setup(){
const data = reactive({
count:0,
increase:()=>{
data.count++
},
double:computed(()=>
data.count*2
)
})
return{ //要在外面使用的變量都要先通過return導出,才能使用
data
}
}
});
</script>上述代碼在運行時會報錯,data數(shù)據(jù)類型會出錯,這是因為內(nèi)部的computed函數(shù)造成的data類型推論循環(huán),需要解決。可以手動設置一個數(shù)據(jù)類型賦給data。
interface dataProps{
count:number,
double:number,
increase:()=>void
}繼續(xù)修改上述代碼,發(fā)現(xiàn)模板中每次使用數(shù)據(jù)都需要data.屬性才能取出來,能不能直接用屬性?這時我們想到了es6的...展開符,但是更改后發(fā)現(xiàn)點擊按鈕,屏幕上的數(shù)字不發(fā)生變化了,數(shù)據(jù)不是響應式的了。
這是因為這種方式返回的數(shù)據(jù)都是普通的js數(shù)據(jù)類型,并不是響應式的ref數(shù)據(jù)類型,因此我們需要新的方法。
4、toRefs
本質(zhì)為一個函數(shù),接受一個reactive函數(shù)作為輸入?yún)?shù),返回一個ref類型的對象。
<template>
<div id='app'>
<img alt="vue logo" src="./assets/logo.png">
<!-- ref對象在模板中引用時,vue可以直接把內(nèi)部的值展示出來,不需要寫count.value -->
<h1>{{count}}</h1>
<h1>{{double}}</h1>
<button @click='increase'>點擊</button>
</div>
</template>
const refData = toRefs(data)
return{ //要在外面使用的變量都要先通過return導出,才能使用
...refData
}這時,我們展開refData,就能實現(xiàn)響應式了。
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Vuex數(shù)據(jù)持久化實現(xiàn)的思路與代碼
Vuex數(shù)據(jù)持久化可以很好的解決全局狀態(tài)管理,當刷新后數(shù)據(jù)會消失,這是我們不愿意看到的。這篇文章主要給大家介紹了關(guān)于Vuex數(shù)據(jù)持久化實現(xiàn)的思路與代碼,需要的朋友可以參考下2021-05-05
Vue文件如何代替?zhèn)鹘y(tǒng)的HTML文件
隨著前端工程化的不斷推進,傳統(tǒng)的HTML、CSS、JavaScript三者分離的開發(fā)模式逐漸顯露出一些不足之處,尤其是在構(gòu)建復雜的單頁應用(SPA)時,Vue.js作為一個現(xiàn)代化的前端框架,提供了多種工具和技術(shù)來簡化開發(fā)流程,本文將探討.vue文件是如何替代傳統(tǒng)HTML文件的角色2024-10-10

