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的...展開符,但是更改后發(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í),我們展開refData,就能實(shí)現(xiàn)響應(yīng)式了。
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Vuex數(shù)據(jù)持久化實(shí)現(xiàn)的思路與代碼
Vuex數(shù)據(jù)持久化可以很好的解決全局狀態(tài)管理,當(dāng)刷新后數(shù)據(jù)會(huì)消失,這是我們不愿意看到的。這篇文章主要給大家介紹了關(guān)于Vuex數(shù)據(jù)持久化實(shí)現(xiàn)的思路與代碼,需要的朋友可以參考下2021-05-05基于Vue3實(shí)現(xiàn)的圖片散落效果實(shí)例
最近工作中遇到一個(gè)效果還不錯(cuò),所以想著實(shí)現(xiàn)一下,下面這篇文章主要給大家介紹了關(guān)于如何基于Vue3實(shí)現(xiàn)的圖片散落效果的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-04-04Vue文件如何代替?zhèn)鹘y(tǒng)的HTML文件
隨著前端工程化的不斷推進(jìn),傳統(tǒng)的HTML、CSS、JavaScript三者分離的開發(fā)模式逐漸顯露出一些不足之處,尤其是在構(gòu)建復(fù)雜的單頁(yè)應(yīng)用(SPA)時(shí),Vue.js作為一個(gè)現(xiàn)代化的前端框架,提供了多種工具和技術(shù)來(lái)簡(jiǎn)化開發(fā)流程,本文將探討.vue文件是如何替代傳統(tǒng)HTML文件的角色2024-10-10