使用 Laraver Inertia Vue
我使用带有分页帖子列表的 vue。对于每篇文章,我只从数据库中加载几列,例如标题和作者。然后我访问 url 以加载列表中所选帖子的详细信息。我这样做是使用带有延迟加载功能的访问 url。之后,我准备好在不重新加载整个页面的情况下编辑帖子。帖子更新后,我将其提交并正确保存到数据库中。之后我可以返回页面。一切都发生了,无需重新加载列表。为了能够懒惰地加载特定帖子的详细信息,我的控制器是这样的。
class PostController extends Controller
{
public function Index($id = null)
{
$this->id = $id;
return Inertia::render('Posts/Index', [
'posts' => Post::select('id', 'title', 'created_at')
->addSelect([
'userfirstname' => User::select('firstname')->whereColumn('id', 'posts.user_id'),
'userlastname' => User::select('familyname')->whereColumn('id', 'posts.user_id')
])
->orderBy('created_at', 'DESC')
->paginate(10),
//lazily evaluated
'details' => function () {
if ($this->id) {
$post = Post::find($this->id);
} else {
$post = null;
}
return $post;
},
]);
}
public function Update(Request $request)
{
$request->validate([
'id'=>'required',
'abstract'=>'required',
//TODO :to be completed
]);
$post=Post::find($request->input('id'));
$post->abstract=$request->input('abstract');
$post->title=$request->input('title');
//TODO to be completed
$post->save();
return Redirect::back();
}
}
我用来加载页面和详细信息的方法是:
//visit this url to get the lazzy evaluation of post details
if (to_visit) {
this.$inertia
.visit(`/posts/${to_visit}`, {
method: "get",
data: {},
replace: false,
preserveState: true,
preserveScroll: true,
only: ["details"],
headers: {}
})
.then(to_visit => {
console.log("fetched " + this.details.title);
});
}
},
updatePost(form) {
console.log("form submitted");
this.$inertia.visit(`/post`, {
method: "put",
data: form,
replace: false,
preserveState: true,
preserveScroll: true,
only: [],
headers: {}
});
},
只要我更新的特定帖子在第一页上就可以正常工作,但是当它在列表中的任何其他分页页面上时,帖子保存是可以的,但我不会返回分页页面但总是在第一页一。很高兴听到解决方案!