淺析vue3響應(yīng)式數(shù)據(jù)與watch屬性
- 是Vue3的 composition API中2個(gè)最重要的響應(yīng)式API
- ref用來(lái)處理基本類(lèi)型數(shù)據(jù), reactive用來(lái)處理對(duì)象(遞歸深度響應(yīng)式)
- 如果用ref對(duì)象/數(shù)組, 內(nèi)部會(huì)自動(dòng)將對(duì)象/數(shù)組轉(zhuǎn)換為reactive的代理對(duì)象
- ref內(nèi)部: 通過(guò)給value屬性添加getter/setter來(lái)實(shí)現(xiàn)對(duì)數(shù)據(jù)的劫持
- reactive內(nèi)部: 通過(guò)使用Proxy來(lái)實(shí)現(xiàn)對(duì)對(duì)象內(nèi)部所有數(shù)據(jù)的劫持, 并通過(guò)Reflect操作對(duì)象內(nèi)部數(shù)據(jù)
- ref的數(shù)據(jù)操作: 在js中要.value, 在模板中不需要(內(nèi)部解析模板時(shí)會(huì)自動(dòng)添加.value)
<template>
<div>ref與</div>
<div>msg1:{{msg1}}</div>
<div>msg2:{{msg2}}</div>
<div>msg3:{{msg3}}</div>
<button @click="updata">改變</button>
</template>
<script lang="ts">
import {reactive, ref} from "vue";
export default {
setup(){
const msg1=ref('hello')
const msg2 = reactive({
name: 'jack',
wife: {
name:'rose'
}
})
const msg3 = ref({ // ref中如果是一個(gè)對(duì)象,那么經(jīng)過(guò)了reactive處理,形成了Proxy對(duì)象
name: 'jack',
wife: {
name: 'rose'
}
})
function updata(){
msg1.value += '++'
msg2.wife.name += '++'
msg3.value.wife.name += '++'
}
return {
msg1,
msg2,
msg3,
updata
}
}
}
</script>
計(jì)算屬性與監(jiān)視
computed函數(shù):
- 與computed配置功能一致
- 有g(shù)etter/setter
與watch配置功能一致
- 監(jiān)視指定的一個(gè)或多個(gè)響應(yīng)式數(shù)據(jù), 一旦數(shù)據(jù)變化, 就自動(dòng)執(zhí)行監(jiān)視回調(diào)
- 默認(rèn)初始時(shí)不執(zhí)行回調(diào), 但可以通過(guò)配置immediate為true, 來(lái)指定初始時(shí)立即執(zhí)行第一次
- 通過(guò)配置deep為true, 來(lái)指定深度監(jiān)視
watchEffect函數(shù)
- 不用直接指定要監(jiān)視的數(shù)據(jù), 回調(diào)函數(shù)中使用的哪些響應(yīng)式數(shù)據(jù)就監(jiān)視哪些響應(yīng)式數(shù)據(jù)
- 默認(rèn)初始時(shí)就會(huì)執(zhí)行第一次, 從而可以收集需要監(jiān)視的數(shù)據(jù)
- 監(jiān)視數(shù)據(jù)發(fā)生變化時(shí)回調(diào)
<template>
<h1>計(jì)算屬性與監(jiān)視</h1>
<fieldset>
<legend>姓名操作</legend>
姓氏:<input type="text" placeholder="輸入姓氏" v-model="user.firstName"><br>
名字:<input type="text" placeholder="輸入名字" v-model="user.lastName">
</fieldset>
<fieldset>
<legend>計(jì)算屬性和監(jiān)視</legend>
姓名:<input type="text" placeholder="顯示姓名" v-model="fullName1"><br>
姓名:<input type="text" placeholder="顯示姓名" v-model="fullName2"><br>
姓名:<input type="text" placeholder="顯示姓名" v-model="fullName3"><br>
</fieldset>
</template>
<script lang="ts">
import {reactive, ref, computed, watch, watchEffect} from "vue";
export default {
setup() {
const user=reactive({
firstName:'東方',
lastName: '不敗'
})
/*
* Vue3中的計(jì)算屬性
* 計(jì)算屬性如果只傳入一個(gè)回調(diào)函數(shù),那么表示get
* 返回的是一個(gè)ref對(duì)象
* */
const fullName1=computed(()=>{
return user.firstName + '-' + user.lastName
})
const fullName2=computed({
get(){
return user.firstName + '-' + user.lastName
},
set(val){
const name=val.split('-')
user.firstName=name[0]
user.lastName=name[1]
}
})
// 監(jiān)視屬性
let fullName3=ref('')
watch(user,({firstName,lastName})=>{ // user里面對(duì)象解構(gòu)賦值
fullName3.value=firstName + '-' +lastName
},{immediate:true}) // immediate 開(kāi)始時(shí)執(zhí)行一次 還可以加deep 深度監(jiān)視
// watchEffect(()=>{
// fullName3.value=user.firstName + '-' +user.lastName
// }) // 更智能,開(kāi)始就自動(dòng)執(zhí)行一次
/*
* wathc可以監(jiān)視多個(gè)屬性,監(jiān)聽(tīng)非響應(yīng)式數(shù)據(jù)時(shí),需要()=>
* */
watch([()=>user.firstName,()=>user.lastName],()=>{
console.log("watch執(zhí)行了")
})
return {
user,
fullName1,
fullName2,
fullName3
}
}
}
</script>
到此這篇關(guān)于vue3響應(yīng)式數(shù)據(jù)與watch屬性的文章就介紹到這了,更多相關(guān)vue3 watch屬性內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue3 Props沒(méi)有默認(rèn)值但報(bào)錯(cuò)的解決方案
這篇文章主要介紹了Vue3 Props沒(méi)有默認(rèn)值但報(bào)錯(cuò)的解決方案,文中通過(guò)代碼示例給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-04-04
vue3+electron12+dll開(kāi)發(fā)客戶端配置詳解
本文將結(jié)合實(shí)例代碼,介紹vue3+electron12+dll客戶端配置,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-06-06
vue 內(nèi)聯(lián)樣式style中的background用法說(shuō)明
這篇文章主要介紹了vue 內(nèi)聯(lián)樣式style中的background用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08
公共Hooks封裝文件下載useDownloadFile實(shí)例詳解
這篇文章主要為大家介紹了公共Hooks封裝文件下載useDownloadFile實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
小白教程|一小時(shí)上手最流行的前端框架vue(推薦)
這篇文章主要介紹了前端框架vue,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
vue 使用 v-model 雙向綁定父子組件的值遇見(jiàn)的問(wèn)題及解決方案
這篇文章主要介紹了vue 使用 v-model 雙向綁定父子組件的值遇見(jiàn)的問(wèn)題及解決方案,幫助大家更好的理解和學(xué)習(xí)使用vue框架,感興趣的朋友可以了解下2021-03-03
基于腳手架創(chuàng)建Vue項(xiàng)目實(shí)現(xiàn)步驟詳解
這篇文章主要介紹了基于腳手架創(chuàng)建Vue項(xiàng)目實(shí)現(xiàn)步驟詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08

