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'刀片模板?
我错过了什么?感谢您的任何见解。
克里斯
答案 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)
有两个主要区别。
如@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'])
在组件中使用{{$ 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
就可以了;)