laravel - Inertia/Jetstream 将数据返回到页面而不重新渲染
问题描述
刚接触 Inertia 并且在弄清楚这一点时遇到了一些麻烦:
我在 Vue 页面上有一个搜索栏,并希望返回一组过滤结果供用户从搜索栏中选择作为下拉列表。我将查询参数从搜索栏传递到 Laravel 控制器,并使用用户查询执行 where 子句:
public function showFilteredResponse(Request $request)
{
$query = $request->query('query'); //Query passed from Vue
$filteredResults = DB::table('documents')
->where('title', 'like', '%' . $query . '%')->get();
$filteredResults //this contains the data I want the front-end to have access to.
//how can this data be passed to Vue without a full page re-render?
}
如何在不重新渲染整个页面的情况下将 $filteredResults 数据返回给用户?要使用数据呈现初始页面,我有以下内容:
return Jetstream::inertia()->render($request, '/home')->with('documents', $documents);
但是,如果我想在不重新渲染的情况下向页面添加新数据,该怎么做呢?
如果我使用惯性()->render()->with(),那么我可以访问 Vue 页面上的 $filteredResults,但是我会从初始页面加载中丢失道具,除非我重复看起来不像的查询正确的方法。
解决方案
我相信您正在为对惯性核心概念的误解而苦苦挣扎。不用担心。这在处理将前端和后端之间的界限拉得更近的项目时很常见。
如果我理解正确,您正在对您的showFilteredResponse
方法执行正常的 XHR 请求(可能使用 axios)。如果是这种情况,您需要在客户端手动处理响应,就像在没有 Inertia 的普通 Vue 应用程序上一样。
现在,解决这个问题的另一种方法(可能是更好的方法)是利用惯性的概念。您无需使用孤立的方法来过滤结果并向其发出正常的 XHR 请求,而是使用最初呈现列表的相同方法进行过滤,这意味着您也将使用相同的 URL 进行过滤,仅通过不同的参数给它。
看看这个例子。注意watch
Vue组件的属性。当搜索模型更新时,观察者所做的只是简单地向它第一次用于呈现列表的相同 URL 发出请求,但传递更新的参数。
this.$inertia.get(this.route('organizations'), pickBy(this.form), { preserveState: true })
另一种方法是通过 Inertia 使用更新的参数简单地重新加载页面。当我说重新加载时,它不会刷新整个页面,而只会刷新相关的 Vue 组件。
this.$inertia.reload({
data: pickBy(this.form)
})
推荐阅读
- automation - 赛普拉斯 - 或下拉按钮列表的条件
- sharepoint - 尝试从 PowerApps 中的 SharePoint 查找记录时出错
- javascript - 链表删除重复项
- arrays - 为数组动态分配空间并尝试约束值
- ssl - 由于 Heroku 的空服务器响应,Cloudflare 返回 520
- c# - 从不同的方法引用新变量
- git - 不同版本间 Git 合并的最佳实践
- search - woocommerce 变体 sku 搜索
- r - 在 R 中参数化对象名称
- configuration - 在 Spring Data GemFire 1.7.6.RELEASE 中配置脉冲数据浏览器