如何解决Laravel Livewire:如何强制刷新计算属性和DOM?
我有一个“收藏夹”组件。该组件绘制一颗星星,该星星根据状态分为三个等级。为了选择要应用于组件的类,我使用一个计算属性,定义为:
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
计算属性中,...是我正在尝试访问的另一个属性,在这种情况下,该属性是EsFavorita
定义的getEsFavoritaAttribute()
我要做的是将该函数从计算属性更改为普通函数,然后按原样调用该函数...这样修改后的代码看起来像这样:
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()
来解决这个问题
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。