开发者问题收集

使用 2 个组件通过 Livewire 传递数据时出现问题

2023-01-20
420

我想将数据从 Livewire 组件 A 传递到 Livewire 组件 B。目标是在需要时打开社交图标栏。

这是我的设置:

组件 1 类:

<?php

namespace App\Http\Livewire;

use Livewire\Component;


class SocialShareBar extends Component
{
    public $show;
    protected $listeners = ['openSharePopup' => 'openSharePopup'];


    public function mount() {
        $this->show = false;
    }

    public function openSharePopup() {
        $this->show = true;
        $this->emit('openPopup', ['show' => $this->show ]);
    //Hoping to emit to the component B here
    }

    public function render()
    {
        return view('livewire.social-share-bar');
    }

}

组件 B:

<?php

namespace App\Http\Livewire;

use Livewire\Component;


class SharePopup extends Component
{
    public $show;
    protected $listeners = ['openPopup' => 'render'];
   //I have hoping to catch the "emit" event here

    public function render()
    {
        return view('livewire.popups.share-popup', ['show'=> true]);
    }

}

一个组件位于“app.blade.php”主布局文件中,另一个组件位于 Laravel 的 footer.blade.php 中(它本身已传递给 app.blade.php 文件。

每个文件都位于其自己的 Livewire 位置: resources\views\livewire\popups\share-popup resources\views\livewire\social-share-bar

我目前无法在第二个组件中捕获以下事件:

 protected $listeners = ['openPopup' => 'render'];

问题可能是“受保护”的范围?

谢谢!

1个回答

为了让第二个组件从第一个组件获取数据,您必须从第一个组件事件中传入数据,并在第二个组件事件中监听它。

您已经在这里传递了来自组件 A 的数据,

$this->emit('openPopup', ['show' => $this->show ]);

因此,您需要做的就是在组件 B 中监听它,

class SharePopup extends Component
{
    public $show;

    protected $listeners = ['openPopup'];

    public function openPopup($show)
    {
        $this->show = $show;
    }

    public function render()
    {
        return view('livewire.popups.share-popup');
    }
}

然后在组件 B 的视图中,如果您想使用 Alpine,您可以这样做,

<div x-data="{ show: $wire.entangle('show') }" x-show="show"></div>
Qirel
2023-01-23