Laravel Livewire组件调用emit报错:Method App\Livewire\Post\Comment::emit不存在
解决Livewire评论提交后emit报错及滚动到新评论的问题
一、解决"emit方法不存在"的错误
Livewire 3版本已废弃emit方法,改用dispatch触发前端事件,这是报错的核心原因。修改你的store方法如下:
public function store() { $this->validate(["body" => "required"]); $comment = ModelsComment::create([ 'user_id' => Auth::user()->id, "article_id" => $this->article->id, "body" => $this->body ]); if($comment){ // 替换emit为dispatch,传递评论ID参数 $this->dispatch('commentStored', commentId: $comment->id); $this->body = null; } else { session()->flash('danger', 'Komentar gagal Ditambahkan!!'); return redirect()->route('data', $this->article->slug); } }
二、实现提交后滚动到新评论
在你的Livewire组件视图文件中,添加JavaScript监听事件,并确保评论元素有对应ID:
- 给每个评论元素设置唯一ID
@foreach($comments as $comment) <div id="comment-{{ $comment->id }}" class="comment-container"> <!-- 评论内容渲染 --> <p>{{ $comment->body }}</p> </div> @endforeach
- 添加滚动逻辑的监听脚本
<script> document.addEventListener('livewire:initialized', () => { Livewire.on('commentStored', (event) => { const targetComment = document.getElementById(`comment-${event.commentId}`); if (targetComment) { // 平滑滚动到目标评论,居中显示 targetComment.scrollIntoView({ behavior: 'smooth', block: 'center' }); // 可选:添加高亮提示效果 targetComment.classList.add('bg-blue-50'); setTimeout(() => targetComment.classList.remove('bg-blue-50'), 3000); } }); }); </script>
内容的提问来源于stack exchange,提问作者devcode
相关产品推荐
相关产品推荐

