2017-05-27 181 views
8

Laravel 5.4刀片引入了組件&插槽的概念 - 但我看不到他們添加的是傳統的@include。據我所知,有分量/插槽,你這樣做:Laravel Blade - @ slot/@組件的優點vs @include?

在模板組件tpl.blade.php:

<div class='container'> 
    <h1>{{$slot1}}</h1> 
    <h2>{{$slot2}}</h2> 
</div> 

使用插槽頁面模板,你這樣做:

@component('component-tpl') 
    @slot('slot1') 
    The content of Slot 1 
    @endslot 
    @slot('slot2') 
    The content of Slot 2 
    @endslot 
@endcomponent 

什麼功能確實提供了超過老版本的功能:

@include('component-tpl',['slot1'=>'The content of Slot 1', 
'slot2'=>"The content of Slot 2"]) 

使用完全相同的'component-tpl.blade.php'Bl ade模板?

我缺少什麼?感謝您的任何見解。

克里斯

+0

'@ component'似乎很好,如果你正在開始一個新的項目,但如果一個人已經擁有一個已經使用了大量'@ include'的現有項目,那麼似乎試圖記住哪些部分是@ component'和哪些部分是'@ include'將是混亂的。 –

回答

4

正如documentation說:

組件和插槽部分和 佈局提供類似的好處;然而,有些人可能會發現組件的心理模型和 插槽更容易理解

+0

我也讀過文檔,這句話並沒有真正幫助我區分兩者。我認爲瑞克真的有助於用一個非常實用的例子來解開這兩種方法。 – DavidHyogo

6

如上所述,沒有功能差異,但仔細使用兩者都可以爲您提供清潔的刀片文件。

如果一個插槽可能包含HTML,那麼使用組件將在刀片文件中提供更清晰的語法。

@component('test') 
    <strong>This text has html</strong> 
@endcomponent 

@include('test', ['slot' => '<strong>This text has HTML</strong>']) 

同樣地,如果一個組件沒有槽,那麼包括可以優選:

@include('test') 

@component('test') 
@endcomponent 
+0

這比僅僅引用文檔(這令人沮喪地不提供任何有用的用例)更加有用。幾個星期前我剛剛拿起了Laravel,正在開展我的第一個項目。我搜索這個的原因正是你提供的例子。我有HTML,我不在乎串或混亂'ob_start(); ...返回ob_get_clean()'。 – philtune

+0

這是一個很好的例子。我正在努力通過構建相互連接的刀片佈局來簡化複雜的應用程序,這種區別確實幫助我區分部件和組件。 – DavidHyogo

2

我想我我們追蹤了另一個關鍵的區別。例如,從5.4的文檔:

刀片的@include指令允許您在另一個視圖中包含刀片視圖。所有可用於父視圖的變量將可用於包含視圖:

據我所知,組件與包含視圖的差別範圍,因此父視圖可用的變量是在組件內不可用。你需要一個變量傳遞給一個組件是這樣的:

@component('alert', ['foo' => 'bar']) 
@endcomponent 

這個討論與此問題相關: Use variables inside the Markdown Mailables