最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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只能遍歷對象屬性直接修改(需要深拷貝進行修改)

2.proxy的優(yōu)點

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

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

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

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

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)文章

  • 使用Pinia Persistedstate插件實現(xiàn)狀態(tài)持久化的操作方法

    使用Pinia Persistedstate插件實現(xiàn)狀態(tài)持久化的操作方法

    Pinia 作為 Vue 的新一代狀態(tài)管理工具,以其輕量化和易用性受到開發(fā)者的喜愛,然而,Pinia 默認使用內(nèi)存存儲狀態(tài),為了解決這個問題,我們可以借助 Pinia Persistedstate 插件來實現(xiàn)狀態(tài)的持久化存儲,本文將詳細介紹該插件的使用方法,需要的朋友可以參考下
    2024-11-11
  • Vue使用Three.js創(chuàng)建交互式3D場景的全過程

    Vue使用Three.js創(chuàng)建交互式3D場景的全過程

    在現(xiàn)代Web開發(fā)中,通過在頁面中嵌入3D場景,可以為用戶提供更加豐富和交互性的體驗,Three.js是一款強大的3D JavaScript庫,它簡化了在瀏覽器中創(chuàng)建復(fù)雜3D場景的過程,本文將介紹如何在Vue中使用Three.js,創(chuàng)建一個簡單的交互式3D場景,需要的朋友可以參考下
    2023-11-11
  • vue2.0模擬錨點的實例

    vue2.0模擬錨點的實例

    下面小編就為大家分享一篇vue2.0模擬錨點的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-03-03
  • vue3 + ts + pnpm:nprogress / 頁面頂部進度條效果實現(xiàn)

    vue3 + ts + pnpm:nprogress / 頁

    NProgress是一款輕量級的進度條庫,主要用于網(wǎng)頁頂部顯示頁面加載或運行進度,它易于安裝和使用,并提供良好的視覺效果,NProgress也可以與VueRouter結(jié)合使用,通過導(dǎo)航守衛(wèi)在路由跳轉(zhuǎn)時自動顯示和隱藏進度條,該庫的使用提高了用戶對網(wǎng)頁加載狀態(tài)的感知,優(yōu)化了用戶體驗
    2024-09-09
  • 使用Vue3和Plotly.js繪制交互式漏斗圖的示例代碼

    使用Vue3和Plotly.js繪制交互式漏斗圖的示例代碼

    漏斗圖常用于可視化業(yè)務(wù)流程中的各個階段的轉(zhuǎn)換率,例如銷售漏斗或營銷漏斗,它可以幫助用戶識別流程中的瓶頸和改進機會,本文給大家介紹了如何使用Vue3和Plotly.js繪制交互式漏斗圖,,文中有相關(guān)代碼示例供大家參考,需要的朋友可以參考下
    2024-07-07
  • 詳解vue項目的構(gòu)建,打包,發(fā)布全過程

    詳解vue項目的構(gòu)建,打包,發(fā)布全過程

    小編給大家通過本文詳細介紹了關(guān)于vue.js項目的構(gòu)建、打包、發(fā)布的全過程,文章很以后價值,值得你參考。
    2017-11-11
  • JavaScript獲取echart曲線上任意點位的值詳解

    JavaScript獲取echart曲線上任意點位的值詳解

    這篇文章主要為大家介紹了JavaScript獲取echart曲線上任意點位的值詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • 輕量級富文本編輯器wangEditor結(jié)合vue使用方法示例

    輕量級富文本編輯器wangEditor結(jié)合vue使用方法示例

    在我們項目中,有些時候需要使用富文本編輯器。本文將以百度開發(fā)的Ueditor結(jié)合Vue.js介紹一下。非常具有實用價值,需要的朋友可以參考下
    2018-10-10
  • vue3實現(xiàn)移動端滑動模塊

    vue3實現(xiàn)移動端滑動模塊

    這篇文章主要為大家詳細介紹了vue3實現(xiàn)移動端滑動模塊,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-09-09
  • Vue使用虛擬鍵盤及中英文切換功能

    Vue使用虛擬鍵盤及中英文切換功能

    這篇文章主要給大家介紹了關(guān)于Vue使用虛擬鍵盤及中英文切換的相關(guān)資料,有時候在大型觸屏設(shè)備(如雙屏設(shè)備)中往往就沒有鍵盤去操作,所以就需要去建立一個虛擬鍵盤去操作,需要的朋友可以參考下
    2023-06-06

最新評論

郓城县| 奉节县| 建宁县| 家居| 宿迁市| 荥阳市| 双城市| 怀柔区| 类乌齐县| 克什克腾旗| 昭通市| 西华县| 望都县| 子洲县| 辰溪县| 泽州县| 晋城| 广东省| 伊春市| 南开区| 噶尔县| 安义县| 凯里市| 天气| 临邑县| 鄂温| 塔城市| 南陵县| 马关县| 延庆县| 屯留县| 湖口县| 喜德县| 天津市| 镇沅| 建德市| 乐安县| 扬中市| 周口市| 肥城市| 星子县|