Merging Props
Merging Props are merged with the existing props in the client-side, instead of overwriting them. For instance,
if your client already has a property "permissions"
that is a list ["read", "delete"]
, given that
"permissions"
is a mergeable prop, when a new partial request receives a list "permissions" = ["update"]
,
the new value of "permissions"
in the client will be ["read", "delete", "update]
instead of ["update"]
.
Making a Mergeable Prop
use actix_web::{web, get, HttpRequest, Responder};
use inertia_rust::{hashmap, Inertia, InertiaProp};
use serde::Deserialize;
#[derive(Deserialize)]
struct RequestQuery {
page: Option<usize>,
per_page: Option<usize>
}
#[get("/users")]
pub async fn users(req: HttpRequest, query: web::Query<RequestQuery>) -> impl Responder {
let page = query.page.unwrap_or(1);
let per_page = query.per_page.unwrap_or(10);
Inertia::render_with_props(&req, "Users/Index", hashmap![
'results' => InertiaProp::merge(User::paginate(page, per_page).await),
])
}
Again, let’s pretend User
is a model of some ORM which contains a paginate
method.
Deferred props can also be mergeable. The behavior will be a combination of them both: the deferred prop will be fetched in a separate request, and when it is received, it’ll be merged with the existing version of itself.
#[get("/users")]
pub async fn users(req: HttpRequest, query: web::Query<RequestQuery>) -> impl Responder {
let page = query.page.unwrap_or(1);
let per_page = query.per_page.unwrap_or(10);
return Inertia::render_with_props(&req, "Users/Index", hashmap![
'results' => InertiaProp::defer(prop_resolve!({ User::paginate(page, per_page).await })).into_mergeable(),
])
}
Resetting Props
When a mergeable property is asked to be reset, it will behave like an ordinary InertiaProp::Data
variant
— or a InertiaProp::Deferred
, if it’s a deferred and mergeable prop.
router.reload({
reset: ['results'],
//...
})