建立元件命令
php artisan make:component Alert
make:component 命令還將為元件建立檢視模板。檢視將放在 resources/views/components 目錄中。為自己的應用程式編寫元件時,元件會在 app/View/components 目錄和 resources/views/components 目錄中自動發現,因此通常不需要進一步的元件註冊。
也可以在子目錄中建立元件:php artisan make:component Forms/Input
上面的命令將在 App\View\Components\Forms 目錄中建立一個 Input 元件,該檢視將放在 resources/views/Components/Forms 目錄中。
渲染元件
要顯示元件,可以在其中一個 Blade 模板中使用 Blade 元件標記。Blade 元件標記以字串 x- 開頭,後跟元件類的蛇形名稱:
<x-alert/> 或者 <x-alert></x-alert>
<x-user-profile/> 或者 <x-user-profile/> </x-user-profile>
如果元件類巢狀在 App\View\Components 目錄的更深處,則可以使用 . 字元表示目錄巢狀。例如,如果我們假設一個元件位於 App\View\Components\Forms\Input.php ,我們可以這樣處理:
<x-forms.input/>
給元件傳遞資料
可以使用 HTML 屬性將資料傳遞給 Blade 元件。硬編碼、原始值可以使用簡單的 HTML 屬性字串傳遞給元件。PHP 表示式和變數應透過使用 : 字元作為字首的屬性傳遞給元件:
<x-alert type="error" :message="$message"/>
你應該在元件類的建構函式中定義元件所需的資料。元件上的所有公共屬性將自動提供給元件的檢視。不必從元件的 render 方法將資料傳遞到檢視。以下是app/View/components
目錄下的Alert.php
檔案。
<?php namespace App\View\Components; use Illuminate\View\Component; class Alert extends Component { /** * The alert type. * * @var string */ public $type; /** * The alert message. * * @var string */ public $message; /** * 建立元件例項 * * @param string $type * @param string $message * @return void */ public function __construct($type, $message) { $this->type = $type; $this->message = $message; } /** * 將一個檢視或者字串傳遞給元件用於渲染 * * @return \Illuminate\View\View|\Closure|string */ public function render() { return view('components.alert'); } }
渲染元件時,可以透過按名稱回顯變數來顯示元件公共變數的內容:
<div class="alert alert-{{ $type }}"> {{ $message }} </div>
駝峰命名
應使用 camelCase 指定元件建構函式引數,而在 HTML 屬性中引用引數名稱時應使用 kebab-case。例如,給定以下元件建構函式:
/** * 建立元件例項 * * @param string $alertType * @return void */ public function __construct($alertType) { $this->alertType = $alertType; }
$alertType 引數可以使用如下所示的方式接受資料:
<x-alert alert-type="danger" />
訪問元件類中的屬性和插槽
Blade 元件還允許你訪問類的 render 方法中的元件名稱、屬性和插槽。但是,為了訪問這些資料,應該從元件的 render 方法返回閉包。閉包將接收一個 $data 陣列作為它的唯一引數。此陣列將包含幾個元素,這些元素提供有關元件的資訊:
/** * 獲取表示元件的檢視/內容 * * @return \Illuminate\View\View|\Closure|string */ public function render() { return function (array $data) { // $data['componentName']; // $data['attributes']; // $data['slot']; return 'components.alert'; return '<div>Components content</div>'; return <<<'blade' <div class="alert alert-danger"> {{ $message }} </div> blade; }; }
元件傳遞的資料無法修改,修改資料可以在建構函式中修改。
閉包應該返回一個字串。如果返回的字串與現有檢視相對應,則將呈現該檢視;否則,返回的字串將作為內聯 Blade 檢視進行計算。
插槽
通常需要透過 「插槽」 將其他內容傳遞給元件。透過回顯 $slot 變數來呈現元件插槽。為了探索這個概念,我們假設 alert 元件具有以下內容: 類似 VUE
/resources/views/components/alert.blade.php
<div class="alert alert-danger"> {{ $slot }} </div>
我們可以透過向元件中注入內容將內容傳遞到 slot :
<x-alert> <strong>Whoops!</strong> Something went wrong! </x-alert>
有時,元件可能需要在元件內的不同位置渲染多個不同的插槽。讓我們修改警報元件以允許注入 「標題」插槽:
<span class="alert-title">{{ $title }}</span> <div class="alert alert-danger"> {{ $slot }} </div>
可以使用 x-slot 標記定義命名插槽的內容。任何不在顯式 x-slot 標記中的內容都將傳遞給 $slot 變數中的元件:
<x-alert> <x-slot name="title"> Server Error </x-slot> <strong>Whoops!</strong> Something went wrong! </x-alert>
作用域插槽
如果你使用過諸如 Vue 之類的 JavaScript 框架,那麼你可能熟悉 「作用域插槽」,它允許你從插槽中的元件訪問資料或方法。透過在元件上定義公共方法或屬性,並透過 $component 變數訪問插槽中的元件,可以在 Laravel 中實現類似的行為。在本例中,我們假設 x-alert 元件在其元件類上定義了一個公共的 formatAlert 方法:
<x-alert> <x-slot name="title"> {{ $component->formatAlert('Server Error') }} </x-slot> <strong>Whoops!</strong> Something went wrong! </x-alert>
內聯元件檢視
/** * 獲取表示元件的檢視/內容。 * * @return \Illuminate\View\View|\Closure|string */ public function render() { return <<<'blade' <div class="alert alert-danger"> {{ $slot }} </div> blade; }
使用元件佈局
之前我們使用模板繼承的方式進行佈局。現在我們學習了元件 接下來我們使用元件的方式的來進行佈局。
resources/views/components/layout.balde.php
<html> <head> <title>{{ $title ?? 'Todo Manager' }}</title> <style> .header{ width: 100%; height: 100px; background-color:#f90; } .main{ display: flex; width: 100%; min-height:500px; } .ce{ width: 300px; background-color:pink; } .content{ width: 100%; background-color:#cbd5e0; } </style> </head> <body> <header class="header"></header> <div class="main"> <div class="ce"> 我是側邊欄 </div> <div class="content"> {{ $slot }} </div> </div> </body> </html>
應用佈局元件
一旦定義了 layout 元件,我們就可以建立一個使用該元件的 Blade 檢視。在本例中,我們將定義一個顯示任務列表的簡單檢視:resources/views/user.blade.php
<x-layout> <div> <h1>我是個人中心</h1> </div> </x-layout>
請記住,注入到元件中的內容將提供給 layout 元件中的預設 $slot 變數。正如你可能已經注意到的,如果提供了 $title 插槽,那麼我們的 layout 也會尊從該插槽;否則,將顯示預設的標題。我們可以使用 x-slot 插入標題
<x-layout> <x-slot name="title"> Custom Title </x-slot> @foreach ($tasks as $task) {{ $task }} @endforeach </x-layout>
轉載於:https://blog.csdn.net/qvtcxxjs/article/details/123299785