Custom renderAs
A custom renderAs renderer is the lightest registry extension in Widgemo.
Use it when a field should keep its existing schema and behavior, but needs a different visual output.
When to Use Custom renderAs
| Situation | Prefer custom renderAs? | Why |
|---|---|---|
| Existing field needs a different visual treatment | Yes | Only presentation changes |
| Multiple fields share the same semantic value type | Sometimes | Use a field type instead if the semantic category matters |
| Entire content layout needs to change | No | Use a custom mode instead |
| Built-in renderer already supports the need | No | Stay config-driven when possible |
Registration Contract
registerWidgemoRenderAs accepts a RenderAsRegistryEntry:
| Field | Type | Description |
|---|---|---|
name | string | Registry key referenced from item.fields[].renderAs |
render | (value, options, entity) => ReactNode | Renderer function |
defaultOptions | Partial<RenderAsOptions> | Default options merged before render |
1. Create the renderer
// src/renderers/jsonRenderer.tsx
import type { RenderAsRegistryEntry } from '@widgemo/widgemo-core';
export const jsonRenderer: RenderAsRegistryEntry = {
name: 'json',
render: (value, _options, _entity) => (
<pre style={{ fontSize: '0.75rem', margin: 0, overflowX: 'auto' }}>
{JSON.stringify(value, null, 2)}
</pre>
),
defaultOptions: {},
};
2. Register at app boot
import { widgemoRegistry } from '@widgemo/widgemo-core';
import { jsonRenderer } from './renderers/JsonRenderer';
widgemoRegistry.registerWidgemoRenderAs(jsonRenderer);
Register before a Widgemo using that renderer is rendered.
3. Use in any field
const fields = [
{ key: 'id', label: 'ID' },
{ key: 'name', label: 'Name' },
{ key: 'metadata', label: 'Metadata', renderAs: 'json' },
];
Best Practices
- Keep renderer names namespaced when they are application-specific (
acme.json,finance.delta-chip). - Prefer
renderAsover custom field types when the change is purely presentational. - Use
defaultOptionsto centralize repeated renderer options. - Avoid replacing built-in renderers unless you want a global override.