日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > vue >内容正文

vue

arduinowifi.send怎么获取响应_Vue3.0 响应式原理 (一)

發布時間:2024/9/27 vue 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 arduinowifi.send怎么获取响应_Vue3.0 响应式原理 (一) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前幾天,回顧整理下關于vue2.0的響應式原理。溫故而知新么,那么今天,整理了一下關于vue3.0的響應式原理,利用 JavaScript 來寫的。本著盡可能的清晰易懂的原則,所以,可能會分幾篇文章來發布。那現在開始上菜。


盤它!


敲黑板,面試必問,你覺得vue2.0 和vue3.0 的區別;或者說,你覺得vue3.0比vue2.0好在哪兒? 如果你只說 vue2.0 是基于Object.definePropery, vue3.0是基于Es6的proxy來架構的,僅此而已的話,那顯然是不夠的。

  • 首先我們說vue2.0 有哪些缺點或者說不足吧!
  • 遞歸,大量的遞歸,如果數據嵌套層級過多,會特別的消耗內存資源,性能不好
  • 更改數組,改變數組的長度是無效的
  • 對象不存在的屬性是不能被攔截的
  • Vue3.0 手擼版開擼

    首先來說我們要知道,vue3.0的響應式數據,是怎么搞的

    <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Vue3 原理</title> </head> <body><script src="vue.global.js"></script><script> let proxy = Vue.reactive({name: 'bryant'});// 副作用 Vue.effect 默認會先執行一次,先打印出 'bryant',而后 proxy.name 的值發生改變,則會在執行一次 打印出 'wzy'Vue.effect(()=> {console.log(proxy.name)})proxy.name = 'wzy'proxy.name = 'yolin'</script> </body> </html>

    是代碼中的這個 Vue.reactive({name: 'bryant'})這個api 是吧!

    那么我們創建一個js文件,定義一個這樣的函數

    // 1.響應式的核心方法function reactive(target) {// 創建響應式對象return createReactiveObject(target) }; // 2. 創建響應式對象 function createReactiveObject (target) {if(!isObject(target)){return target; // 判斷如果不是對象那就直接把他返回出去;};// 創建一個觀察者, 此處是vue3的核心了,不在使用object.defineProperty 而是是用來自ES6的 proxy;// baseHandle 對象中就存放一些,攔截的函數了,比如get set方法等;let baseHandle = {// 形參中的target 值得是原對象,指的是下面定義的 let data = {name: 'wzy'};,key 指的是你要獲取的某個屬性// receiver 指的是下面的proxy, 也就是data 被代理后的對象get(target,key, receiver) {console.log('獲取');// 理論上取值的話是這樣的// return target[key];// 但是在vue3中 proxy 是和一個新的api結合使用的 reflect 反射let result = Reflect.get(target,key,receiver);return result;},set(target,key,value,receiver) {console.log('設置');let flag = Reflect.set(target,key,value,receiver); // 返回的是一個布爾類型,ture && false 告訴設置是否成功return flag;},deleteProperty(target,key) {console.log('刪除');let res = Reflect.deleteProperty(target,key);return res;}};let observer = new Proxy(target, baseHandle); return observer; }; // 3. isObject(); 該函數就是判斷是不是對象function isObject(val) {return typeof val === 'object' && val !== null; };

    簡單說一下: 首先reactive函數里面return的 createdReactiveObject() 函數,是創建響應式的主體,

    首先在c函數中先判斷傳進來的數據是否為對象,如果不是對象,就return出去,是對象的話,則聲明一個變量,來接受Proxy的實例,并且把這個對象傳給 Proxy();
    如果對 Proxy 不是很了解的同學,可以去讀一下阮一峰老師的Es6很詳細。


    那么簡單的說下Proxy, 利用Proxy可以對,所要操作的對象,架設一層攔截,在這個攔截中,可以做一些我們想做的事情。那么,它所接受的第一個參數,則是要操作的目標對象數據,那么第二個參數,也是對象類型,那么在這個對象里面則是一些關于可以捕獲到的攔截的方法。比如: get set delete 等等。所以第二個參數我們創建一個baseHandle對象用來存放一些方法。


    如果上述說的不是很全面,歡迎大神掄錘!

    let baseHandle = { // 那么,在獲取值的時候,走的是這個get方法,那么就涉及到傳參的一個問題 // target 指的是原對象數據,也就是你要操作的那個對象 // key 指的是,你所要獲取的這個對象的屬性 // receiver 指的是被代理后的 對象get(target,key,receiver){console.log('獲取');// 理論上取值的話是這樣的// return target[key];// 但是在vue3中 proxy 是和一個新的api結合使用的 reflect 反射let result = Reflect.get(target,key,receiver);return result;},set() {console.log('設置');let flag = Reflect.set(target,key,value,receiver); // 返回的是一個布爾類型,ture && false 告訴設置是否成功return flag;},deleteProperty() {console.log('刪除');let res = Reflect.deleteProperty(target,key);return res;} }; let observer = new Proxy(target,handle);return observer; // 改造后的響應式數據得返回出去

    那么下面則是一部分 測試數據

    let data = {name: 'wzy'};// proxy 為經過 reactive();函數處理過后的 代理對象 let proxy = reactive(data); proxy.name = 'yolin' console.log(proxy.name) // 刪除 delete proxy.name; console.log(proxy)

    本篇文章說的不是全部vue3.0的響應式原理,只是數據是一層的情況下的。咱們拆開來一步步了解,會很清晰。

    但是看得懂不如自己手擼一遍來的實際。擼吧騷年!

    總結

    以上是生活随笔為你收集整理的arduinowifi.send怎么获取响应_Vue3.0 响应式原理 (一)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。