淺析vue3響應(yīng)式數(shù)據(jù)與watch屬性
更新時間:2022年05月24日 08:58:05 作者:鵬程933
這篇文章主要介紹了vue3響應(yīng)式數(shù)據(jù)與watch屬性的相關(guān)知識,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
- 是Vue3的 composition API中2個最重要的響應(yīng)式API
- ref用來處理基本類型數(shù)據(jù), reactive用來處理對象(遞歸深度響應(yīng)式)
- 如果用ref對象/數(shù)組, 內(nèi)部會自動將對象/數(shù)組轉(zhuǎn)換為reactive的代理對象
- ref內(nèi)部: 通過給value屬性添加getter/setter來實現(xiàn)對數(shù)據(jù)的劫持
- reactive內(nèi)部: 通過使用Proxy來實現(xiàn)對對象內(nèi)部所有數(shù)據(jù)的劫持, 并通過Reflect操作對象內(nèi)部數(shù)據(jù)
- ref的數(shù)據(jù)操作: 在js中要.value, 在模板中不需要(內(nèi)部解析模板時會自動添加.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中如果是一個對象,那么經(jīng)過了reactive處理,形成了Proxy對象 name: 'jack', wife: { name: 'rose' } }) function updata(){ msg1.value += '++' msg2.wife.name += '++' msg3.value.wife.name += '++' } return { msg1, msg2, msg3, updata } } } </script>
計算屬性與監(jiān)視
computed函數(shù):
- 與computed配置功能一致
- 有g(shù)etter/setter
與watch配置功能一致
- 監(jiān)視指定的一個或多個響應(yīng)式數(shù)據(jù), 一旦數(shù)據(jù)變化, 就自動執(zhí)行監(jiān)視回調(diào)
- 默認(rèn)初始時不執(zhí)行回調(diào), 但可以通過配置immediate為true, 來指定初始時立即執(zhí)行第一次
- 通過配置deep為true, 來指定深度監(jiān)視
watchEffect函數(shù)
- 不用直接指定要監(jiān)視的數(shù)據(jù), 回調(diào)函數(shù)中使用的哪些響應(yīng)式數(shù)據(jù)就監(jiān)視哪些響應(yīng)式數(shù)據(jù)
- 默認(rèn)初始時就會執(zhí)行第一次, 從而可以收集需要監(jiān)視的數(shù)據(jù)
- 監(jiān)視數(shù)據(jù)發(fā)生變化時回調(diào)
<template> <h1>計算屬性與監(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>計算屬性和監(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中的計算屬性 * 計算屬性如果只傳入一個回調(diào)函數(shù),那么表示get * 返回的是一個ref對象 * */ 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里面對象解構(gòu)賦值 fullName3.value=firstName + '-' +lastName },{immediate:true}) // immediate 開始時執(zhí)行一次 還可以加deep 深度監(jiān)視 // watchEffect(()=>{ // fullName3.value=user.firstName + '-' +user.lastName // }) // 更智能,開始就自動執(zhí)行一次 /* * wathc可以監(jiān)視多個屬性,監(jiān)聽非響應(yīng)式數(shù)據(jù)時,需要()=> * */ 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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue項目 npm run build 打包項目防止瀏覽器緩存的操作方法
這篇文章主要介紹了vue項目 npm run build 打包項目防止瀏覽器緩存的操作方法,本文給大家推薦兩種方法,每種方法通過實例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08Vue?設(shè)置圖片不轉(zhuǎn)為base64的方式
這篇文章主要介紹了Vue實現(xiàn)設(shè)置圖片不轉(zhuǎn)為base64的方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02vue項目使用node連接數(shù)據(jù)庫的方法(前后端分離)
這篇文章主要介紹了vue項目使用node連接數(shù)據(jù)庫(前后端分離),本文結(jié)合示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-12-12在vue中根據(jù)光標(biāo)的顯示與消失實現(xiàn)下拉列表
這篇文章主要介紹了在vue中根據(jù)光標(biāo)的顯示與消失實現(xiàn)下拉列表,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09