Vue3響應(yīng)式原理分析(Proxy(obj,{get(){},set(){}}))
Vue3原理:首先是get方法分析,再者set方法分析,最后雙向數(shù)據(jù)綁定,層層漸進(jìn)到掌握,以及與Vue2的區(qū)別,話不多說,直接上代碼分析。
1、Proxy響應(yīng)式的get方法
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
let obj = {
name:"Vue",
age:8
}
// Proxy 代理 new Proxy()創(chuàng)建一個代理對象
// new Proxy(要代理的這個對象,{get(),set()})
let obj2 = new Proxy(obj,{
get(target,property){
// 什么時候執(zhí)行? 當(dāng)我們訪問 obj2 的某個屬性的時候
// target和 property 表示什么?
// target 是這個obj對象 ,property就是我們訪問的這個屬性
console.log("執(zhí)行了get",target,property);
return target[property]
}
})
console.log(obj2.age);
console.log(obj2.name);
// obj2 是一個代理對象,屬性和值的obj一樣
</script>
</head>
<body>
</body>
</html>執(zhí)行效果

2、Proxy響應(yīng)式的set方法
<script>
let obj = {
name:"Vue",
age:8
}
// Proxy 代理 new Proxy()創(chuàng)建一個代理對象
// new Proxy(要代理的這個對象,{get(),set()})
let obj2 = new Proxy(obj,{
get(target,property){
// 什么時候執(zhí)行? 當(dāng)我們訪問 obj2 的某個屬性的時候
// target和 property 表示什么?
// target 是這個obj對象 ,property就是我們訪問的這個屬性
console.log("執(zhí)行了get",target,property);
return target[property]
},
set(target,property,newVal){
// 數(shù)據(jù)劫持的時候 執(zhí)行這里的代碼 newVal就是 boj2.age = 9 =號 后面的這個值
console.log("執(zhí)行了set",target,property,newVal);
// 在這里進(jìn)行修改這個屬性成為新的值,下次訪問,才能拿到新值
target[property] = newVal
}
})
obj2.age = 9; //修改值 觸發(fā)執(zhí)行了set
console.log(obj2.age)
/*
自己總結(jié):
1:obj2.age = 9; //修改值 觸發(fā)執(zhí)行了set 就會執(zhí)行set里面的console.log newVal=9 但是實(shí)際return是8沒有改到
2:在set里面修改值 才會變 才真正改了
*/
</script>效果圖:

3、雙向數(shù)據(jù)綁定
<body>
<input type="text" id="ipt">
<p id="op"></p>
<script>
let obj = {
txtVal : "初始值"
}
function myReactive(obj){
return new Proxy(obj,{
get(target,property){
return target[property]
},
set(target,property,newVal){
// 對象劫持 數(shù)據(jù)劫持
ipt.value = newVal
op.innerHTML = newVal
target[property] = newVal
}
})
}
let objRet = myReactive(obj);
// 綁定初始值
ipt.value = objRet.txtVal;
op.innerHTML = objRet.txtVal
ipt.addEventListener("input",e=>{
objRet.txtVal = e.target.value //觸發(fā)了set
})
</script>
</body>效果圖:

4、Vue2和Vue3set的區(qū)別
Vue3的set修改值
<script>
let obj = [10,20,30]
let obj2 = new Proxy(obj,{
get(target,property){
console.log("執(zhí)行了get",target,property);
return target[property]
},
set(target,property,newVal){
console.log("執(zhí)行了set",target,property,newVal);
}
})
obj2[0] = 1000
/*
對比:
Vue2 將初始值改為數(shù)組,在下面就修改不了了 而且觸發(fā)不了set
Vue3 就可以
*/
</script>如圖:

Vue2的set修改值(修改不了)
<body>
<input type="text" id="oipt">
<p id="op"></p>
<script>
let obj = {};
// let val = "默認(rèn)值";
let = [10,20,30]
Object.defineProperty(obj,"iptVal",{
get(){
return val;
},
set(newVal){
oipt.value =newVal
op.innerHTML = newVal
// val = newVal
}
})
// 設(shè)置初始值
oipt.value = obj.iptVal;
op.innerHTML = obj.iptVal;
oipt.addEventListener("keyup",function(e){
// 發(fā)布者,影響訂閱者的
obj.iptVal[0] = e.target.value //觸發(fā)了set
})
</script>
</body>效果圖:set 就修改不到

總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Ubuntu22.04使用nginx部署vue前端項(xiàng)目的詳細(xì)教程
這篇文章主要給大家介紹了關(guān)于Ubuntu22.04使用nginx部署vue前端項(xiàng)目的詳細(xì)教程,使用nginx部署前端項(xiàng)目是一篇非常詳細(xì)的教程,旨在幫助初學(xué)者使用Nginx來部署前端項(xiàng)目,需要的朋友可以參考下2024-03-03
vue form check 表單驗(yàn)證的實(shí)現(xiàn)代碼
這篇文章主要介紹了vue form check 表單驗(yàn)證的實(shí)現(xiàn)代碼,代碼簡單易懂,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2018-12-12
vue 實(shí)現(xiàn)setInterval 創(chuàng)建和銷毀實(shí)例
這篇文章主要介紹了vue 實(shí)現(xiàn)setInterval 創(chuàng)建和銷毀實(shí)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-07-07
vue?button的@click方法無效鉤子函數(shù)沒有執(zhí)行問題
這篇文章主要介紹了vue?button的@click方法無效鉤子函數(shù)沒有執(zhí)行問題及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03
手摸手教你實(shí)現(xiàn)Vue3 Reactivity
本文主要介紹了手摸手教你實(shí)現(xiàn)Vue3 Reactivity,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-08-08

