Métodos mágicos y modales

Crear botón para agregar registro:

lando php artisan make:livewire create-post

Esto nos crea: CLASS: app/Http/Livewire/CreatePost.php VIEW: resources/views/livewire/create-post.blade.php

Crear Ventana Modal

Crear un modal, uno que ya esta hecho de jet. resources/views/livewire/create-post.blade.php:

<div>
    {{-- Do your work, then step back. --}}
    <x-jet-danger-button wire:click="$set('open', true)">
        Crear post
    </x-jet-danger-button>

    <x-jet-dialog-modal wire:model='open'>

        <x-slot name='title'>
            Crear nuevo post
        </x-slot>

        <x-slot name='content'>
            <div class="mb-4">
                <x-jet-label value="Título del Post"></x-jet-label>
                <x-jet-input type="text" class="w-full" wire:model.defer="title"></x-jet-input>
                {{ $title }}
            </div>
            <div class="mb-4">
                <x-jet-label value="Contenido del Post"></x-jet-label>
                <textarea wire:model.defer="content" class="form-control w-full" rows="6"></textarea>
                {{ $content }}
            </div>
        </x-slot>

        <x-slot name='footer'>
            <x-jet-secondary-button class="mr-2" wire:click="$set('open', false)">
                Cancelar
            </x-jet-secondary-button>

            <x-jet-danger-button wire:click="save">
                Crear Post
            </x-jet-danger-button>
        </x-slot>

    </x-jet-dialog-modal>

</div>

Para la ventana modal usamos un componente de jetstream:

<x-jet-dialog-modal wire:model='open'> 

El cual esta esperando 3 slots!

CreatePost.php Y en app/Http/Livewire/CreatePost.php:

<?php

namespace App\Http\Livewire;

use App\Models\Post;
use Livewire\Component;

class CreatePost extends Component
{
    public $open = \true;
    public $title, $content;

    public function render()
    {
        return view('livewire.create-post');
    }

    public function save(){
        Post::create([
            'title' => $this->title,
            'content' => $this->content,
        ]);
    }
}

Crear css

Crear resources/css/form.css:

.form-control{
    @apply border-gray-300 focus:border-indigo-300 focus:ring focus:ring-indigo-200 focus:ring-opacity-50 rounded-md shadow-sm;
}

Copiamos los estilos del componente jet input.blade.php Importar el archivo en resources/css/app.css:

@import 'form.css';

@import 'tailwindcss/base';
@import 'tailwindcss/components';
@import 'tailwindcss/utilities';

Ahora compilar.

  • lando npm run dev Hicimos esto para poder usar el input de text area. Ctrl-F5 en chrome or firefox para refrescar cache!

Sincronizar variables

Para sincronizar los datos de title y content usamos:

wire:model="title"
wire:model="content" 

Para evitar que se comunique el wire:model de nuestro modal al backend cada vez que escribimos un character, usamos en vez de wire:model=“title”, usamos defer:

wire:model.defer="title"
wire:model.defer="content" 

En lo que nos ayuda la propiedad defer, es evitar que haya una comunicación constante entre el componente de livewire (app/Http/Livewire/CreatePost.php) y nuestra vista de livewire (resources/views/livewire/create-post.blade.php). Con esto evitamos que se este renderizando la vista cada vez que escribimos un caractér en title o content. Estas propiedades de title y content solo se van actualizar hasta que desencadenemos una acción, en este caso, seria hasta que hagamos click al botón de crear post.

Queda pendiente cerrar la ventana modal y refrescar la pagina principal. Listo!