Decorators utilities
You can use the decorator utilities to enhance component behaviour and development efficiency within TypeScript projects. Specifically, the renderOnChange decorator automates the re-rendering process of components upon property changes, using the Genesis framework for web development.
Decorator utilities are for projects using Genesis syntax only.
Key features
- Automatic rerendering: Automatically invokes the
render()method of a component when any decorated property changes. - Integration with Genesis Framework: Designed to work seamlessly with components extending
GenesisElement.
Examples
Using renderOnChange
Apply the renderOnChange decorator to properties that should trigger a re-render upon change:
import { renderOnChange } from '@genesislcap/foundation-utils';
import { GenesisElement, attr } from '@genesislcap/web-core';
export class MyExampleComponent extends GenesisElement {
@attr({ mode: 'boolean', attribute: 'line-numbers' })
@renderOnChange
lineNumbers: boolean = true;
@attr
@renderOnChange
indent: number | 'tab' = 2;
}
Using with template
Suppose you have a component where you want certain attributes to trigger a render when they change, such as a custom input element where the value and placeholder properties are observed:
import { renderOnChange } from '@genesislcap/foundation-utils';
import { attr, GenesisElement, html } from '@genesislcap/web-core';
@customElement({
name: 'my-example-component',
template: html`
<input type="text" placeholder="${x => x.placeholder}" value="${x => x.value}" />`,
})
export class MyExampleComponent extends GenesisElement {
@attr
@renderOnChange
value: string = '';
@attr
@renderOnChange
placeholder: string = 'Enter text...';
}
In this example, changes to either value or placeholder will automatically invoke the render() method, ensuring the component's visual state is immediately updated to reflect these changes.
Considerations
When using renderOnChange, consider the performance implications of frequent re-rendering, especially for components with complex rendering logic or those nested within deep component trees. Optimize your render() method to be as efficient as possible and minimize unnecessary DOM updates.