【问题标题】:Laravel Livewire: how to force refresh of a computed property (and the DOM)?Laravel Livewire:如何强制刷新计算属性(和 DOM)?
【发布时间】:2021-01-23 02:06:10
【问题描述】:

我有一个“最喜欢”的组件。该组件绘制了一个根据状态获取三个类的星形。为了选择应用到组件的类,我使用了一个计算属性,定义为:

  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';
    }
  }

这是西班牙语,但我认为逻辑很清楚:如果没有签名用户(访客),则函数将返回 voto-idea-inactivo 类,如果用户已登录,它将根据询问是否登录的函数返回一个或另一个当前项目被当前用户收藏。

这两个函数按预期工作。如果我直接在数据库中更改数据透视表中的数据,星号会正确显示状态。

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

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

所以它切换(附加/分离)关系,功能是:

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

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

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

【问题讨论】:

  • 谢谢。我应该如何调用该函数?我在更新数据库后(在toggleFavorita() 函数中)放置了$this-&gt;render(),但它不起作用
  • Uhmmm好奇怪,我要点两下,当然是显示PREVIOUS状态了。我的意思是,它的“关闭”,我点击...保持关闭。我签入数据库并存在关系,我再次单击,它“打开”但数据库不再具有关系????
  • 这给了我一个错误:“Public method [toggleFavorita;$refresh] not found on component: [show-idea]
  • $this-&gt;render(); 它应该可以工作
  • 不...我试过它也不起作用。我将$refresh 放在一个独立的按钮上,它可以工作,但是单击星形然后单击另一个按钮有点愚蠢。我在按钮上调用了toggleFavorita(); $refresh,但它也不起作用

标签: php laravel laravel-livewire


【解决方案1】:

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

事情是......在toggleFavorita 计算属性中,我试图访问另一个属性,在这种情况下EsFavoritagetEsFavoritaAttribute() 定义

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

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() 来弄清楚

【讨论】:

    猜你喜欢
    • 2021-05-11
    • 2021-03-31
    • 2019-12-27
    • 2020-12-10
    • 1970-01-01
    • 1970-01-01
    • 2014-07-04
    • 2021-04-17
    • 1970-01-01
    相关资源
    最近更新 更多