天天看點

【Vue】更加底層的 render 函數

學習内容:

1)Vue 裡面的 render 函數。

代碼示例:

【Vue】更加底層的 render 函數

運作效果:

【Vue】更加底層的 render 函數

接着我寫一個小的元件,

app.component,元件的名字叫做比如說‍‍ test,裡面我們寫一個template,

然後上面我用這個元件我就不寫hello world了,我直接寫 test反斜杠:

【Vue】更加底層的 render 函數

我有這樣的一個功能,‍‍或者說我叫title,這個元件叫做我用一個title:

【Vue】更加底層的 render 函數

當然這個title和hml裡面的title‍‍就重名了,是以肯定是不行的,我們可以給它改成自定義的 mytitle‍‍:

【Vue】更加底層的 render 函數

裡面我傳一個比如說hello過去,然後我希望 mytitle展示的就是h1:

【Vue】更加底層的 render 函數

然後把你傳遞過來的内容展示出來,這塊該怎麼寫?

這塊我是不是直接用slot就可以了:

【Vue】更加底層的 render 函數

效果:

【Vue】更加底層的 render 函數

假設我 h幾‍‍希望能夠受到外部傳遞過來的參數的控制,我可以怎麼寫?

我可以在這傳一個比如說 level 等于這塊加個冒号,讓它傳遞過去的東西是一個數字的,‍‍這樣傳是一個數字的,如果你不寫傳的是個字元串:

【Vue】更加底層的 render 函數

因為加冒号之後,這會作為一個表達式,它是數字類型的,‍‍

如果你不加冒号它是一個字元串,是以這塊大家一定要注意。

那麼接收到這個level之後,我就可以這麼去寫,我可以在這裡‍‍去寫一個叫做props,接收誰?

接收level。

然後下面我去做一些判斷,‍‍我寫一個h1 slot,這塊我加一個v杠if等于level‍‍等于 1:

【Vue】更加底層的 render 函數

那麼傳 1 過來的時候level的值等于1,

是以 slot可以展示出來,

假設你傳 2 的時候,我希望它能展示h2,我就這麼寫:

【Vue】更加底層的 render 函數

但假設你繼續去寫的話,你得寫好多的東西,比如說一直到h6。一直往下寫,想象一下,‍‍如果你通過這樣的一個寫法去展示對應的不同的h幾标簽的話,‍‍你這塊的代碼會變得很長,對不對?‍‍

遇到這種功能的實作這麼去寫代碼并不是那麼優雅。

怎麼能夠把它寫得更優雅一點?

其實Vue裡面‍‍可以讓我們不寫這個模闆,取而代之我們寫一個render函數,‍‍

在render函數裡面,首先我要去用 Vue 提供的一個叫做h的函數等于 Vue,

它從 Vue 的類裡面去讀一個h函數,‍‍

h函數我們就可以去做一個操作了,我可以這麼去寫。‍‍return‍‍‍‍ h函數的傳回值,

h函數的第一個參數,我們可以去寫‍‍這個标簽的名字,比如說我現在傳了一個level進來,

我這個标簽名其實就是h加上‍‍this點level,

第二個參數接收的是比如說我建立一個h1标簽,‍‍比如你傳的level是1,現在我告訴它我要用的是一個h1标簽,‍‍

h1 标簽上有沒有一些比如說 name等于123這樣的屬性?

【Vue】更加底層的 render 函數

如果有的話你就在這裡寫一個name 冒号123,

現在我們是不需要的,是以給一個空就行了。‍‍

【Vue】更加底層的 render 函數

第三個參數是一個數組,‍‍當然你也可以直接寫一個字元串,比如說我們這裡就寫一個hello world:

【Vue】更加底層的 render 函數

我們現在看一下,我把template 删除掉,有一個render函數,‍‍

當你傳不同level的時候,我展示的是h對應的level這樣的一個内容,然後沒有屬性,‍‍展示的内容都是hello world,

儲存我們到頁面上刷一下,‍‍展示的現在是hello world:

【Vue】更加底層的 render 函數

你傳的是2,如果傳 1 的話儲存一下:

【Vue】更加底層的 render 函數

我們到頁面上刷‍‍它是不是就變大了:

【Vue】更加底層的 render 函數

當我能看到通過這樣的一個文法去實作的 與 剛才的與template 相類似的這種代碼就變得簡潔了很多,‍‍

如果你要用template去實作得寫一大堆,‍‍

但是你用這個render函數直接這麼寫:

【Vue】更加底層的 render 函數

不管h幾你都能相容了。‍‍

但是這塊和template函數稍微有點差別的是什麼?

這塊我寫死了,隻能用hello world,‍‍

那麼你現在想用的是slot傳遞過來的 hello,

這塊可以怎麼變動一下?

我這塊可以直接用this點‍‍​​

​$slot​

​,

那‍‍在render函數裡面或者說在 Vue 的其他的函數裡面,你通過this點‍‍​

​$slot​

​能擷取到各種各樣slot相關的内容,‍‍

預設的因為你也不是一個具名的插槽,

你的傳遞過來的是hello,然後你這塊也沒有說‍‍通過一個具名的插槽,比如name等于什麼的方式來去使用這個具名的插槽,

是以‍‍它就是一個預設的插槽,如果要調用預設插槽裡的内容,