主頁 > 企業開發 > Vue 3 Deep Dive with Evan You

Vue 3 Deep Dive with Evan You

2020-09-14 06:11:07 企業開發

什么是 DOM?

如果我們把這個 HTML 加載到瀏覽器中,瀏覽器創建這些節點,用來顯示網頁,所以這個HTML映射到一系列DOM節點,然后我們可以使用JavaScript進行操作,例如:

let item = document.getElementByTagName('h1')[0]
item.textContent = "New Heading"

VDOM

網頁可以有很多DOM節點,這意味著DOM樹可以有數千個節點,這就是為什么我們有像Vue這樣的框架,幫我們干這些重活兒,并進行大量的JavaScript呼叫,

然而,搜索和更新數千個DOM節點很明顯會變慢,這就是Vue和其他類似框架有一種叫做虛擬DOM的東西,虛擬DOM是表示DOM的一種方式,例如,這個HTML也可以通過一個虛擬節點來表示,看起來像這樣,如您所見,它只是一個JavaScript物件,

<div>Hello</div>
{
    tag: 'div',
    children: [
        {
            text: 'Hello'
        }
    ]
}

Vue知道如何使用此虛擬節點并掛載到DOM上,它會更新我們在瀏覽器中看到的內容,實際上還有一個步驟其中,Vue基于我們的模板創建一個渲染函式,回傳一個虛擬DOM節點,

渲染函式可以是這樣的:

render(h) {
    return h('div', 'hello')
}

當組件更改時,Render函式將重新運行,它將創建另一個虛擬節點,然后發送舊的 VNode 和新的 VNode 到Vue中進行比較并以最高效的方式在我們的網頁上更新,

我們可以將虛擬DOM和實際DOM的關系類比為藍圖和實際建筑的關系,假設我更改了29樓的一些資料,我改變了家具的布局還加了一些櫥柜,我有兩種方法可以改變,首先,我可以拆除29樓的一切從頭開始重建,或者我可以創造新的藍圖,比較新舊藍圖并進行更新以盡可能減少作業量,這就是虛擬DOM的作業原理,Vue 3讓這些更新更快并且更高效,

核心模塊

Vue 的三個核心模塊:

  • Reactivity Module 回應式模塊
  • Compiler Module 編譯器模塊
  • Renderer Module 渲染模塊

回應式模塊允許我們創建 JavaScript 回應物件并可以觀察其變化,當使用這些物件的代碼運行時,它們會被跟蹤,因此,它們可以在回應物件發生變化后運行,

編譯器模塊獲取 HTML 模板并將它們編譯成渲染函式,這可能在運行時在瀏覽器中發生,但在構建 Vue 專案時更常見,這樣瀏覽器就可以只接收渲染函式,

渲染模塊的代碼包含在網頁上渲染組件的三個不同階段:

  • 渲染階段
  • 掛載階段
  • 補丁階段

在渲染階段,將呼叫 render 函式,它回傳一個虛擬 DOM 節點,
在掛載階段,使用虛擬DOM節點并呼叫 DOM API 來創建網頁,
在補丁階段,渲染器將舊的虛擬節點和新的虛擬節點進行比較并只更新網頁變化的部分,

現在讓我們來看一個例子,一個簡單組件的執行,它有一個模板,以及在模板內部使用的回應物件,首先,模板編譯器將 HTML 轉換為一個渲染函式,然后初始化回應物件,使用回應式模塊,接下來,在渲染模塊中,我們進入渲染階段,這將呼叫 render 函式,它參考了回應物件,我們現在監聽這個回應物件的變化,render 函式回傳一個虛擬 DOM 節點,接下來,在掛載階段,呼叫 mount 函式使用虛擬 DOM 節點創建 web 頁面,最后,如果我們的回應物件發生任何變化,正在被監視,渲染器再次呼叫render函式,創建一個新的虛擬DOM節點,新的和舊的虛擬DOM節點,發送到補丁函式中,然后根據需要更新我們的網頁,

渲染器機制

