Laravel Livewire:如何强制刷新计算的 属性(和 DOM)?

Laravel Livewire: how to force refresh of a computed property (and the DOM)?

我有一个“最喜欢的”组件。该组件绘制了一颗星星,根据状态获得三个 classes。为了 select 将哪个 class 应用到组件,我使用计算 属性,定义为:

  public function getEsFavoritaProperty() {
    return $this->idea->users()->where('user_id', Auth::user()->id)->count() > 0;
  }

  public function getFavoritaProperty() {

    if (Auth::guest()) return 'voto-idea-inactivo';

    if ($this->EsFavorita) {
      return 'voto-idea-seleccionado';
    } else {
      return 'voto-idea-activo';
    }
  }

这是西班牙语,但我认为逻辑很清楚:如果没有登录用户(来宾),那么函数将 return voto-idea-inactivo class,如果用户已登录,它将 return 一个或另一个基于询问当前项目是否被当前用户收藏的函数。

这两个功能按预期工作。如果我直接在数据库中更改枢轴 table 中的数据,则星号会正确显示状态。

现在我有这个主播<a>在星...

<a wire:click.prevent="toggleFavorita">
    <i class="fas fa-star fa-2x {{ $this->favorita }}"></i>
</a>

所以它切换(attach/detach)关系,功能是:

  public function toggleFavorita() {
    if ($this->EsFavorita) {
      $this->idea->users()->detach(Auth::user()->id);
    } else {
      $this->idea->users()->attach(Auth::user()->id);
    }
  }

这个功能也很完美,如果用户点击星标,该功能会在数据库中创建或删除关系。问题是星星没有重新绘制,并保持以前的状态。如果我重新加载页面,就会出现更改。

那么我该如何强制这颗星使用新的计算值进行刷新呢?

我解决了问题...与刷新组件无关‍♂️

事情是...在 toggleFavorita 计算的 属性 中,我试图访问另一个 属性,在本例中 EsFavorita 由 [=13= 定义]

我所做的是将该函数从计算 属性 更改为普通函数,然后调用该函数......所以修改后的编码现在看起来像:

public function EsFavorita() {
    return $this->idea->users()->where('user_id', Auth::user()->id)->count() > 0;
}

public function toggleFavorita() {
    if ($this->EsFavorita()) {
        $this->idea->users()->detach(Auth::user()->id);
    } else {
        $this->idea->users()->attach(Auth::user()->id);
    }
}

我不知道,看起来像一个生命周期,计算的属性在其他一切之后刷新。我花了很多时间和很多 Log::info() 来弄清楚