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

vue3響應(yīng)式實(shí)現(xiàn)readonly從零開始教程

 更新時(shí)間:2023年03月06日 16:22:25   作者:Yuin316  
這篇文章主要為大家介紹了vue3響應(yīng)式實(shí)現(xiàn)readonly從零開始教程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

前言

前面的章節(jié)我們把 effect 部分大致講完了,這部分我們來講 readonly以及重構(gòu)一下reactive。

readonly的實(shí)現(xiàn)

it("happy path", () => {
    console.warn = vi.fn();
    const original = {
      foo: 1,
    };
    const observed = readonly({
      foo: 1,
    });
    expect(original).not.toBe(observed);
    expect(observed.foo).toBe(1);
    //  set不起作用
    observed.foo = 2; 
    expect(observed.foo).toBe(1);
    //  當(dāng)被set的時(shí)候,發(fā)出一個(gè)警告
    expect(console.warn).toBeCalled();
  });

其實(shí)與我們之前實(shí)現(xiàn) reactive 十分的類似,區(qū)別只不過是set 的時(shí)候不要觸發(fā)trigger,而是警告。當(dāng)然既然是不會(huì)被改變的,track 也是不必要的。

export function readonly(raw) { 
    return new Proxy(raw, { 
        get(target, key) { 
            const res = Reflect.get(target, key); 
            return res; 
        }, 
        set(target, key, newValue, receiver) {
            console.warn(
              `property: ${String(key)} can't be set, beacase ${target} is readonly.`
            );
            return true;
      },
    }); 
}
export function reactive(raw) { 
    return new Proxy(raw, { 
        get(target, key) { 
            const res = Reflect.get(target, key); 
            // 依賴收集 
            track(target, key); 
            return res; 
        }, 
        set(target, key, value) { 
            const res = Reflect.set(target, key, value); 
            // 觸發(fā)依賴 
            trigger(target, key); 
            return res; 
        }, 
    }); 
}

重構(gòu)

可以看到,readonlyreactive 實(shí)現(xiàn)其實(shí)很類似,那我們可以重構(gòu)一下,增強(qiáng)后續(xù)的拓展性。

至于我說的類似,指的是 new Proxy(target, handlers) 中的handlers(處理器對(duì)象)中的一些traps(捕獲器)。即get, set 這些方法。

我們可以通過工廠函數(shù)來創(chuàng)建那些traps函數(shù),來簡(jiǎn)化我們的代碼,提高可維護(hù)性。

另外,我們假定traps可以有工廠可以生產(chǎn)了,即handlers這部分相當(dāng)于被定下來了,new Proxy 這部分也理應(yīng)可以通過工廠函數(shù)創(chuàng)造出來。

我們先抽出一個(gè)公共的文件 baseHandler.ts

//  baseHanlder.ts
import { track, trigger } from "./effect";
//  get的工廠函數(shù)
function createGetter(isReadonly = false) {
  return function get(target, key) {
    const res = Reflect.get(target, key);
    if (!isReadonly) {
      track(target, key);
    }
    return res;
  };
}
function createSetter() {
  return function set(target, key, newValue, receiver) {
    const res = Reflect.set(target, key, newValue, receiver);
    trigger(target, key, type, newValue);
    return res;
  };
}
export const mutableHandler = {
  get: createGetter(),
  set: createSetter(),
};
export const readonlyHandler = {
  get: createGetter(),
  set(target, key, newValue, receiver) {
    console.warn(
      `property: ${String(key)} can't be set, beacase ${target} is readonly.`
    );
    return true;
};

然后是我們的reactive.ts

//  reactive.ts
import {
  mutableHandler,
  readonlyHandler,
} from "./baseHandlers";
//  proxy的工廠函數(shù)
function createReactiveObject(
  target,
  baseHandlers: ProxyHandler<any>
) {
  return new Proxy(target, baseHandlers);
}
export function reactive(target) {
  return createReactiveObject(target, mutableHandler);
}
export function readonly(target) {
  return createReactiveObject(target, readonlyHandler);
}

結(jié)束

本篇幅比較短小,但是算是為后續(xù)打下了一些基礎(chǔ)吧。因?yàn)楣P者發(fā)現(xiàn)邊學(xué)邊寫總結(jié)文章速度很慢,然后寫完 effect 那幾篇之后就開始直接一路往下學(xué),中途雖然有提交git,但是沒有打tag的習(xí)慣,搞的現(xiàn)在回來來寫文章有點(diǎn)無從下手。

