【问题标题】:Can't get Livewire Events Emit and Listen to work无法让 Livewire 事件 Emit 和 Listen 工作
【发布时间】:2021-06-28 05:26:18
【问题描述】:

我正在尝试设置一个事件侦听器,以便当子 livewire 组件更新标题时,它会刷新父组件以显示更新,而不必硬刷新页面以查看更新。

这是一个快速 gif,显示正在发生的事情

我有 2 个 livewire 组件。

父级 = ViewSidebar.php / view-sidebar.blade.php

// view-sidebar.blade.php
@foreach ($kanbans as $kanban )
   @livewire('kanbans.show-sidebar-kanban', ['kanban'=>$kanban], key($kanban->id))
@endforeach

// ViewSidebar.php
public $kanbans;

protected $listeners = ['refreshKanbans'];
  
public function refreshKanbans()
    {
        $this->kanbans = Kanban::where('status', $this->active)
                            ->orderBy('order', 'ASC')
                            ->get();
    }

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

public function render()
    {
        return view('livewire.kanbans.view-sidebar');
    }

在子组件中我设置了这个

public function updateKanban($id)
    {
        $this->validate([
            'title' => 'required',
        ]);

        $id = Kanban::find($id);

        if ($id) {
            $id->update([
                'title' => $this->title,
            ]);
        }

        $this->resetInputFields();

        $this->emit('refreshKanbans');

       
    }

所有文件都在一个名为kanbans 的子文件夹中,这会破坏它吗?

尝试遵循这些文档https://laravel-livewire.com/docs/2.x/events

我也尝试了这种方法,调用了 emit $this->emit('updateKanbanSidebar'); 并像这样设置监听器 protected $listeners = ['updateKanbanSidebar' => 'refreshKanbans'];

显然我对文档的理解有误,但不知道问题出在哪里。

非常感谢任何帮助!

提前谢谢你:)

【问题讨论】:

  • 你确定你的父组件中的事件被触发了吗?
  • 感谢您的提示 :),在看到发射低谷后,我进入了不同解决方案的兔子洞

标签: laravel event-listener laravel-livewire


【解决方案1】:

我能够在子组件中使用它并跳过发射。我能够 DD 并且发射工作正常,但不知道为什么它没有更新。

public function updateKanban($id)
    {
        $this->validate([
            'title' => 'required',
        ]);

        $this->kanban->update(['title' => $this->title]);

        $this->resetInputFields();

        $this->kanban=Kanban::find($this->kanban->id);
       
    }

【讨论】:

    【解决方案2】:

    你的代码有问题,所以让我帮你解决。从子组件发出后(确保这很好)只需要在父组件中有这个

    父母

    protected $listeners = ['refreshKanbans' => '$refresh'];
      
    public function render()
        {
            $this->kanbans = Kanban::where('status', $this->active)
                                ->orderBy('order', 'ASC')
                                ->get();
            return view('livewire.kanbans.view-sidebar');
        }
    

    告诉我

    【讨论】:

    • 虽然它可能不是最有效或最合适的,但@Jakub 选择处理refreshKanbans 的方式并没有错(本身)。调用方法并设置 public $kanbans 属性将导致刷新,因为 Livewire 会注意到更改。
    • 是的,我只是分享我最简单的方法来处理父组件内的任何其他情况。我意识到我之前使用的“错误”词不正确,对此感到抱歉
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-20
    • 1970-01-01
    • 2017-01-21
    • 1970-01-01
    • 2012-09-11
    • 2016-04-21
    • 2021-06-07
    相关资源
    最近更新 更多