2017-05-27 177 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