Skip to main content

Query Parameters and External Values in GraphQL Loaders

Simple Parameter Handling (Using params)​

When your query only needs values from params, use direct parameter definition in routes.json:

{
"queries": {
"GetFilteredProjects": "{filter: {id: params.id, orgName: params.orgName}}",
"GetTeamMembers": "{teamId: params.teamId, pageSize: 10}"
}
}

Query Parameter Generator​

Use Query Parameter Generator when you need to incorporate values from external sources, imports, or complex computations.

When to Use Query Parameter Generator​

  1. External Configuration Values
import { dimensions } from './dimension.js';
import { DEFAULT_PAGE_SIZE } from './constants';
import { calculateDateRange } from './utils';

export const queryParamsGenerator = (params) => ({
teamSearch: {
filters: {
teamId: params.teamId,
dimensions: dimensions, // From import
pageSize: DEFAULT_PAGE_SIZE, // From constants
dateRange: calculateDateRange(params.period) // From utility function
}
}
});
  1. Environment-Specific Values
import { environmentConfig } from './config';

export const queryParamsGenerator = (params) => ({
search: {
orgId: params.orgId,
region: environmentConfig.defaultRegion,
features: environmentConfig.enabledFeatures
}
});
  1. Computed or Transformed Values
import { getRolePermissions } from './permissions';
import { getDefaultFilters } from './filters';

export const queryParamsGenerator = (params) => {
const rolePermissions = getRolePermissions(params.role);
const defaultFilters = getDefaultFilters();

return {
userQuery: {
id: params.userId,
permissions: rolePermissions,
filters: {
...defaultFilters,
...params.filters
}
}
};
};

Example Implementation​

// dimensions.ts
export const dimensions = {
layout: 'horizontal',
maxItems: 50,
sortOrder: 'asc'
};

// searchConfig.ts
export const searchDefaults = {
pageSize: 20,
sortField: 'createdAt',
includeArchived: false
};

// queryParamGenerator.ts
import { dimensions } from './dimensions';
import { searchDefaults } from './searchConfig';
import { formatDateRange } from './utils';

export const queryParamsGenerator = (params) => ({
searchParams: {
basic: {
query: params.searchTerm,
pageSize: searchDefaults.pageSize
},
advanced: {
dimensions: dimensions,
dateRange: formatDateRange(params.startDate, params.endDate),
sorting: {
field: searchDefaults.sortField,
order: dimensions.sortOrder
}
}
}
});

// Component Usage
const SearchComponent = () => {
const params = {
searchTerm: 'example',
startDate: '2024-01-01',
endDate: '2024-12-31'
};

const SearchQuery = useCustomQuery({
variables: queryParamsGenerator(params).searchParams,
fetchPolicy: 'cache-only'
});

return (
<Suspense fallback={<Spinner />}>
<Await resolve={SearchQuery}>
{(data) => <SearchResults data={data} />}
</Await>
</Suspense>
);
};

routes.json Integration​

When using query parameter generators, you reference them in routes.json:

{
"queries": {
"SearchDocument": "queryParamsGenerator(params).searchParams"
}
}

Generated Loader​

export const defaultServerLoader = async ({ context, params, _dataContext = {} }) => {
const { apolloClient: client } = context;

// System automatically handles the query parameter generation
const searchResults = client.query({
query: SearchDocument,
variables: queryParamsGenerator(params).searchParams,
fetchPolicy: __SERVER__ ? 'network-only' : 'cache-first',
});

return {
data: {
searchResults
}
};
};

Comparison: Direct Params vs Query Parameter Generator​

Direct Params (Simple Cases)​

{
"queries": {
"GetTeamMembers": "{teamId: params.teamId, pageSize: 10}"
}
}

✓ Good for: Simple parameter passing from URL/route parameters

Query Parameter Generator (Complex Cases)​

export const queryParamsGenerator = (params) => ({
teamMembers: {
teamId: params.teamId,
pageSize: environmentConfig.pageSize,
permissions: getRolePermissions(params.role),
filters: getTeamFilters(environmentConfig.region)
}
});

✓ Good for:

  • Including imported values
  • Environment-specific configuration
  • Computed or transformed values
  • Complex parameter structures with external dependencies

Back to Index | Previous: Generated Data Loaders | Next: Resource Loaders