在laravel下關於blade模板的嘗試

时间:2022-01-19 20:00:36

Blade模板

關於模板繼承和分區段

@section和@yield的實驗

①關於@section...@show嘗試

測試1

 {{--appV2test.blade.php--}}
<html>
<head>
<title>@yield('title')</title>
</head>
<body>
@section('content')
<p>這是appV2test的内容</p>
@show
</body>
</html>
 {{--def.blade.php--}}
@extends('test.appV2test')
@section('title','測試頁')
@section('content')
<p>更改文本内容</p>
<p>我的新内容????</p>
@stop

實驗結果:

更改文本内容

我的新内容????

 

測試2

 {{--def.blade.php--}}
@extends('test.appV2test')
@section('title','測試頁')
@section('content')
@parent {{--new addition--}}
<p>更改文本内容</p>
<p>我的新内容????</p>
@stop

 實驗結果:

這是appV2test的内容

更改文本内容

我的新内容????

結論:被@section...@show包裹的内容在被繼承時,若不使用@parent的情況下不會被渲染進網頁里。

 

②關於@section...@stop嘗試

測試1

 {{--appV2test.blade.php--}}
<html>
<head>
<title>@yield('title')</title>
</head>
<body>
@section('content')
<p>這是appV2test的内容</p>
@stop
</body>
</html>
 {{--def.blade.php--}}
@extends('test.appV2test')
@section('title','測試頁')
@section('content')
<p>更改文本内容</p>
<p>我的新内容????</p>
@stop

實驗結果:

<!--空的-->
<body>
</body>

  

測試2

 {{--def.blade.php--}}
@extends('test.appV2test')
@section('title','測試頁')
@section('content')
@parent {{--new addition--}}
<p>更改文本内容</p>
<p>我的新内容????</p>
@stop

實驗結果:

<!--空的-->
<body>
</body>

結論:被@section...@stop包裹的内容在被繼承時,不會被渲染進繼承頁里,即使使用@parent也是一樣。

③關於@yield嘗試

測試1

 {{--appV2test.blade.php--}}
<html>
<head>
<title>@yield('title')</title>
</head>
<body>
@yield('content')
<p>這是appV2test的内容</p>
</body>
</html>
 {{--def.blade.php--}}
@extends('test.appV2test')
@section('title', '測試頁')
@section('content')
<p>更改文本内容</p>
<p>我的新内容????</p>
@stop

實驗結果:

更改文本内容

我的新内容????

這是appV2test的内容

測試2:

{{--appV2test.blade.php--}}
<html>
<head>
<title>@yield('title')</title>
</head>
<body>
@yield('content')
<p>這是appV2test的内容</p>
@show {{--new addition--}}
</body>
</html>

實驗結果:

更改文本内容

我的新内容????

這是appV2test的内容

測試3:

{{--appV2test.blade.php--}}
<html>
<head>
<title>@yield('title')</title>
</head>
<body>
@yield('content')
<p>這是appV2test的内容</p>
@stop {{--new change--}}
</body>
</html>

實驗結果:

{{--出錯--}}

結論:被@yield(或@yield...@show包裹的内容,等價)包裹的内容,在渲染到@yield所在DOM節點的父節點時,會先渲染繼承頁面在該父節點下的内容,最後再將被繼承頁的内容填充進去。不存在@yield...@stop。

關於@append和@override嘗試

測試1:

 {{--appV2test.blade.php--}}
<html>
<head>
<title>@yield('title')</title>
</head>
<body>
@yield('body')
<div>
@yield('content')
<p>直接被繼承内容1</p>
<p>直接被繼承内容2</p>
<p>直接被繼承内容3</p>
</div>
</body>
</html>
 {{--def.blade.php--}}
@extends('test.appV2test')
@section('title', '測試頁')
@section('body')
@section('content')
<p>第一行</p>
@append <p>繼承頁内容1</p> @section('content')
<p>第二行</p>
@append <p>繼承頁内容2</p> @section('content')
<p>第三行</p>
@stop <p>繼承頁内容3</p>
@stop

實驗結果:

繼承頁内容1

繼承頁内容2

繼承頁内容3

第一行

第二行

直接被繼承内容1

直接被繼承内容2

直接被繼承内容3

暫時性結論:

注意到,先是渲染了繼承頁原有的内容,再渲染在繼承頁中通過@append添加到被選中分區段的内容,最後渲染被繼承頁的内容。同時,這裏的<p>第三行</p>由於是@stop結尾而沒有被加入,衹視爲不再繼續添加,并抛棄此處的内容。

測試2:

{{--def.blade.php--}}
@extends('test.appV2test')
@section('title', '測試頁')
@section('body')
@section('content')
<p>第一行</p>
@append <p>繼承頁内容1</p> @section('content')
<p>第二行</p>
@append <p>繼承頁内容2</p> @section('content')
<p>第三行</p>
@stop @section('content') {{--new addition--}}
<p>抛棄前面添加的</p>
@override <p>繼承頁内容3</p>
@stop

實驗結果:

 <p>繼承頁内容1</p>
<p>繼承頁内容2</p>
<html>
<head>
<title>測試頁</title>
</head>
<body>
<p>body是否被繼承</p>
<div>
<p>第一行</p>
<p>第二行</p>
<p>直接被繼承内容1</p>
<p>直接被繼承内容2</p>
<p>直接被繼承内容3</p>
</div>
</body>
</html>

暫時性結論:

不解。從結果上看,在@override之前的繼承頁的内容,全部被渲染到了最前面,甚至超過了其父節點的範圍。渲染完這些内容後,才開始繼承被繼承頁的内容。同時,本來應該被覆寫的内容被抛去,繼承頁在@override之後的内容也被抛去。其它内容渲染操作與測試1無異。

其它相關

{{ ... }}

自動轉義html標記,使標記原樣輸出

{!! ... !!}

直接打印變量内容,按標記進行相應渲染

@if(...)

@elseif(...)

@else

@endif

判斷

@foreach($lists as $list)

<li>{{$list}}</li>

@empty

<li>You don't have any lists saved.</li>

@endforeach

循環輸出,可通過@empty判斷要循環内容是否爲空

@include('...','...')

引入子文件,第二參數可傳參(不知有何用處,因爲include進來的文件能直接使用主文件的變量)