Eventos y oyentes

El componente CreatePost con su vista create-post es independiente del componente ShowPost, para poder avisarle al componente ShowPost tenemos que avisarle con un evento que vamos a emitir desde el componente CreatePost.

Vamos a crear un evento ‘renderiza’ en app/Http/Livewire/CreatePost.php:

<?php

namespace App\Http\Livewire;

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

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

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

    public function save(){
        // Agregar registro a la tabla posts
        Post::create([
            'title' => $this->title,
            'content' => $this->content,
        ]);

        // Para reset las propiedades de open, title y content
        $this->reset(['open','title','content']);

        $this->emit('renderiza');
    }
}

Luego lo escuchamos en app/Http/Livewire/ShowPosts.php:

<?php
namespace App\Http\Livewire;
use App\Models\Post;
use Livewire\Component;
class ShowPosts extends Component
{
    public $search;
    public $sort = 'id';
    public $direction = 'desc';

    //Cuando escuches el evento renderiza ejecuta el método render
    protected $listeners = ['renderiza' => 'render'];

    public function render()
    {
        $posts = Post::where('title', 'like', '%' . $this->search . '%')
                        ->orWhere('content', 'like', '%' . $this->search . '%')
                        ->orderBy($this->sort, $this->direction)
                        ->get();

        return view('livewire.show-posts', compact('posts'));
    }

    public function order($sort)
    {   
        if ($this->sort == $sort) {
            if ($this->direction == 'desc') {
                $this->direction = 'asc';
            } else {
                $this->direction = 'desc';
            }
        } else {
            $this->sort = $sort;
            $this->direction = 'asc';
        }
    }

}

Listo!

Sweetalert

Los eventos también los podemos escuchar desde un scripts, esto nos ayuda para hacer trigger de eventos, por ejemplo, el plugin de JS sweetalert2: https://sweetalert2.github.io/

CDN:

Lo vamos a pegar en el head en la sección de scripts en resources/views/layouts/app.blade.php:

<!-- Scripts -->
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script> 

Y para escuchar un scrip en la pagina, tenemos que agregar código JS, hasta abajo de la pagina, antes de que termine el body, después de @livewireScripts, asi:

<script>
    livewire.on('alerta', function(mensaje){
        Swal.fire(
            'Good job!',
            mensaje,
            'success'
        )
    })
</script>

Para que solo un componente escuche el evento, en app/Http/Livewire/CreatePost.php:

$this->emitTo('show-posts','renderiza');
$this->emit('alerta', 'El Post se creó satisfactoriamente');

Listo!