Laravel 8 livewire 在任务完成或在其外部单击页面时隐藏菜单组件

Posted

技术标签:

【中文标题】Laravel 8 livewire 在任务完成或在其外部单击页面时隐藏菜单组件【英文标题】:Laravel 8 livewire hide menu component when task finished or page clicked outside of it 【发布时间】:2022-01-17 23:20:58 【问题描述】:

我的问题,我有一个包含 Accounts 的表格,最后一列是 livewire 组件。目前我可以在此之外单击并且它不会隐藏。当登录(使用 jetstream)时,组件本身是管理帐户下拉菜单的克隆。

我的代码: 资源/视图/livewire/account-menu-component.blade.php

<div>
    <div class=" focus:outline-none focus:border-gray-300 transition hamburger" wire:click="$toggle('showDiv')" title="Click to show menu">
        <i class="fa-2x fa fa-bars"></i>
    </div>
    @if ($showDiv)
    <div class="absolute z-50 mt-2 w-48 rounded-md shadow-lg origin-top-right right-0 ring-1 ring-black ring-opacity-5 py-1 bg-white">
        <div class="block px-4 py-2 text-xs text-gray-400">
             $account->name 
        </div>
        <a class="block px-4 py-2 text-sm leading-5 text-gray-700 hover:bg-gray-100 focus:outline-none focus:bg-gray-100 "
           href=" URL::to( 'accounts/' . $account->id . '/edit' ) ">Edit
        </a>
        <a class="block px-4 py-2 text-sm leading-5 text-gray-700 hover:bg-gray-100 focus:outline-none focus:bg-gray-100"
           href=" URL::to( 'accounts/' . $account->id . '/destroy' ) ">Delete
        </a>
    </div>
    @endif
</div>

app/Http/Livewire/AccountMenuComponent.php

<?php

namespace App\Http\Livewire;

use Livewire\Component;

class AccountMenuComponent extends Component

    public $account;
    public $showDiv = false;

    public function render()
    
        return view('livewire.account-menu-component');
    


在我的 index.blade.php 文件中表格行的最后 td@livewire( 'account-menu-component', ['account' =&gt; $value] ) 其中$value 是行本身的帐户数据。

如果我单击此组件之外的行(或在另一行上,或者如果我单击另一个汉堡包以显示另一行),它将保持打开状态,关闭它的唯一方法是再次单击汉堡包图标。

那么,如果我在此组件外部单击以及当其中一个锚点被单击时,我该如何关闭它?我更喜欢 livewire 解决方案,而不是需要添加 id 元素等的 javascript/jQuery 示例。Jetstream 在登录时使用的菜单完全符合我的要求。

有什么想法吗?

谢谢

克雷格

【问题讨论】:

【参考方案1】:

我发现我可以根据需要进行以下修改(但让它褪色会很好) 资源/视图/livewire/account-menu-component.blade.php

<div>
    <div class=" focus:outline-none focus:border-gray-300 transition hamburger" wire:click="$toggle('showDiv')" title="Click to show menu">
        <i class="fa-2x fa fa-bars"></i>
    </div>
    @if ($showDiv)
    <div x-on:click.away="if($wire.get('showDiv')==true)  $wire.hideDiv() " class="absolute z-50 mt-2 w-48 rounded-md shadow-lg origin-top-right right-0 ring-1 ring-black ring-opacity-5 py-1 bg-white">
        <div class="block px-4 py-2 text-xs text-gray-400">
             $account->name 
        </div>
        <a class="block px-4 py-2 text-sm leading-5 text-gray-700 hover:bg-gray-100 focus:outline-none focus:bg-gray-100 "
           href=" URL::to( 'accounts/' . $account->id . '/edit' ) ">Edit
        </a>
        <a class="block px-4 py-2 text-sm leading-5 text-gray-700 hover:bg-gray-100 focus:outline-none focus:bg-gray-100"
           href=" URL::to( 'accounts/' . $account->id . '/destroy' ) ">Delete
        </a>
    </div>
    @endif
</div>

然后我将 hideDiv 函数添加到 AccountMenuComponent 文件中

<?php

namespace App\Http\Livewire;

use Livewire\Component;

class AccountMenuComponent extends Component

    public $account;
    public $showDiv = false;

    public function render()
    
        return view('livewire.account-menu-component');
    

    public function hideDiv() 
        $this->showDiv = false;
        return view('livewire.account-menu-component');
    


希望这对其他人有所帮助。 Laravel livewire 开发者似乎无意引入此功能。

【讨论】:

以上是关于Laravel 8 livewire 在任务完成或在其外部单击页面时隐藏菜单组件的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 8 和 Livewire - 查询不起作用

dompdf 没有从 Laravel 8 和 Livewire 视图下载 PDF

使用 Jetstream 在 Laravel 8 中添加新 Livewire 组件时如何解决 RootTagMissingFromViewException 错误

未找到 InvalidArgumentException 视图 [layouts.app]。 Laravel-8 LiveWire-2

Laravel Livewire 分页

当我在 Laravel livewire 上单击事件时获得 404 模态