vue3的ref,computed,reactive和toRefs你都了解嗎
在vue2中,data函數(shù)里返回的值直接為響應(yīng)式的,但在vue3中我們需要使用一些函數(shù)才能達(dá)到這個(gè)效果。
setup函數(shù)中拿不到vue的this
1、ref
本質(zhì)為一個(gè)函數(shù),輸入?yún)?shù)為一個(gè)值(原始類型),返回響應(yīng)式的對(duì)象
2、computed
本質(zhì)為一個(gè)函數(shù),輸入?yún)?shù)是一個(gè)函數(shù),可以將我們需要的值作為輸入函數(shù)的返回值
例子:實(shí)現(xiàn)點(diǎn)擊按鈕,屏幕上的數(shù)加1
<template>
<div id='app'>
<img alt="vue logo" src="./assets/logo.png">
<!-- ref對(duì)象在模板中引用時(shí),vue可以直接把內(nèi)部的值展示出來(lái),不需要寫count.value -->
<h1>{{count}}</h1>
<h1>{{double}}</h1>
<button @click='increase'>點(diǎn)擊</button>
</div>
</template>
<script lang='ts'>
//ref API:是一個(gè)函數(shù),輸入?yún)?shù)為一個(gè)值,返回一個(gè)響應(yīng)式對(duì)象
//computed API:是一個(gè)函數(shù),輸入?yún)?shù)為函數(shù)類型,該輸入函數(shù)中包含咱們需要的值
//reactive:將響應(yīng)式變量包裹在一起,更加清晰
import {computed, ref,reactive} from 'vue'
export default({
name: 'App',
/*data(){
return{
count: 0
}
},
methods:{
increase(){
this.count++
}
}*/
// 注意:在vue3中不使用data和methods,可以使用ref函數(shù),完成響應(yīng)式
setup(){
const count = ref(0) //將0傳入,返回一個(gè)對(duì)象
const double = computed(()=>{
return count.value*2
})
const increase = ()=>{
count.value++ //通過(guò)返回對(duì)象的value屬性獲得響應(yīng)式的數(shù)據(jù)
}
return{ //要在外面使用的變量都要先通過(guò)return導(dǎo)出,才能使用
count,
increase,
double
}
}
});
</script>3、reactive
本質(zhì)為一個(gè)函數(shù),接受一個(gè)object作為傳入?yún)?shù)
上述代碼在setup函數(shù)中,有很多響應(yīng)式數(shù)據(jù),它們都是分散的,我們可以使用reactive將它們都包裹起來(lái)。輸出對(duì)象類型,模板中需要用data.屬性取出來(lái)。
<template>
<div id='app'>
<img alt="vue logo" src="./assets/logo.png">
<h1>{{data.count}}</h1>
<h1>{{data.double}}</h1>
<button @click='data.increase'>點(diǎn)擊</button>
</div>
</template>
<script lang='ts'>
import {computed, ref,reactive} from 'vue'
export default({
name: 'App',
// 注意:在vue3中不使用data和methods,可以使用ref函數(shù),完成響應(yīng)式
setup(){
const data = reactive({
count:0,
increase:()=>{
data.count++
},
double:computed(()=>
data.count*2
)
})
return{ //要在外面使用的變量都要先通過(guò)return導(dǎo)出,才能使用
data
}
}
});
</script>上述代碼在運(yùn)行時(shí)會(huì)報(bào)錯(cuò),data數(shù)據(jù)類型會(huì)出錯(cuò),這是因?yàn)閮?nèi)部的computed函數(shù)造成的data類型推論循環(huán),需要解決??梢允謩?dòng)設(shè)置一個(gè)數(shù)據(jù)類型賦給data。
interface dataProps{
count:number,
double:number,
increase:()=>void
}繼續(xù)修改上述代碼,發(fā)現(xiàn)模板中每次使用數(shù)據(jù)都需要data.屬性才能取出來(lái),能不能直接用屬性?這時(shí)我們想到了es6的...展開(kāi)符,但是更改后發(fā)現(xiàn)點(diǎn)擊按鈕,屏幕上的數(shù)字不發(fā)生變化了,數(shù)據(jù)不是響應(yīng)式的了。
這是因?yàn)檫@種方式返回的數(shù)據(jù)都是普通的js數(shù)據(jù)類型,并不是響應(yīng)式的ref數(shù)據(jù)類型,因此我們需要新的方法。
4、toRefs
本質(zhì)為一個(gè)函數(shù),接受一個(gè)reactive函數(shù)作為輸入?yún)?shù),返回一個(gè)ref類型的對(duì)象。
<template>
<div id='app'>
<img alt="vue logo" src="./assets/logo.png">
<!-- ref對(duì)象在模板中引用時(shí),vue可以直接把內(nèi)部的值展示出來(lái),不需要寫count.value -->
<h1>{{count}}</h1>
<h1>{{double}}</h1>
<button @click='increase'>點(diǎn)擊</button>
</div>
</template>
const refData = toRefs(data)
return{ //要在外面使用的變量都要先通過(guò)return導(dǎo)出,才能使用
...refData
}這時(shí),我們展開(kāi)refData,就能實(shí)現(xiàn)響應(yīng)式了。
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
vue獲取token(設(shè)置token,清除token)實(shí)現(xiàn)登錄方式
這篇文章主要介紹了vue獲取token(設(shè)置token,清除token)實(shí)現(xiàn)登錄方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09
vue二級(jí)菜單導(dǎo)航點(diǎn)擊選中事件的方法
今天小編就為大家分享一篇vue二級(jí)菜單導(dǎo)航點(diǎn)擊選中事件的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-09-09
vue el-upload手動(dòng)上傳實(shí)現(xiàn)過(guò)程
這篇文章主要介紹了vue el-upload手動(dòng)上傳實(shí)現(xiàn)過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06
VUE如何利用vue-print-nb實(shí)現(xiàn)打印功能詳解
這篇文章主要給大家介紹了關(guān)于VUE如何利用vue-print-nb實(shí)現(xiàn)打印功能的相關(guān)資料,文中還給大家介紹了vue-print-nb使用中的常見(jiàn)問(wèn)題,如空白頁(yè),需要的朋友可以參考下2022-04-04
vue3+element Plus實(shí)現(xiàn)在table中增加一條表單數(shù)據(jù)的示例代碼
這篇文章主要介紹了vue3+element Plus實(shí)現(xiàn)在table中增加一條表單數(shù)據(jù)的操作,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-01-01
vue?element-ui的el-input-number默認(rèn)值設(shè)置為空方法
這篇文章主要給大家介紹了關(guān)于vue?element-ui的el-input-number默認(rèn)值設(shè)置為空的相關(guān)資料,el-input-number組件是Element?UI非常常用的一個(gè)數(shù)字輸入框組件,它提供了默認(rèn)值設(shè)置的選項(xiàng),需要的朋友可以參考下2023-08-08
手把手教你vue實(shí)現(xiàn)動(dòng)態(tài)路由
動(dòng)態(tài)路由可以根據(jù)不同用戶登錄獲取不一樣的路由層級(jí),可隨時(shí)調(diào)配路由,下面這篇文章主要給大家介紹了關(guān)于vue實(shí)現(xiàn)動(dòng)態(tài)路由的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07

