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

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

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

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

1.object.defineProperty的缺點(diǎn)

因?yàn)閑s5的object.defineProperty無(wú)法監(jiān)聽(tīng)對(duì)象屬性的刪除和添加

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

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

2.proxy的優(yōu)點(diǎn)

>1、直接監(jiān)聽(tīng)對(duì)象而非屬性

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

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

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

3.proxy的缺點(diǎn)

1、proxy有兼容性問(wèn)題

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

二、實(shí)現(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(); //存放的是代理后的對(duì)象
? ? ? ? const toRaw = new WeakMap(); ? //存放的是代理前的對(duì)象
? ? ? ? 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)存在了 ?就把這個(gè)結(jié)果返回
? ? ? ? ? ? if (proxy) {
? ? ? ? ? ? ? ? return proxy
? ? ? ? ? ? }
? ? ? ? ? ? // 如果這個(gè)對(duì)象已經(jīng)被代理過(guò)了 ?就直接返回
? ? ? ? ? ? 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ǔ)不扎實(shí),復(fù)習(xí)一下

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

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

總結(jié)

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

相關(guān)文章

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

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

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

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

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

    vue2.0模擬錨點(diǎn)的實(shí)例

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

    vue3 + ts + pnpm:nprogress / 頁(yè)

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

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

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

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

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

    JavaScript獲取echart曲線上任意點(diǎn)位的值詳解

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

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

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

    vue3實(shí)現(xiàn)移動(dòng)端滑動(dòng)模塊

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

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

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

最新評(píng)論

通山县| 江城| 荆州市| 桓仁| 扎鲁特旗| 黑山县| 社会| 广德县| 南和县| 柯坪县| 友谊县| 宝清县| 翁源县| 张家界市| 北宁市| 山丹县| 湟源县| 祥云县| 资溪县| 青岛市| 龙口市| 游戏| 久治县| 吉安县| 屏边| 桓仁| 深水埗区| 新干县| 尚志市| 崇信县| 榆林市| 孝义市| 柳河县| 潍坊市| 云和县| 左云县| 漾濞| 电白县| 华容县| 枞阳县| 苏尼特左旗|