Laravel Blade Components are a powerful feature in Laravel's templating engine that allows you to create reusable UI elements with isolated logic. They were significantly enhanced in Laravel 7 and continue to be a cornerstone of Laravel's front-end ecosystem.
Blade Components allow you to extract reusable parts of your interface into a single file with its own logic, properties, and slots. Think of them as custom HTML elements that you can reuse across your application.
Let's create a reusable alert component that can display different types of notifications (success, error, warning) throughout our application.
php artisan make:component Alert
This creates two files:
app/View/Components/Alert.php - The component classresources/views/components/alert.blade.php - The component template// app/View/Components/Alert.php
namespace App\View\Components;
use Illuminate\View\Component;
class Alert extends Component
{
public $type;
public $message;
/**
* Create a new component instance.
*
* @param string $type
* @param string $message
* @return void
*/
public function __construct($type = 'info', $message = null)
{
$this->type = $type;
$this->message = $message;
}
/**
* Get the view / contents that represent the component.
*
* @return \Illuminate\View\View|\Closure|string
*/
public function render()
{
return view('components.alert');
}
/**
* Get the appropriate CSS class based on alert type.
*
* @return string
*/
public function typeClass()
{
return [
'success' => 'bg-green-100 border-green-500 text-green-700',
'error' => 'bg-red-100 border-red-500 text-red-700',
'warning' => 'bg-yellow-100 border-yellow-500 text-yellow-700',
'info' => 'bg-blue-100 border-blue-500 text-blue-700',
][$this->type] ?? 'bg-blue-100 border-blue-500 text-blue-700';
}
}
{{-- resources/views/components/alert.blade.php --}}
<div {{ $attributes->merge(['class' => 'border-l-4 p-4 mb-4 ' . $typeClass()]) }} role="alert">
<div class="flex">
<div>
@if($message)
<p>{{ $message }}</p>
@else
{{ $slot }}
@endif
</div>
</div>
</div>
There are multiple ways to use this component:
{{-- Using the x- prefix and passing properties --}}
<x-alert type="success" message="Your profile has been updated!" />
{{-- Using content in the slot --}}
<x-alert type="error">
<p>There was an error processing your request.</p>
<p>Please try again later.</p>
</x-alert>
{{-- With additional attributes that merge with the component --}}
<x-alert type="warning" class="mt-6" id="cookie-warning">
This site uses cookies to enhance your experience.
</x-alert>
This practical example demonstrates how Blade Components help you create a more maintainable and modular codebase by extracting reusable UI elements into dedicated components with their own logic and styling.