擁有虛擬DOM層有一些好處,最重要的是它讓組件的渲染邏輯完全從真實DOM中解耦,并讓它更直接地重用框架的運行時在其他環境中,例如,Vue允許第三方開發人員創建自定義渲染解決方案目標,不僅僅是瀏覽器也包括IOS和Android等原生環境,也可以使用API創建自定義渲染器直接渲染到WebGL而不是DOM節點,在Vue 2中我們實際上已經有了這種能力但是,我們在Vue 2中提供的API沒有正式記錄并且需要分叉源代碼,所以這給維護帶來了很大的負擔,對開發這些定制解決方案的開發人員在Vue 3中,我們讓自定義渲染器API成為一等公民,因此開發人員可以直接拉取Vue運行時核心作為依賴項,然后利用自定義渲染器API構建自己的自定義渲染器,事實上,我們已經有了早期用戶報告他們已經成功地構建了一個使用Vue 3 API關于虛擬DOM的WebGL渲染器,

另一個重要方面,它提供了能力以編程方式構造、檢查、克隆以及操作所需的DOM結構,在實際回傳渲染引擎之前你可以利用JavaScript的全部能力做到這些,這個能力很重要,因為總會有某些情況在UI編程中使用模板語法會有一些限制,你只需要一種有充分靈活性的合適的編程語言來表達潛在的邏輯,現在,這種情況實際上是相當罕見的在日常UI開發中,但當你在創作一個庫的時候,這種情況更常見或撰寫UI組件套件,你打算上傳供第三方開發者使用,讓我們想象一下一個,像復雜型別的頂部框這樣的組件或者一個與一堆文本相關聯的輸入框,這些型別的組件通常包含很少的標記,但它們將包含很多互動邏輯在這些情況下,模板語法有時候會限制你更容易地表達潛在的邏輯,或者有時候你會發現自己在模板中加入了很多邏輯,但你還是有很多邏輯在JavaScript 中而 render 函式允許你把這些邏輯組合在一個地方你通常不需要想太多關于這些情況下的標記,

所以我理解是模板會完成你要做的事在99%的情況下你只需要寫出HTML就好了,但偶爾可能想做些更可控的事情在,你需要撰寫一個渲染函式,Vue 2中的渲染函式如下所示,

render(h) {
    return h (
        'div', {
        attrs: {
            id: foo
        },
        on: {
            click: this.onClick
        },
        'hello'
    })
}

所以這是組件定義中的一個選項,相對于提供一個 template 選項,在 Vue 2 中你可以為組件提供一個渲染函式,你會得到 h 引數,直接作為渲染函式的引數,你可以用它來創造我們稱之為虛擬DOM節點,簡稱 vnode,

vnode 接受三個引數:

  • 第一個引數是型別,所以我們在這里創建一個 div,
  • 第二個引數是一個物件包含 vnode 上的所有資料或屬性,API有點冗長從某種意義上說,你必須指明傳遞給節點的系結型別,例如,如果要系結屬性你必須把它嵌套在attrs物件下如果要系結事件偵聽器你得把它列在 on 下面,
  • 第三個引數是這個 vnode 的子節點,所以直接傳遞一個字串是一個方便的 API,表明此節點只包含文本子節點,但它也可以是包含更多子節點的陣列,所以你可以在這里有一個陣列并且嵌套了更多的嵌套 h 呼叫,

在Vue 3中我們改變了API,目標是簡化它,

import { h } from 'vue'

render () {
    return h(
        'div', 
        {
            id: 'foo',
            onClick: this.onClick
        },
        'hello'
    })
}

第一個顯著的變化是我們現在有了一個扁平的 props 結構,當你呼叫 h 時,第二個引數現在總是一個扁平的物件,你可以直接給它傳遞一個屬性,這里我們只是給它一個 ID,按慣例監聽器以 on 開頭,所以任何帶 on 的都會自動系結為一個監聽器所以你不必考慮太多嵌套的問題,

在大多數情況下,你也不需要思考是應將其作為 attribute 系結還是DOM屬性系結,因為 Vue 將智能地找出為你做這件事的最好方法,我們檢查這個 key 是否作為屬性存在在原生 DOM 中,如果存在,我們會將其設定為 property,如果它不存在,我們將它設定為一個attribute,

