ghazniali95/react-with-laravel-blade
Generate React components for use in Laravel Blade templates. Provides an Artisan command to scaffold components, optionally with props/args, for Laravel apps using Vite + React. Add generated components to vite.config.js for building.
Installation:
composer require ghazniali95/ReactWithLaravelBlade
npm install react react-dom @vitejs/plugin-react
Configure Vite (if not already set up):
vite.config.js includes @vitejs/plugin-react:
import { defineConfig } from 'vite';
import laravel from 'laravel-vite-plugin';
import react from '@vitejs/plugin-react';
export default defineConfig({
plugins: [
laravel({
input: ['resources/js/app.js'],
refresh: true,
}),
react(),
],
});
Generate a React Component:
php artisan create:reactComponent MyComponent
resources/views/components/MyComponent.blade.php) with embedded React JSX.Use in Blade:
@reactComponent('MyComponent', ['prop1' => 'value1', 'prop2' => 'value2'])
Run Dev Servers:
npm run dev
php artisan serve
Create a simple counter component:
php artisan create:reactComponent Counter --arg=initialCount
Edit the generated Blade file (resources/views/components/Counter.blade.php) to include JSX:
<div id="counter-root"></div>
<script type="text/babel">
const { useState } = React;
const Counter = ({ initialCount }) => {
const [count, setCount] = useState(initialCount);
return (
<div>
<p>Count: {count}</p>
<button onClick={() => setCount(count + 1)}>Increment</button>
</div>
);
};
ReactDOM.render(<Counter initialCount={@json($initialCount)} />, document.getElementById('counter-root'));
</script>
Use it in a Blade template:
@reactComponent('Counter', ['initialCount' => 0])
Component Development:
php artisan create:reactComponent [Name] --arg=prop1,prop2
@reactComponent directive in Blade to render the component with props.Props Handling:
@reactComponent('UserCard', [
'user' => $user,
'isAdmin' => true,
])
const UserCard = ({ user, isAdmin }) => { ... }
State Management:
useState, useEffect) directly in Blade-embedded JSX.const [formData, setFormData] = useState({ name: '' });
const handleSubmit = (e) => { e.preventDefault(); ... };
Styling:
<div class="p-4 bg-gray-100">
@reactComponent('MyComponent')
</div>
API Integration:
useEffect:
useEffect(() => {
fetch('/api/data')
.then(res => res.json())
.then(data => setData(data));
}, []);
.blade.php files. Add to vite.config.js:
laravel({
input: ['resources/js/app.js', 'resources/views/**/*.blade.php'],
}),
@vitejs/plugin-react-swc for TypeScript:
import react from '@vitejs/plugin-react-swc';
import { MyHook } from '/js/hooks/MyHook.js';
<script type="module" src="/js/hooks/MyHook.js"></script>
Vite Hot Module Replacement (HMR):
npm run dev) if changes aren’t reflected..jsx files.Prop Serialization:
@json:
@reactComponent('Component', ['user' => @json($user->toArray())])
Dependency Conflicts:
react and react-dom versions match between Vite and Blade. Use npm ls react to check.Build Process:
input array in vite.config.js for production builds:
input: [
'resources/js/app.js',
'resources/views/components/**/*.blade.php',
],
Caching:
php artisan view:clear
npm run build
create:reactComponent command is registered in app/Console/Kernel.php:
protected $commands = [
\Ghazniali95\ReactWithLaravelBlade\Console\Commands\CreateReactComponent::class,
];
5173). Blade may not auto-refresh React changes.Component Organization:
resources/views/components/ and use @include for shared layouts:
@include('components.layouts.app', [
'content' => @reactComponent('MyComponent')
])
Environment-Specific Builds:
mode to conditionally load components:
// vite.config.js
export default defineConfig(({ mode }) => ({
plugins: [
react(),
laravel({
input: mode === 'production'
? ['resources/js/app.js']
: ['resources/js/app.js', 'resources/views/**/*.blade.php'],
}),
],
}));
Testing:
// TestComponent.test.jsx
test('renders with props', () => {
const props = { initialCount: 0 };
render(<Counter {...props} />);
expect(screen.getByText('Count: 0')).toBeInTheDocument();
});
Performance:
React.lazy:
const LazyComponent = React.lazy(() => import('./LazyComponent.jsx'));
Suspense for fallback UI:
<Suspense fallback={<div>Loading...</div>}>
<LazyComponent />
</Suspense>
Extending the Package:
vendor/ghazniali95/react-with-laravel-blade/src/Console/Commands/CreateReactComponent.php.php artisan vendor:publish --provider="Ghazniali95\ReactWithLaravelBlade\ServiceProvider"
How can I help you explore Laravel packages today?