1. 程式人生 > >slot 插槽的作用域用法(摘自vue.js 官網)

slot 插槽的作用域用法(摘自vue.js 官網)

定制 body vue.js pan 有效 當我 zh-cn 所有 operator

有的時候你希望提供的組件帶有一個可從子組件獲取數據的可復用的插槽。例如一個簡單的 <todo-list> 組件的模板可能包含了如下代碼:

<ul>
<li
v-for="todo in todos"
v-bind:key="todo.id"
>
{{ todo.text }}
</li>
</ul>

但是在我們應用的某些部分,我們希望每個獨立的待辦項渲染出和 todo.text 不太一樣的東西。這也是作用域插槽的用武之地。

為了讓這個特性成為可能,你需要做的全部事情就是將待辦項內容包裹在一個 <slot>

元素上,然後將所有和其上下文相關的數據傳遞給這個插槽:在這個例子中,這個數據是 todo 對象:

<ul>
<li
v-for="todo in todos"
v-bind:key="todo.id"
>
<!-- 我們為每個 todo 準備了一個插槽,-->
<!-- 將 `todo` 對象作為一個插槽的 prop 傳入。-->
<slot v-bind:todo="todo">
<!-- 回退的內容 -->
{{ todo.text }}
</slot>
</li>
</ul>

現在當我們使用 <todo-list> 組件的時候,我們可以選擇為待辦項定義一個不一樣的 <template> 作為替代方案,並且可以通過 slot-scope 特性從子組件獲取數據:

<todo-list v-bind:todos="todos">
<!-- 將 `slotProps` 定義為插槽作用域的名字 -->
<template slot-scope="slotProps">
<!-- 為待辦項自定義一個模板,-->
<!-- 通過 `slotProps` 定制每個待辦項。-->
<span v-if="slotProps.todo.isComplete">?</span>
{{ slotProps.todo.text }}
</template>
</todo-list>

在 2.5.0+,slot-scope 不再限制在 <template> 元素上使用,而可以用在插槽內的任何元素或組件上。

解構 slot-scope

如果一個 JavaScript 表達式在一個函數定義的參數位置有效,那麽這個表達式實際上就可以被 slot-scope 接受。也就是說你可以在支持的環境下 (單文件組件或現代瀏覽器),在這些表達式中使用 ES2015 解構語法。例如:

<todo-list v-bind:todos="todos">
<template slot-scope="{ todo }">
<span v-if="todo.isComplete">?</span>
{{ todo.text }}
</template>
</todo-list>

這會使作用域插槽變得更幹凈一些。

slot 插槽的作用域用法(摘自vue.js 官網)