render API 的另一項改動是 h helper 現在是直接從 Vue 本身全域匯入的,一些用戶在 Vue 2 中因為 h 在這里傳遞而在這里面 h 又很特別,因為它系結到當前組件實體,當你想拆分一個大的渲染函式時,你必須把這個 h 函式一路傳遞給這些分割函式,所以,這有點困難,但有了全域引入的 h 你匯入一次就可以分割你的渲染函式,在同一個檔案里分割多少個都行,

渲染函式不再有 h 引數了,在內部它確實接收引數,但這只是編譯器使用的用來生成代碼,當用戶直接使用時,他們不需要這個引數,所以,如果你用 TypeScript 使用定義的組件 API 你也會得到 this 的完整型別推斷,

Q&A

1.我知道原始的那種虛擬 Dom 的實作得到了啟發來自其他專案對嗎?

是的有一個庫叫snabbdomVue 2基本上就是從這個庫中分離出來的,

2.好的然后是Vue 3,你在這里的編碼方式只是改進了Vue 2的模式嗎?

好吧,Vue 3是一個徹底的重寫,幾乎從頭開始一切都是定制的顯然,有現有的演算法看起來像沒有變化,因為這些是我們看到社區在做廣泛研究的領域所以這是建立在所有這些以前的實作的基礎上的但代碼本身現在是從頭開始,

3.都是用TypeScript寫的,對吧?

是的,都是 TypeScript 寫的,

何時/如何使用 render 函式

看看渲染函式在 Vue 中是什么樣子,在 Vue 2 中,一個傳統的 Vue 組件,有一個 template 選項,但是為了重用渲染函式我們可以用一個名為 render 的函式來代替它,我們會通過引數得到這個稱為 h(hyperscript),但在這里,我們只是示范一下我們如何在 Vue 3 中使用它,我們會從 vue 匯入 h,我們可以用它來回傳 h,

import { h } from 'vue'

const App = {
    render () {
        return h('div') 
    }
}

// 等效模板中的普通 div

1.所以它回傳 div 的 JavaScript 物件表示?

完全正確,

2.那么,你的虛擬dom就像…編譯器?是編譯器接收它嗎?

是渲染器,渲染器接收它,

3.然后它實際上進行 dom 呼叫將其帶入瀏覽器?

完全正確,

所以我們可以給這個虛擬節點一些 props,

import { h } from 'vue'

const App = {
    render () {
        return h(
            'div',
            {
                id: 'hello'
            },
            [
                h('span','world')
            ]
        ) 
    }
}

// <div id="hello"><span>world</span></div>

現在,我們知道如何生成靜態結構,但是當人們第一次使用 render 函式會問 “我該怎么寫,比如說,v-if 或者 v-for”?我們沒有像 v-if 或者類似的東西,相反,您可以直接使用 JavaScript,

import { h } from 'vue'

const App = {
    render () {
        return this.ok
            ? h('div',{ id: 'hello' },[h('span','world')]
            : h('p', 'other branch')
        ) 
    }
}

如果 ok 的值為 true,它將呈現 div,反之,它將呈現 p,同樣,如果你想做 v-else-if 你需要嵌套這個三元運算式:

import { h } from 'vue'

const App = {
    render () {
        return this.ok
            ? h('div',{ id: 'hello' },[h('span','world')]
            : this.otherCondition
                ? h('p', 'other branch')
                : h('span')
        ) 
    }
}

我想你可能會喜歡創建一個變數,將不同的節點添加到該變數,所以當你不得不將這整個東西嵌套在一個運算式呼叫中這會很有用,但你不必這么做,

import { h } from 'vue'

let nodeToReturn
if(this.ok) {
    nodeToReturn = ...
} else if () {

}

const App = {
    render () {
        return this.ok
            ? h('div',{ id: 'hello' },[h('span','world')]
            : this.otherCondition
                ? h('p', 'other branch')
                : h('span')
        ) 
    }
}

這就是 JavaScript 靈活的地方,這看起來更像普通的 JavaScript,當你的代碼變得更加復雜時您可以使用普通的 JavaScript 重構技巧使它們更容易理解,

