我在项目中使用Laravel Livewire,我使用wire:loading
在单击时加载状态。我在foreach循环中迭代了所有任务,但是加载状态适用于所有组件。这是代码。
刀片文件
GitLab:https://gitlab.com/tasklog/tasklog/-/blob/master/resources/views/livewire/home/tasks.blade.php
<button type="button" wire:click="togglePraise({{ $task->id }}, {{ $task->user->id }})">
?
<span class="small text-black-50 font-weight-bold">
{{ $task->task_praise->count() }}
</span>
<div wire:loading wire:target="togglePraise">
Processing...
</div>
</button>
控制器文件
GitLab:https://gitlab.com/tasklog/tasklog/-/blob/master/app/Http/Livewire/Home/Tasks.php
public function togglePraise($id, $user_id)
{
if (Auth::check()) {
if (Auth::user()->id === $user_id) {
session()->flash('message', 'Forbidden!');
return;
}
$isPraised = TaskPraise::where([
['user_id', Auth::user()->id],
['task_id', $id],
])->count();
if ($isPraised === 1) {
TaskPraise::where([
['user_id', Auth::user()->id],
['task_id', $id],
])->delete();
return true;
} else {
TaskPraise::create([
'task_id' => $id,
'user_id' => Auth::user()->id,
]);
return true;
}
} else {
return session()->flash('message', 'Forbidden!');
}
}
答案 0 :(得分:2)
我知道这个问题是在 v2 发布之前,但添加了 v2 的答案以供参考。
根据 Livewire docs 如果您使用的是 v2,您可以在 wire:target 指令中指定操作及其参数。对于您的示例,它会是这样的:
wire:target="togglePraise({{ $task->id }}, {{ $task->user->id }})"
答案 1 :(得分:0)
我无法通过将目标加载到带有参数的操作来实现,所以我使用 jquery 和 livewire
表格循环中带有默认 d-none 加载图标类的按钮
<div class="col-3">
<button class="btn btn-sm btn-default btn-save ">
Save <span class="loading-icon d-none">
<i class="fa fa-circle-o-notch fa-spin" style="font-size:14px"></i></span>
</button></div>
用于调用 livewire 并启用加载的 Javascript 代码
$('.btn-save').click(function (e) {
e.preventDefault();
$('.parameter-value').removeClass("error-field");
var row = $(this).closest('tr');
row.find('.loading-icon').removeClass('d-none');
var parameter = row.data('parameter');
var value = $.trim(row.find('.parameter-value').val())
if(value == ""){
row.find('.parameter-value').addClass('error-field');
}else{
row.find('.parameter-value').removeClass('error-field');
//Livewire call
@this.addParameterValue(parameter,value);
}
});
LiveWire 函数结束前调度浏览器事件
public function addParameterValue($parameterID,$value)
{
...
$this->dispatchBrowserEvent('parameter_value-saved');
}
从javascript端处理浏览器事件并删除里面的隐藏加载图标
window.addEventListener('parameter_value-saved', event => {
$('.loading-icon').addClass('d-none');
})