我有嵌套的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
在这种情况下,我建议只在一个函数中保留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发出事件