【问题标题】:Laravel Blade: @stop VS @show VS @endsection VS @appendLaravel Blade:@stop VS @show VS @endsection VS @append
【发布时间】:2018-11-04 21:59:30
【问题描述】:

在 Laravel 中,有不同的方式使用部分:

@yield('section1') // Filled in by child view

@section('section2')
    // Default content, can be overwritten by child
    // Different ways of closing the section
@endsection|stop|show|append

谁能告诉我所有这些之间的确切区别是什么?

this、@stop 和 @endsection 的编码可能相同。 (其中一个已被弃用,但不再是)

【问题讨论】:

    标签: php laravel laravel-5 laravel-blade


    【解决方案1】:

    @endsection@stop 相同,表示一个节的结束。

    在您执行 @yield('sectionname') 之前,该部分实际上并未呈现在页面上

    相比之下,@show 等价于

    @stop
    @yield('sectionname')
    

    即它停止并立即在页面的该部分呈现该部分。

    @append基本上相当于:

    //FileA.blade.php
    @section('sectionname')
     ... content
    @stop
    
    //FileB.blade.php
    @extends('fileA')
    
    @section('sectionname')
        @parent
        ... more content after content
    @stop
    

    这里有一些相关的source code:

    protected function compileStop() {
        return '<?php $__env->stopSection(); ?>';
    }
    protected function compileEndsection() {
        return '<?php $__env->stopSection(); ?>'; //Same code
    }
    
    protected function compileShow() {
        return '<?php echo $__env->yieldSection(); ?>';
    }
    

    Yield 部分只是停止当前部分并产生其内容。

    【讨论】:

      【解决方案2】:

      我可能会迟到。但是在 Laravel 7.x 系列中,并没有提到“@stop”和“@append”。

      问:@endsection 和@show 的区别

      @endsection 指令只是告诉刀片引擎该部分实际结束的位置。要显示该部分,您需要使用 @yield 指令。如果你不让那个截面刀片在渲染视图后不会显示它。

      例如在布局视图中:

      <!-- layout -->
      <body>
      
          @section('content')
            Some Content
          @endsection
      
      </body>
      

      上面的代码没有任何意义,当然我们已经定义了一个section。但它不会显示在客户端的视图中。所以我们需要让出它,让它在客户端上可见。所以让我们在相同的布局中生成它。

      <!--layout-->
      <body>
      
          @section('content')
              Some content
          @endsection
          @yield('content')
      
      </body>
      

      现在上面的代码对客户端有了一些意义,因为我们已经定义了一个部分并告诉刀片引擎在相同的布局中产生它。

      但是 Laravel 提供了一个快捷方式,而不是在同一布局中显式生成该部分,而是使用 @section - @show 指令对。因此上面的代码可以写成如下:

      <!--layout-->
      <body>
      
          @section('content')
              Some content
          @show
      
      </body>
      

      所以@show 只是@endsection 和@yield 指令的压缩版本。

      我希望我把一切都说清楚了。还有一件事,在 laravel 7.x 中添加部分内容,使用了@parent 指令。

      【讨论】:

        【解决方案3】:

        Found it in quora

        @show 具有与@yield 类似的功能,但您可以将其用于更多事情。当您在布局视图中声明 @yield 时,您也可以设置默认值。

        app.blade.php
        @yield('title', 'Default Title') 
        

        在您的子视图中,您可以更改标题

        user.blade.php
        
        @section('title', 'Custom Title') 
        

        但是,在@yield 的情况下,您只能为默认值设置字符串。如果你想使用 html 内容的某些部分作为默认部分,你应该使用@show

        app.blade.php
        
        @section('some_div') 
            <h1>Default Heading1</h1> 
            <p>Default Paragraph 
                <span>Default Span</span> 
            </p> 
        @show
        

        在你的孩子看来

        @section('some_div') 
            <h1>Custom Heading1</h1> 
            <p>Custom Paragraph 
                <span>Custom Span</span> 
            </p> 
        @endsection 
        

        您也可以同时使用默认内容和自定义内容。只需包含@parent

        @section('some_div') 
        @parent 
            <h1>Custom Heading1</h1> 
            <p>Custom Paragraph 
                <span>Custom Span</span> 
            </p> 
        @endsection
        

        【讨论】:

          猜你喜欢
          • 2014-02-07
          • 2013-08-25
          • 1970-01-01
          • 2020-07-25
          • 1970-01-01
          • 1970-01-01
          • 2018-04-20
          • 2013-11-19
          • 1970-01-01
          相关资源
          最近更新 更多