提问者:小点点

事件侦听器未从mount()方法拾取Laravel Livewire发射(但在从刀片触发时工作)


我有嵌套的Livewire组件,其中“子”向“父”触发事件
问题在于,当从子级(mount)方法触发时,它不会到达侦听器
从子级触发事件时,侦听器可能还不可用
当使用wire:click=“$emit(…)”从孩子的刀锋开火时,它确实起作用或全局JavaScript。

类似于我的设置:first方法获取帖子,second方法获取管理评论,我想让first知道页面上有多少评论,这样它就可以更新计数器。这可以作为mount()的一部分来完成,在这里我可以得到注释。

如何从孩子的mount()方法触发事件,和/或其他方法是否更合适?

第一php

protected $listeners = ['testEmit'];

public function testEmit() {
   Log::info("testEmit listener"); // only received when firing from blade
}

first.blade.php

@livewire('second')

第二php

    public function buttonClick()
    {
        // works
        $this->emit('testEmit', 'Second (method buttonClick)');
    }

    public function mount()
    {
        // not working (is sent but not received)
        $this->emit('testEmit', 'Second (method mount)');
    }

    public function render()
    {
        // does not work (does work after buttonClick emit)
        $this->emit('testEmit', 'Second (method render)');

        return view('livewire.second')->layout('layouts.guest');
    }

第二刀身php

<div>
    <button wire:click="$emit('testEmit')"> <!-- this works fine -->
</div>
<div>
   <button wire:click="buttonClick">test (calls method)</button>
</div>
<script>
//  Livewire.emit('testEmit') // this works fine
</script>

更新:在第二部分中添加了更多细节/示例。php和second。刀身php


共2个答案

匿名用户

在这种情况下,我建议只在一个函数中保留emit代码。

public function mount()
{
    $this->buttonClick();
}

public function render()
{
    $this->buttonClick();
    return view('livewire.second')->layout('layouts.guest');
}

public function buttonClick()
{
    $this->emit('testEmit', 'Second (method buttonClick)');
}

匿名用户

对于未来偶然发现这一点的人来说,我发现这很有效:

刀片文件

<script>
    window.addEventListener("DOMContentLoaded", function () {
        Livewire.emit("emit_to_parent");
    });
</script>

//在livewire组件中

protected $listeners = ["emit_to_parent"];

public function emit_to_parent()
{
    $this->emit("foo");
}

作为背景,这个问题解释了为什么它不起作用

无法从挂载方法#598发出事件