Laravel 组件:{{ slot }} 中的默认内容

car*_*rse 5 laravel laravel-blade laravel-components

在旧式的 Laravel Blade 模板中,我们使用@section('section-name')以下方式:

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

然后扩展该模板:

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

@section('details')
    Content from content page
@endsection
Run Code Online (Sandbox Code Playgroud)

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

<h1>Heading from Template</h1>
<p>Content from content page</p>
Run Code Online (Sandbox Code Playgroud)

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

<h1>Heading from Template</h1>
<p>Content from content page</p>
Run Code Online (Sandbox Code Playgroud)

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

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


编辑:

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

{{-- .../components/h1para.blade.php --}}
<h1>{{ $heading }}</h1>
<p>{{ $slot }}</p>
Run Code Online (Sandbox Code Playgroud)

但这似乎仅适用于默认值是易于管理的短字符串的情况。如果默认是很长的 HTML 流,那么它就无法满足我的需求。


编辑2:

重申一下:问题的关键在于默认内容可能是一长串 HTML。通过传入字符串(无论是否格式化为 HTML)来解决问题无法满足我的实际需求。

小智 -1

如果您传递如下数据:

<x-h1para header="<span>Header content</span>">
   <div>Default slot content here</div>
</x-h1para>
Run Code Online (Sandbox Code Playgroud)

您可以在组件中显示如下:

 <div>
    <h1>{!! $heading ?? 'Default Heading Here' !!}</h1>
     {{ $slot }}
 </div>
Run Code Online (Sandbox Code Playgroud)