Laravel Blade - @ slot / @组件对@include的优势?

时间:2017-05-27 02:21:12

标签: php laravel blade laravel-5.4 laravel-blade

Laravel 5.4 Blade引入了组件和概念。插槽 - 但我看不出他们在传统的@include上添加了什么。据我所知,使用组件/插槽,您可以:

在模板component-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'刀片模板?

我错过了什么?感谢您的任何见解。

克里斯

5 个答案:

答案 0 :(得分:30)

如上所述,没有任何功能差异,但仔细使用两者可以为您提供更清晰的刀片文件。

如果插槽可以包含HTML,那么使用组件将在您的刀片文件中提供更清晰的语法。

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

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

同样,如果组件没有插槽,则可能首选包含:

@include('test')

@component('test')
@endcomponent

答案 1 :(得分:11)

我想我已经找到了另一个重要的区别。例如,从5.4的文档:

  

Blade的@include指令允许您在另一个视图中包含Blade视图。父视图可用的所有变量都将可用于包含的视图:

据我所知,组件与包含视图的范围不同,因此父视图可用的变量在组件中不可用。您需要将变量传递给这样的组件:

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

此讨论与此问题有关: Use variables inside the Markdown Mailables

答案 2 :(得分:4)

正如documentation所说:

  

组件和插槽为部分提供了类似的好处   布局;然而,有些人可能会找到组件的心理模型   插槽更容易理解

答案 3 :(得分:4)

有两个主要区别。

1。范围可变

如@DavidHyogo的答案中所述,组件仅看到显式传递给它的变量。因此,您必须像这样给所有变量...

@component('my-component', ['foo' => 'bar', 'etc' => 'etc'])

默认情况下,包含将采用全局/当前作用域中的所有变量-除非您定义一组明确的变量来传递它,然后该变量将再次成为局部作用域。

{{-- This include will see all variables from the global/current scope --}}
@include('my-component')

{{-- This include will only see the variables explicitly passed in --}}
@include('my-component', ['foo' => 'bar', 'etc' => 'etc']) 

2。组件的{{$ slot}}与include的{{$ var}}

在组件中使用{{$ slot}}时,可以为其提供刀片语法代码,例如...

{{-- component file alert.blade.php --}}
<div class="alert">{{ $slot }}</div>

{{-- file which uses component --}}
@component('alert')
    <div>Hello {{ $name }} @include('welcome-message')</div>
@endcomponent

请注意插槽将如何接收html AND Blade语法代码并对其进行处理。

使用include不可能做到这一点,因为您只能将变量传递给include ...

{{-- include file alert.blade.php --}}
<div class="alert">{{ $slot }}</div>

{{-- file which uses component --}}
@include('alert', ['slot' => "I CAN'T PASS IN BLADE SYNTAX HERE!"])

可以通过获取新鲜的view()帮助器并将其传递给一些变量来编译我们想要传递到插槽的输出,从而以更hacky的方式完成,但这就是组件的用途。

答案 4 :(得分:0)

对我来说,最重要的是component需要一个class。因此,当我只需要html(刀片)中最简单的可重用部分时,无需创建刀片文件+ php文件,只需使用@include和简单的subview就可以了;)