国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Vue3響應(yīng)式源碼實現(xiàn)

這篇具有很好參考價值的文章主要介紹了Vue3響應(yīng)式源碼實現(xiàn)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

Vue3響應(yīng)式源碼實現(xiàn)

初始化項目結(jié)構(gòu)

vue-proxy
├── effect.js
├── effect.ts
├── index.html
├── index.js
├── package.json
├── reactive.js
├── reactive.ts
└── webpack.config.js

reactive.ts

import { track, trigger } from "./effect"

// 判斷是否是對象
const isObject = (target) => target !== null && typeof target === "object"

// 泛型約束只能傳入Object類型
export const reactive = <T extends object>(target: T) => {

    return new Proxy(target, {
        get(target, key, receiver) {
            console.log(target);
            console.log(key);
            console.log(receiver);

            let res = Reflect.get(target, key, receiver)

            track(target, key)

            if (isObject(res)) {
                return reactive(res)
            }

            return res
        },
        set(target, key, value, receiver) {
            let res = Reflect.set(target, key, value, receiver)
            console.log(target, key, value);

            trigger(target, key)
            return res
        }
    })

}

effect.ts

// 更新視圖的方法
let activeEffect;
export const effect = (fn: Function) => {
    const _effect = function () {
        activeEffect = _effect;
        fn()
    }
    _effect()
}

// 收集依賴
const targetMap = new WeakMap()
export const track = (target, key) => {
    let depsMap = targetMap.get(target)
    if (!depsMap) {
        depsMap = new Map()
        targetMap.set(target, depsMap)
    }
    let deps = depsMap.get(key)
    if (!deps) {
        deps = new Set()
        depsMap.set(key, deps)
    }
    deps.add(activeEffect)
}

// 觸發(fā)更新
export const trigger = (target, key) => {
    const depsMap = targetMap.get(target)
    const deps = depsMap.get(key)
    deps.forEach(effect => effect())
}

測試

執(zhí)行 tsc 轉(zhuǎn)成 js 代碼,沒有 tsc 的全局安裝 typescript

npm install typescript -g

新建 index.js,分別引入 effect.jsreactive.js

import { effect } from "./effect.js";
import { reactive } from "./reactive.js";

let data = reactive({
    name: "lisit",
    age: 18,
    foor: {
        bar: "汽車"
    }
})

effect(() => {
    document.getElementById("app").innerText = `數(shù)據(jù)綁定:${data.name} -- ${data.age} -- ${data.foor.bar}`
})

document.getElementById("btn").addEventListener("click", () => {
    data.age++
})

新建index.html

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <div id="app"></div>
    <button id="btn">按鈕</button>
</body>

然后再根目錄執(zhí)行

npm init -y

安裝依賴

npm install webpack webpack-cli webpack-dev-server html-webpack-plugin -D

然后新建 webpack.config.js

const path = require("path")
const HtmlWebpakcPlugin = require("html-webpack-plugin")

module.exports = {
    entry: "./index.js",
    output: {
        path: path.resolve(__dirname, "dist")
    },

    plugins: [
        new HtmlWebpakcPlugin({
            template: path.resolve(__dirname, "./index.html")
        })
    ],
    mode: "development",
    // 開發(fā)服務(wù)器
    devServer: {
        host: "localhost", // 啟動服務(wù)器域名
        port: "3000", // 啟動服務(wù)器端口號
        open: true, // 是否自動打開瀏覽器
    },
}

執(zhí)行命令啟動項目

npx webpack serve

Vue3響應(yīng)式源碼實現(xiàn),vue

Vue3響應(yīng)式源碼實現(xiàn),vue文章來源地址http://www.zghlxwxcb.cn/news/detail-697283.html

