亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

vue3雙向綁定實現(xiàn)原理解讀

 更新時間:2023年10月07日 09:25:17   作者:這是提莫大人  
這篇文章主要介紹了vue3雙向綁定實現(xiàn)原理解讀,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

一、vue3為什么要用proxy實現(xiàn)雙向綁定?

1.object.defineProperty的缺點

因為es5的object.defineProperty無法監(jiān)聽對象屬性的刪除和添加

不能監(jiān)聽數(shù)組的變化,除了push/pop/shift/unshift/splice/spObject.definert/reverse,其他都不行

Object.defineProperty只能遍歷對象屬性直接修改(需要深拷貝進(jìn)行修改)

2.proxy的優(yōu)點

>1、直接監(jiān)聽對象而非屬性

>2、直接監(jiān)聽數(shù)組的變化

>3、攔截的方式有很多種(有13種,set,get,has)

>4、Proxy返回一個新對象,可以操作新對象達(dá)到目的

3.proxy的缺點

1、proxy有兼容性問題

不能用polyfill來兼容(polyfill主要撫平不同瀏覽器之間對js實現(xiàn)的差異)

二、實現(xiàn)Vue3雙向綁定

<!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>
</head>
<body>
? ? <div></div>
? ? <script>
? ? ? ? const toProxy = new WeakMap(); //存放的是代理后的對象
? ? ? ? const toRaw = new WeakMap(); ? //存放的是代理前的對象
? ? ? ? function trigger() {
? ? ? ? ? ? console.log('觸發(fā)視圖更新')
? ? ? ? }
? ? ? ? function isObject(target) {
? ? ? ? ? ? return typeof target === 'object' && target !== null;
? ? ? ? }
? ? ? ? function reactive(target) {
? ? ? ? ? ? if (!isObject(target)) {
? ? ? ? ? ? ? ? return target;
? ? ? ? ? ? }
? ? ? ? ? ? let proxy = toProxy.get(target)
? ? ? ? ? ? // 如果代理表中已經(jīng)存在了 ?就把這個結(jié)果返回
? ? ? ? ? ? if (proxy) {
? ? ? ? ? ? ? ? return proxy
? ? ? ? ? ? }
? ? ? ? ? ? // 如果這個對象已經(jīng)被代理過了 ?就直接返回
? ? ? ? ? ? if (toRaw.has(target)) {
? ? ? ? ? ? ? ? return target;
? ? ? ? ? ? }
? ? ? ? ? ? const handlers = {
? ? ? ? ? ? ? ? set(target, key, value, receiver) {
? ? ? ? ? ? ? ? ? ? if (target.hasOwnProperty(key)) {
? ? ? ? ? ? ? ? ? ? ? ? trigger()
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? return Reflect.set(target, key, value, receiver)
? ? ? ? ? ? ? ? },
? ? ? ? ? ? ? ? get(target, key, value, receiver) {
? ? ? ? ? ? ? ? ? ? const res = Reflect.get(target, key, receiver)
? ? ? ? ? ? ? ? ? ? if (isObject(target[key])) {
? ? ? ? ? ? ? ? ? ? ? ? return reactive(res)
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? return res;
? ? ? ? ? ? ? ? },
? ? ? ? ? ? ? ? deleteProperty(target, key) {
? ? ? ? ? ? ? ? ? ? return Reflect.deleteProperty(target, key)
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? let observed = new Proxy(target, handlers)
? ? ? ? ? ? toProxy.set(target, observed);
? ? ? ? ? ? toRaw.set(observed, target)
? ? ? ? ? ? return observed
? ? ? ? }
? ? ? ? let obj = {
? ? ? ? ? ? name: '溫小鹿',
? ? ? ? ? ? arr: [1, 2, 3]
? ? ? ? }
? ? ? ? // let p = reactive(obj)
? ? ? ? // p.name = 'jw'
? ? ? ? // let arr = [1, 2 ,3];
? ? ? ? // let p = reactive(arr)
? ? ? ? // p.push(4);
? ? ? ? // console.log(p)
? ? ? ? let p = reactive(obj)
? ? ? ? p = reactive(p)
? ? ? ? p = reactive(p)
? ? ? ? p.arr.push(4)
? ? ? ? console.log(p)
? ? </script>
</body>
</html>

害,基礎(chǔ)不扎實,復(fù)習(xí)一下

Reflect是ES6為操作對象而提供的新API,proxy對象的方法在rReflect上都能找到

new WeakMap() 是弱引用,在內(nèi)存不足的時候垃圾回收機制才會回收,可以作為緩存

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • vuex如何重置所有state(可定制)

    vuex如何重置所有state(可定制)

    在正式場景中我們經(jīng)常遇到一個問題,就是登出頁面或其他操作的時候,我們需要重置所有的vuex,讓其變?yōu)槌跏紶顟B(tài),那么如何重置呢,下面就跟隨小編一起來了解一下
    2019-01-01
  • Vue項目中使用WebUploader實現(xiàn)文件上傳的方法

    Vue項目中使用WebUploader實現(xiàn)文件上傳的方法

    WebUploader是由 Baidu WebFE(FEX) 團(tuán)隊開發(fā)的一個簡單的以 HTML5為主 , FLASH為輔 的現(xiàn)代 文件上傳組件 。這篇文章主要介紹了在Vue項目中使用WebUploader實現(xiàn)文件上傳,需要的朋友可以參考下
    2019-07-07
  • vue中如何監(jiān)聽url地址欄參數(shù)變化

    vue中如何監(jiān)聽url地址欄參數(shù)變化

    這篇文章主要介紹了vue中如何監(jiān)聽url地址欄參數(shù)變化問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • 純前端使用Vue3上傳文件到minio文件服務(wù)器(粘貼可直接用)

    純前端使用Vue3上傳文件到minio文件服務(wù)器(粘貼可直接用)

    vue是目前最流行的前端框架,下面這篇文章主要給大家介紹了關(guān)于純前端使用Vue3上傳文件到minio文件服務(wù)器的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-04-04
  • Vue3中如何使用Three.js詳解(包括各種樣例、常見場景、問題及解決方案)

    Vue3中如何使用Three.js詳解(包括各種樣例、常見場景、問題及解決方案)

    Three.js是一個常見的需求,Three.js是一個用于在瀏覽器中創(chuàng)建和顯示動畫3D計算機圖形的JavaScript庫,這篇文章主要介紹了Vue3中如何使用Three.js的相關(guān)資料,包括各種樣例、常見場景、問題及解決方案,需要的朋友可以參考下
    2025-04-04
  • vue如何解決空格和空行報錯的問題

    vue如何解決空格和空行報錯的問題

    這篇文章主要介紹了vue如何解決空格和空行報錯的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • vue自定義指令directive的使用方法

    vue自定義指令directive的使用方法

    這篇文章主要介紹了vue自定義指令directive的使用方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • 使用Vue?CLI配置代碼壓縮、加密和混淆功能示例代碼

    使用Vue?CLI配置代碼壓縮、加密和混淆功能示例代碼

    這篇文章主要介紹了使用Vue?CLI配置代碼壓縮、加密和混淆功能,通過配置 vue.config.js 文件,我們可以使用 Vue CLI 輕松實現(xiàn)對 Vue 應(yīng)用程序代碼的壓縮、加密和混淆,需要的朋友可以參考下
    2023-06-06
  • 詳解如何在Vue3中實現(xiàn)懶加載組件

    詳解如何在Vue3中實現(xiàn)懶加載組件

    隨著現(xiàn)代前端框架的發(fā)展,懶加載作為一種優(yōu)秀的性能優(yōu)化技術(shù),在用戶體驗和加載速度上扮演著越來越重要的角色,本文將詳細(xì)介紹如何在 Vue 3 中實現(xiàn)懶加載組件,確保你能夠?qū)⑦@一技術(shù)應(yīng)用到自己的項目中,需要的朋友可以參考下
    2024-11-11
  • 解決element DateTimePicker+vue彈出框只顯示小時

    解決element DateTimePicker+vue彈出框只顯示小時

    這篇文章主要介紹了解決element DateTimePicker+vue彈出框只顯示小時,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03

最新評論