我們討論了 v-if, 接下來看看 v-for, 類似的,你也可以給它們加上 key,這是渲染函式中的渲染串列,

import { h } from 'vue'

const App = {
    render () {
        return this.list.map(item => {
            return h('div', {key: item.id}, item.text)
        })) 
    }
}

在渲染函式中,您可能要處理插槽,當你寫一個重標記組件(markup heavy component),或者我更喜歡稱之為特性組件(feature component),它與你的應用程式的外觀布局結構有關,將實際的 HTML 顯示給用戶,對于那些型別的組件,我更喜歡始終使用模板,只有在我必須使用渲染函式的時候,比如我在寫一些功能型的組件,有時會期望獲取一些插槽內容,將其打包或者以某種方式操縱他們,在 Vue 3 里默認插槽將暴露在這個 this.$slot.default,如果對于組件什么都沒有提供,這將是 undefined,所以你得先檢查一下它的存在,如果它存在,它將永遠是一個陣列,有了作用域槽,我們可以將 props 傳遞給作用域槽,所以把資料傳遞到作用域槽只是通過傳遞一個引數到這個函式呼叫中,因為這是一個陣列你可以將它直接放在 children 位置,

import { h } from 'vue'

const App = {
    render () {
        const slot = this.$slot.default
            ? this.$slot.default()
            : []
        
        return h('div', slot)
    }
}

你可以在 render 函式中用插槽做一件很強大的事,比如以某種方式操縱插槽,因為它只是一個 JavaScript 物件陣列,你可以用 map 遍歷它,

import { h } from 'vue'

const App = {
    render () {
        const slot = this.$slot.default
            ? this.$slot.default()
            : []
        
        slot.map(vnode => {
            return h('div', [vnode])
        })
    }
}

這里有一個例子,截住并更改插槽資料,假設我們有一個堆疊組件(tack component),在一些用戶界面庫(UI libraries)中很常見,你可以傳遞很多屬性給它,得到嵌套的堆疊渲染結果,有點像 HTML 中 ulol 的默認樣式,

<Stack size="4">
    <div>hello</div>
    <Stack size="4">
        <div>hello</div>
        <div>hello</div>
    </Stack>
</Stack>

渲染成這樣:

<div class="stack">
    <div class="mt-4">
         <div>hello</div>
    </div>
    <div class="mt-4">
         <div class="stack">
            <div class="mt-4">
                <div>hello</div>
            </div>
         </div>
    </div>
</div>

這里有一個普通的基于模板的語法,在同一個插槽內它們都是默認插槽,你能做的只有渲染這個部分,在模板很難實作,但是你可以用渲染函式來實作,程式化的遍歷插槽內的每個專案然后把它們變成別的東西,

import { h } from 'vue'

const Stack = {
    render () {
        const slot = this.$slots.default
            ? this.$slots.default()
            : []
        
        return h(
            'div',
            {class: 'stack'},
            slot.map(child => {
                return h(
                        'div', 
                        {class: `mt-${this.$props.size}`},
                        [child]
                    )
            })
        )
    }
}

我們用 slot.map 生成新的 vnode 串列,原來的子插槽被包裝在里面,有了這個,我們把它放到一個 stack.html 檔案里,

stack.html

<script src=https://www.cnblogs.com/guangzan/p/"https://unpkg.com/vue@next"></script>
<style>
    .mt-4 {
        margin: 10px
    }
</style>