不過最近應(yīng)該快把diff那部分搞定了,到時(shí)候應(yīng)該會(huì)加快速度更新,更多關(guān)于vue3響應(yīng)式readonly的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Vue實(shí)現(xiàn)各種類型文件的預(yù)覽功能

    Vue實(shí)現(xiàn)各種類型文件的預(yù)覽功能

    這篇文章主要介紹了如何在Vue3中使用aceEditor插件和vue-ipynb插件實(shí)現(xiàn)不同類型的文件預(yù)覽,包括txt、md、json、pkl、mps、py、ipynb、doc、docx、pdf、xlsx、csv等文件,需要的朋友可以參考下
    2025-03-03
  • Vue組件文檔生成工具庫的方法

    Vue組件文檔生成工具庫的方法

    本文主要介紹了Vue組件文檔生成工具庫的方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • vue3中Vant的使用及說明

    vue3中Vant的使用及說明

    這篇文章主要介紹了vue3中Vant的使用及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • Vue3響應(yīng)式對(duì)象是如何實(shí)現(xiàn)的(1)

    Vue3響應(yīng)式對(duì)象是如何實(shí)現(xiàn)的(1)

    這篇文章主要介紹了Vue3響應(yīng)式對(duì)象是如何實(shí)現(xiàn)的,文章圍繞主題展開詳細(xì)的內(nèi)容介紹具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-08-08
  • 使用Vue3-Ace-Editor如何在Vue3項(xiàng)目中集成代碼編輯器

    使用Vue3-Ace-Editor如何在Vue3項(xiàng)目中集成代碼編輯器

    這篇文章主要介紹了使用Vue3-Ace-Editor如何在Vue3項(xiàng)目中集成代碼編輯器,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Vue結(jié)合Video.js播放m3u8視頻流的方法示例

    Vue結(jié)合Video.js播放m3u8視頻流的方法示例

    本篇文章主要介紹了Vue+Video.js播放m3u8視頻流的方法示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-05-05
  • Vue之創(chuàng)建項(xiàng)目及目錄方式

    Vue之創(chuàng)建項(xiàng)目及目錄方式

    這篇文章主要介紹了Vue之創(chuàng)建項(xiàng)目及目錄方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • vue-cli3.0 特性解讀

    vue-cli3.0 特性解讀

    這篇文章主要介紹了vue-cli3.0 特性解讀,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-04-04
  • 基于Vue-Cli 打包自動(dòng)生成/抽離相關(guān)配置文件的實(shí)現(xiàn)方法

    基于Vue-Cli 打包自動(dòng)生成/抽離相關(guān)配置文件的實(shí)現(xiàn)方法

    基于Vue-cli 項(xiàng)目產(chǎn)品部署,涉及到的交互的地址等配置信息,每次都要重新打包才能生效,極大的降低了效率。這篇文章主要介紹了基于Vue-Cli 打包自動(dòng)生成/抽離相關(guān)配置文件 ,需要的朋友可以參考下
    2018-12-12
  • vue3監(jiān)聽路由的變化代碼示例

    vue3監(jiān)聽路由的變化代碼示例

    在vue項(xiàng)目中假使我們?cè)谕粋€(gè)路由下,只是改變路由后面的參數(shù)值,期望達(dá)到數(shù)據(jù)的更新,這篇文章主要給大家介紹了關(guān)于vue3監(jiān)聽路由的變化的相關(guān)資料,需要的朋友可以參考下
    2023-09-09

最新評(píng)論

澜沧| 正蓝旗| 满城县| 平定县| 社会| 巴马| 宾阳县| 克拉玛依市| 石城县| 互助| 吉首市| 淳安县| 遵义市| 五大连池市| 广平县| 宝应县| 南岸区| 镇雄县| 安徽省| 成武县| 巴彦县| 芜湖县| 仪征市| 康乐县| 吴堡县| 罗定市| 淳安县| 柯坪县| 乐平市| 长岭县| 西充县| 汤原县| 都兰县| 依安县| 贵港市| 兰西县| 赫章县| 朝阳区| 峨眉山市| 珲春市| 大新县|