1

在老式的 Laravel 刀片模板中,我们曾经以@section('section-name')以下方式使用:

{{-- h1para.blade.php --}}
<h1>
    @section('heading')
        Heading from Template
    @endsection
</h1>
<p>
    @yield('details')
</p>

然后扩展该模板:

{{-- content.blade.php --}}
@extends('h1para')

@section('details')
    Content from content page
@endsection

在上面,我渲染的 HTML 输出如下所示,因为'heading'扩展文件中的“缺失”部分意味着我们默认返回模板中的内容:

<h1>Heading from Template</h1>
<p>Content from content page</p>

但是在新的组件做事方式中,我这样做:

{{-- .../components/h1para.blade.php --}}
<h1>{{ $heading }}</h1>
<p>{{ $slot }}</p>

如果您还没有收集,问题是:如何为插槽的内容设置默认值,这样如果扩展组件/模板中未提供它,它会回退到该默认值?

(我已经完成了搜索,但无法找到之前提出的相同问题)


编辑:

我应该补充一点,我已经看到了解决方案(在 Laravel 文档中):

<h1>{{ $heading ?? 'Default Heading Here' }}</h1>

但这似乎只有在默认值是一个易于管理的短字符串时才合适。如果默认值是一个长的 HTML 流,那么它就不能满足我的需要。


编辑2:

重申一下:问题的重点是默认内容可能是一长串 HTML。通过传入一个字符串(无论是否格式化为 HTML)来解决问题并不适合我的实际需求。

4

2 回答 2

2

我认为解决方案是这样的:

{{-- .../component/template.blade.php --}}
<div>
    @if (isset($heading))
        {{ $heading }}
    @else
        <h1>Default Heading<span class="subhead">default subheadin and lots of other html content</span></h1>
    @endif
    <p>{{ $slot }}</p>
</div>

它不是超级优雅,但我认为这是唯一的解决方案。其他人有更好的答案,我很想听听。

于 2021-08-09T20:54:26.367 回答
-1

如果您传递如下数据:

<x-h1para header="<span>Header content</span>">
   <div>Default slot content here</div>
</x-h1para>

您可以在组件中显示,例如:

 <div>
    <h1>{!! $heading ?? 'Default Heading Here' !!}</h1>
     {{ $slot }}
 </div>
于 2021-08-09T19:40:15.497 回答