<script> const { h, createApp } = Vue const Stack = { render() { const slot = this.$slots.default ? this.$slots.default() : [] return h('div', { class: 'stack' }, slot.map(child => { return h('div', { class: `mt-${this.$attrs.size}` }, [child]) // this.$props.size ? }) ) }, } const App = { components: { Stack }, template: ` <Stack size="4"> <div>hello</div> <Stack size="4"> <div>hello</div> <div>hello</div> </Stack> </Stack> ` } createApp(App).mount('#app') </script>

當你創作這些底層的公用設施組件,有時真的會遇到麻煩,這時渲染函式更有效,但話說回來,也需要了解每種方法的利弊,這些是為了讓你更好地理解在什么情況下應該使用模板或使用渲染函式,基本上是當你用一個模板時遇到限制時,比如你就像我們剛才看到的那樣,可能改為使用渲染函式會更有效,當你意識到想表達的邏輯用 JavaScript 更容易而不是使用模板語法時就使用它,從我的經驗來看,這種情況在您創作可重用的功能組件,要跨多個應用程式共享或者在組織內部共享時更常見,在日常開發中你主要是在撰寫特性組件,模板通常是有效的方式,模板的好處是更簡單,當你有很多標記的時候會通過編譯器優化,它的另一個好處是它更容易讓設計師接管組件并用CSS設計樣式,因此,Vue 提供了這兩個選項,當情況出現的時候以便您可以選擇合適的方式,


更新中...

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/31513.html

標籤:JavaScript

上一篇:JavaScript的BOM相關內容

下一篇:WEB前端常見受攻擊方式及解決辦法

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • IEEE1588PTP在數字化變電站時鐘同步方面的應用

    IEEE1588ptp在數字化變電站時鐘同步方面的應用 京準電子科技官微——ahjzsz 一、電力系統時間同步基本概況 隨著對IEC 61850標準研究的不斷深入,國內外學者提出基于IEC61850通信標準體系建設數字化變電站的發展思路。數字化變電站與常規變電站的顯著區別在于程序層傳統的電流/電壓互 ......

    uj5u.com 2020-09-10 03:51:52 more
  • HTTP request smuggling CL.TE

    CL.TE 簡介 前端通過Content-Length處理請求,通過反向代理或者負載均衡將請求轉發到后端,后端Transfer-Encoding優先級較高,以TE處理請求造成安全問題。 檢測 發送如下資料包 POST / HTTP/1.1 Host: ac391f7e1e9af821806e890 ......

    uj5u.com 2020-09-10 03:52:11 more
  • 網路滲透資料大全單——漏洞庫篇

    網路滲透資料大全單——漏洞庫篇漏洞庫 NVD ——美國國家漏洞庫 →http://nvd.nist.gov/。 CERT ——美國國家應急回應中心 →https://www.us-cert.gov/ OSVDB ——開源漏洞庫 →http://osvdb.org Bugtraq ——賽門鐵克 →ht ......

    uj5u.com 2020-09-10 03:52:15 more
  • 京準講述NTP時鐘服務器應用及原理

    京準講述NTP時鐘服務器應用及原理京準講述NTP時鐘服務器應用及原理 安徽京準電子科技官微——ahjzsz 北斗授時原理 授時是指接識訓通過某種方式獲得本地時間與北斗標準時間的鐘差,然后調整本地時鐘使時差控制在一定的精度范圍內。 衛星導航系統通常由三部分組成:導航授時衛星、地面檢測校正維護系統和用戶 ......

    uj5u.com 2020-09-10 03:52:25 more
  • 利用北斗衛星系統設計NTP網路時間服務器

    利用北斗衛星系統設計NTP網路時間服務器 利用北斗衛星系統設計NTP網路時間服務器 安徽京準電子科技官微——ahjzsz 概述 NTP網路時間服務器是一款支持NTP和SNTP網路時間同步協議,高精度、大容量、高品質的高科技時鐘產品。 NTP網路時間服務器設備采用冗余架構設計,高精度時鐘直接來源于北斗 ......

    uj5u.com 2020-09-10 03:52:35 more
  • 詳細解讀電力系統各種對時方式

    詳細解讀電力系統各種對時方式 詳細解讀電力系統各種對時方式 安徽京準電子科技官微——ahjzsz,更多資料請添加VX 衛星同步時鐘是我京準公司開發研制的應用衛星授時時技術的標準時間顯示和發送的裝置,該裝置以M國全球定位系統(GLOBAL POSITIONING SYSTEM,縮寫為GPS)或者我國北 ......

    uj5u.com 2020-09-10 03:52:45 more
  • 如何保證外包團隊接入企業內網安全

    不管企業規模的大小,只要企業想省錢,那么企業的某些服務就一定會采用外包的形式,然而看似美好又經濟的策略,其實也有不好的一面。下面我通過安全的角度來聊聊使用外包團的安全隱患問題。 先看看什么服務會使用外包的,最常見的就是話務/客服這種需要大量重復性、無技術性的服務,或者是一些銷售外包、特殊的職能外包等 ......

    uj5u.com 2020-09-10 03:52:57 more
  • PHP漏洞之【整型數字型SQL注入】

    0x01 什么是SQL注入 SQL是一種注入攻擊,通過前端帶入后端資料庫進行惡意的SQL陳述句查詢。 0x02 SQL整型注入原理 SQL注入一般發生在動態網站URL地址里,當然也會發生在其它地發,如登錄框等等也會存在注入,只要是和資料庫打交道的地方都有可能存在。 如這里http://192.168. ......

    uj5u.com 2020-09-10 03:55:40 more
  • [GXYCTF2019]禁止套娃

    git泄露獲取原始碼 使用GET傳參,引數為exp 經過三層過濾執行 第一層過濾偽協議,第二層過濾帶引數的函式,第三層過濾一些函式 preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'] (?R)參考當前正則運算式,相當于匹配函式里的引數 因此傳遞 ......

    uj5u.com 2020-09-10 03:56:07 more
  • 等保2.0實施流程

    流程 結論 ......

    uj5u.com 2020-09-10 03:56:16 more
最新发布
  • 使用Django Rest framework搭建Blog

    在前面的Blog例子中我們使用的是GraphQL, 雖然GraphQL的使用處于上升趨勢,但是Rest API還是使用的更廣泛一些. 所以還是決定回到傳統的rest api framework上來, Django rest framework的官網上給了一個很好用的QuickStart, 我參考Qu ......

    uj5u.com 2023-04-20 08:17:54 more
  • 記錄-new Date() 我忍你很久了!

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 大家平時在開發的時候有沒被new Date()折磨過?就是它的諸多怪異的設定讓你每每用的時候,都可能不小心踩坑。造成程式意外出錯,卻一下子找不到問題出處,那叫一個煩透了…… 下面,我就列舉它的“四宗罪”及應用思考 可惡的四宗罪 1. Sa ......

    uj5u.com 2023-04-20 08:17:47 more
  • 使用Vue.js實作文字跑馬燈效果

    實作文字跑馬燈效果,首先用到 substring()截取 和 setInterval計時器 clearInterval()清除計時器 效果如下: 實作代碼如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta ......

    uj5u.com 2023-04-20 08:12:31 more
  • JavaScript 運算子

    JavaScript 運算子/運算子 在 JavaScript 中,有一些運算子可以使代碼更簡潔、易讀和高效。以下是一些常見的運算子: 1、可選鏈運算子(optional chaining operator) ?.是可選鏈運算子(optional chaining operator)。?. 可選鏈操 ......

    uj5u.com 2023-04-20 08:02:25 more
  • CSS—相對單位rem

    一、概述 rem是一個相對長度單位,它的單位長度取決于根標簽html的字體尺寸。rem即root em的意思,中文翻譯為根em。瀏覽器的文本尺寸一般默認為16px,即默認情況下: 1rem = 16px rem布局原理:根據CSS媒體查詢功能,更改根標簽的字體尺寸,實作rem單位隨螢屏尺寸的變化,如 ......

    uj5u.com 2023-04-20 08:02:21 more
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 08:01:50 more
  • 如何在 vue3 中使用 jsx/tsx?

    我們都知道,通常情況下我們使用 vue 大多都是用的 SFC(Signle File Component)單檔案組件模式,即一個組件就是一個檔案,但其實 Vue 也是支持使用 JSX 來撰寫組件的。這里不討論 SFC 和 JSX 的好壞,這個仁者見仁智者見智。本篇文章旨在帶領大家快速了解和使用 Vu ......

    uj5u.com 2023-04-20 08:01:37 more
  • 【Vue2.x原始碼系列06】計算屬性computed原理

    本章目標:計算屬性是如何實作的?計算屬性快取原理以及洋蔥模型的應用?在初始化Vue實體時,我們會給每個計算屬性都創建一個對應watcher,我們稱之為計算屬性watcher ......

    uj5u.com 2023-04-20 08:01:31 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:01:10 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:00:32 more