【问题标题】:How to pass an array to a @slot in laravel 5.4?如何将数组传递给 laravel 5.4 中的 @slot?
【发布时间】:2017-06-14 00:43:52
【问题描述】:

我正在尝试在我的布局中使用它,但突然想到使用 Laravel 5.4 @slot 的新功能。

只是想知道是否可以将数组传递给插槽?

        @section('SampleSection')

            @component( 'mylayouts.partials.contentheader' )

                @slot('title')
                    Sample Title
                @endslot

                @slot('indexes')
                    Pass array here  // example [ 'a', 'b', 'c' ]
                @endslot

            @endcomponent

        @endsection

【问题讨论】:

    标签: php laravel-blade laravel-5.4


    【解决方案1】:

    据我所知,不可能通过@slot 将数组传递给组件。但是,可以直接将数组传递给组件,而无需使用插槽。

    来自documentation

    向组件传递附加数据

    有时您可能需要向组件传递额外的数据。为了 因此,您可以将数据数组作为第二个参数传递给 @component 指令。所有数据将提供给 组件模板作为变量:

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

    假设你有一个数据数组:

    $my_array = ['a', 'b', 'c']
    

    你可以像这样将它传递给组件:

    @component('mylayouts.partials.contentheader', ['my_array' => $my_array])
        ...
    @endcomponent
    

    或者你可以直接传递它,而不使用变量:

    @component('mylayouts.partials.contentheader', ['my_array' => ['a', 'b', 'c']])
        ...
    @endcomponent
    

    然后,在您的组件文件中,您将可以访问$my_array 变量。例如,在您的 contentheader.blade.php 文件中,您可以这样做:

    <ul>
        @foreach($my_array as $value)
            <li>{{ $value }}</li>
        @endforeach
    </ul>
    

    【讨论】:

      【解决方案2】:

      我也需要。

      这是一种临时解决方案,但不是最好的形式。

      @component('component.tab.header')
          @slot('navs', [
              "a" => "Pepe",
              "b" => "Maria"
          ])
      @endcomponent
      

      编辑:

      最后,就我而言,我解决了这个问题:

      @component('component-name')
          @slot('slot-name')
              Value1|Value2|Value2
          @endslot
      @endcomponent
      

      并且在组件代码中:

      @foreach(explode('|', $slot-name) as $value)
          The value is {{ $value }} <br/>
      @endforeach
      

      【讨论】:

      • 实际上尝试了那个,但在插槽视图中捕捉数组时遇到了困难。我所做的是将另一个“@include”放在“@component”中,并使用可变参数使插槽工作。虽然不是很漂亮...
      • 查看我的新编辑,我认为这是更清晰的代码选项。
      • 我认为您的原始答案实际上是更好的答案。本周我将尝试在 Slack 中询问,看看预期的方式是什么,并希望之后更新文档,以便更清晰。
      • @Ivan - 这正是我在之前的代码中所做的,但我最终改用了@include。我只是希望 Taylor 能够在 @slot 中添加添加变量参数的功能,而不是像我们刚刚所做的那样,或者可能有更好的方法来做到这一点。
      【解决方案3】:

      这是一个示例组件。将项目数分配给$numberOfSlots变量,它将一一搜索槽块(body_1body_2body_3

      因为我构建了一个表单向导,在" "之间定义html块太难看所以我更喜欢@slot

      组件:

      <div class="component">
          @for($i = 1; $i <= $numberOfSlots; $i++)
              <div class="item">
                  {{ ${"body_{$i}"} }}
              </div>
          @endfor
      </div>
      

      刀片:

      @component(['numberOfSlots' => 3])
          @slot('body_1')
                  Dynamically created slot 1
          @endslot
      
          @slot('body_2')
                  Dynamically created slot 2
          @endslot
      
          @slot('body_3')
                  Dynamically created slot 3
          @endslot
      @endcomponent
      

      【讨论】:

      • 目前工作正常,特别适用于列表
      【解决方案4】:

      我可能错了,但你不能直接将数据传递给组件并在组件中处理吗?文档展示

      有时您可能需要向组件传递额外的数据。因此,您可以将数据数组作为第二个参数传递给@component 指令。所有数据都将作为变量提供给组件模板:

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

      处理组件中的数据而不是使用槽?

      【讨论】:

        【解决方案5】:

        将数组发送到组件模板非常简单,无需任何@slot 在查看页面中

        view.blade.php

        @component('components.button',[
          'tooltipTitle'=>'buttorr33',
          'addStyle'=>'pointer',
          ])
          @endcomponent
        

        在组件 php 文件中component\button.php

        <div class="block-buttons {{$addStyle or NULL}}"
             {{--if set tooltip, add atributes--}}
             @if (isset($tooltipTitle))...
        

        【讨论】:

        • @Nelson Melicio 通过数组将数据发送到视图中,视图中必须是具有相同名称的变量,如关联数组中的键。视图文件中的'toolitipTitle'=&gt;'buttor33' 会将其发送到在第一个参数中设置的组件中。然后在该组件文件中,您可以使用名称为 $tooltipTitle 的变量。如果没有设置它会抛出一个错误
        【解决方案6】:

        我是怎么做的:

        在任何视图中包含@PageNav 组件标签

        @PageNav([
            'menus' => [
                [
                    'title' => 'foo', 
                    'url' => '/foo/index'
                ], 
                [
                    'title' => 'bar', 
                    'url' => '/bar/page'
                ]
            ]
        ]) @endPageNav
        

        创建视图/组件/PageNav.php 文件

        @foreach ($menus as $menu)
          <li class="nav-item">
            <a class="nav-link" href="{{ $menu['url'] }}">{{ $menu['title'] }}</a>
          </li>
        @endforeach
        

        注册组件:(AppServiceProvider.php -> Boot)

        Blade::component('components.PageNav'); // "/views/components/PageNav.php"
        

        希望对您有所帮助!

        【讨论】:

          猜你喜欢
          • 2017-11-09
          • 1970-01-01
          • 2021-01-17
          • 1970-01-01
          • 2016-11-03
          • 1970-01-01
          • 2017-11-03
          • 1970-01-01
          • 2020-07-18
          相关资源
          最近更新 更多