【譯】Vue 的小奇技(第四篇):Vue.js 2.6.0 中的新指令 v-slot

程式猿何大叔發表於2019-02-18

特別宣告:本文是作者 Alex Jover 釋出在 VueDose 上的一個系列。

版權歸作者所有。

譯者在翻譯前已經和作者溝通得到了翻譯整個系列的授權。

為了不影響大家閱讀,獲得授權的記錄會放在本文的最後。

很開心見到大家這麼喜歡 VueDose 的教程,最近我收到了讓我驚訝的關於效能提升的反饋,我非常感激讀者們的支援和讚揚 ?。

正文

上週 Vue.js 的 2.6.0-beta.3 版本已經發布,其中包含了進一步簡化作用域插槽的新特性。

這篇文章介紹了 vue 的新指令 v-slot 和其簡寫方式,就如在 RFC-0001RFC-0002 中描述的一樣。

為了能夠弄清楚它是怎樣簡化語法的,我們來一起看看它在當前作用域插槽是怎樣的。想象一下你有一個 List 元件,並且它暴露了一個過濾後的列表資料作為它的作用域插槽。

你使用該帶有作用域插槽的 List 元件應該如下所示:

<template>
    <List :items="items">
        <template slot-scope="{ filteredItems }">
            <p v-for="item in filteredItems" :key="item">{{ item }}</p>
        </template>
    </List>
</template>
複製程式碼

我們所要講解的主要內容與 List 元件的實現方式並沒有太大的關係,但是你可以在這個 Codesandbox 檢視示例原始碼。

然而,我們可以直接在元件標籤上使用新指令 v-slot,避免了額外的巢狀:

<template>
    <List v-slot="{ filteredItems }" :items="items">
        <p v-for="item in filteredItems" :key="item">{{ item }}</p>
    </List>
</template>
複製程式碼

記住 v-slot 指令只能用在元件或 template 標籤上,而不能使用在原生 html 標籤上。

這種方式能讓程式碼可讀性更高,特別是在你有巢狀的作用域插槽,使得難以定位作用域來源的情況下。

v-slot 指令也提供了一個繫結 slotscope-slot 指令的方式,但是需要使用一個 : 來分割它們。舉個摘自 vue-promised 的例子:

<template>
  <Promised :promise="usersPromise">
    <p slot="pending">Loading...</p>

    <ul slot-scope="users">
      <li v-for="user in users">{{ user.name }}</li>
    </ul>

    <p slot="rejected" slot-scope="error">Error: {{ error.message }}</p>
  </Promised>
</template>
複製程式碼

以上例子可以使用 v-slot 指令重寫如下:

<template>
    <Promised :promise="usersPromise">
        <template v-slot:pending>
            <p>Loading...</p>
        </template>

        <template v-slot="users">
            <ul>
                <li v-for="user in users">{{ user.name }}</li>
            </ul>
        </template>

        <template v-slot:rejected="error">
            <p>Error: {{ error.message }}</p>
        </template>
    </Promised>
</template>
複製程式碼

最後,v-slot 以符號 # 作為其指令的簡寫模式,上一個例子可以被重寫為:

<template>
    <Promised :promise="usersPromise">
        <template #pending>
            <p>Loading...</p>
        </template>

        <template #default="users">
            <ul>
                <li v-for="user in users">{{ user.name }}</li>
            </ul>
        </template>

        <template #rejected="error">
            <p>Error: {{ error.message }}</p>
        </template>
    </Promised>
</template>
複製程式碼

要記住的是,v-slot 指令預設應該簡寫為 #default

讀完文章,對於這個新的 slot 語法你感到興奮嗎?

你可以線上閱讀這篇 原文,裡面有可供複製貼上的原始碼。如果你喜歡這個系列的話,請分享給你的同事們!

結語

此係列的其他文章,會同步系列官網的釋出情況,及時地翻譯釋出到掘金。請持續關注「程式猿何大叔」,相信我會給大家帶來更多優質的內容,不要忘了點贊~

如果想要了解譯者的更多,請查閱如下:

請求翻譯授權記錄

請求翻譯授權記錄

微信公眾號
覺得本文不錯的話,分享一下給小夥伴吧~

相關文章