到了這里,關(guān)于Vue3響應(yīng)式源碼實現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【源碼系列#01】vue3響應(yīng)式原理(Proxy)

    專欄分享:vue2源碼專欄,vue3源碼專欄,vue router源碼專欄,玩具項目專欄,硬核??推薦?? 歡迎各位ITer關(guān)注點贊收藏?????? 在學(xué)習(xí) Vue3 是如何進行對象的響應(yīng)式代理之前,我想我們應(yīng)該先去了解下 ES6 新增的API Proxy 與 Reflect ,可參考【Vue3響應(yīng)式入門#02】Proxy and Reflect 。之

    2024年02月05日
    瀏覽(27)
  • Vue3設(shè)計思想及響應(yīng)式源碼剖析

    對TypeScript支持不友好(所有屬性都放在了this對象上,難以推倒組件的數(shù)據(jù)類型) 大量的API掛載在Vue對象的原型上,難以實現(xiàn)TreeShaking。 架構(gòu)層面對跨平臺dom渲染開發(fā)支持不友好,vue3允許自定義渲染器,擴展能力強。 CompositionAPI。受ReactHook啟發(fā) 對虛擬DOM進行了重寫、對模板的

    2024年02月05日
    瀏覽(25)
  • 【手撕源碼】vue3響應(yīng)式原理解析(文末抽獎)

    【手撕源碼】vue3響應(yīng)式原理解析(文末抽獎)

    ?? 個人主頁: 不叫貓先生 ???♂? 作者簡介:2022年度博客之星前端領(lǐng)域TOP 2,前端領(lǐng)域優(yōu)質(zhì)作者、阿里云專家博主,專注于前端各領(lǐng)域技術(shù),共同學(xué)習(xí)共同進步,一起加油呀! ??優(yōu)質(zhì)專欄:vue3從入門到精通、TypeScript從入門到實踐 ?? 資料領(lǐng)?。呵岸诉M階資料以及文中源

    2024年02月03日
    瀏覽(21)
  • Vue3實現(xiàn)響應(yīng)式編程

    Vue 3的響應(yīng)式編程實現(xiàn)主要是基于Proxy和Object.defineProperty。以下是對Vue 3的響應(yīng)式編程實現(xiàn)的簡單說明和代碼示例。 在Vue 3中,響應(yīng)式數(shù)據(jù)是通過使用JavaScript的Proxy對象實現(xiàn)的。Proxy對象可以用來定義基本操作的自定義行為(如屬性查找,賦值,枚舉,函數(shù)調(diào)用等)。 Vue 3使用

    2024年01月22日
    瀏覽(25)
  • Vue2和Vue3響應(yīng)式原理實現(xiàn)的核心

    Vue.js 是一個開源的漸進式 JavaScript 前端框架,主要用于構(gòu)建用戶界面和單頁應(yīng)用程序(SPA)。Vue.js 可以輕松地與其他庫或現(xiàn)有項目集成使用,并被認為是開發(fā)響應(yīng)式數(shù)據(jù)驅(qū)動的現(xiàn)代 Web 應(yīng)用的一種有效方式。 Vue.js 的核心特點: 響應(yīng)式數(shù)據(jù)綁定:Vue.js 可以通過對數(shù)據(jù)進行雙

    2024年02月08日
    瀏覽(39)
  • 從Vue2到Vue3【七】——Vue2中響應(yīng)式原理的實現(xiàn)及其缺陷

    從Vue2到Vue3【七】——Vue2中響應(yīng)式原理的實現(xiàn)及其缺陷

    內(nèi)容 鏈接 從Vue2到Vue3【零】 Vue3簡介 從Vue2到Vue3【一】 Composition API(第一章) 從Vue2到Vue3【二】 Composition API(第二章) 從Vue2到Vue3【三】 Composition API(第三章) 從Vue2到Vue3【四】 Composition API(第四章) 從Vue2到Vue3【五】 新的組件(Fragment、Teleport、Suspense) 從Vue2到Vue3【六

    2024年02月15日
    瀏覽(21)
  • 前端開發(fā)攻略---從源碼角度分析Vue3的Propy比Vue2的defineproperty到底好在哪里。一篇文章讓你徹底弄懂響應(yīng)式原理。

    前端開發(fā)攻略---從源碼角度分析Vue3的Propy比Vue2的defineproperty到底好在哪里。一篇文章讓你徹底弄懂響應(yīng)式原理。

    Vue的響應(yīng)式到底要干什么? 無非就是要知道當你 讀取 對象的時候,要知道它讀了。要做一些別的事情 無非就是要知道當你 修改 對象的時候,要知道它改了。要做一些別的事情 所以要想一個辦法, 把讀取和修改的動作變成一個函數(shù) ,讀取和修改的時候分別調(diào)用對應(yīng)的函數(shù)

    2024年04月17日
    瀏覽(34)
  • Vue3 第二節(jié) Vue3的響應(yīng)式

    Vue3 第二節(jié) Vue3的響應(yīng)式

    1.Vue3的響應(yīng)式原理 2.ref函數(shù)和reactive函數(shù)的對比 3.setup注意點 1.Vue2.x中的響應(yīng)式原理 ① 實現(xiàn)原理 對象類型:通過Object.defineProperty() 對屬性的讀取,修改進行攔截(數(shù)據(jù)劫持) 數(shù)組類型:通過重寫更新數(shù)據(jù)的一系列方法來實現(xiàn)攔截,對數(shù)組變更方法進行包裹 ② 存在問題 新增

    2024年02月14日
    瀏覽(19)
  • vue3響應(yīng)式原理

    vue3響應(yīng)式原理

    Vue 3 中的響應(yīng)式原理是通過使用 ES6 的 Proxy 對象來實現(xiàn)的。在 Vue 3 中,每個組件都有一個響應(yīng)式代理對象,當組件中的數(shù)據(jù)發(fā)生變化時,代理對象會立即響應(yīng)并更新視圖。 具體來說,當一個組件被創(chuàng)建時,Vue 會為組件的 data 對象創(chuàng)建一個響應(yīng)式代理對象。這個代理對象可以

    2024年02月15日
    瀏覽(37)
  • VUE3淺析---響應(yīng)式

    VUE3中setup語法糖解決響應(yīng)式的方案,所有的只要被ref或者reactive包裹的變量,都會轉(zhuǎn)變成響應(yīng)式。而在VUE2中,要想做成響應(yīng)式,必須將變量定義在data函數(shù)中。 以下代碼定義了三個User對象,并且都是使用ref做成了響應(yīng)式,當點擊按鈕改變User對象的值的時候,頁面上的值也會被

    2024年02月08日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包