UNPKG

@ea-lab/reactive-json-docs

Version:

Complete documentation for Reactive-JSON - Components, examples and LLM-parsable guides

179 lines (153 loc) 7.76 kB
renderView: - type: Markdown content: | # Forward update > Use the special placeholder `<reactive-json:event>` to reference values coming directly from the DOM or custom event that triggered a reaction. The **Forward update** pattern lets you use the special placeholder `<reactive-json:event>` inside any reaction arguments. It is primarily useful with `setData`, but can be applied to any reaction. Instead of reading a value *after* the global data has been updated, you can forward the fresh value carried by the event itself. - type: SyntaxHighlighter language: yaml content: | # Simplified shortcut value: "<reactive-json:event-new-value>" # Auto-detects the relevant value (value or checked) # Generic pattern value: "<reactive-json:event>.target.value" # For text inputs value: "<reactive-json:event>.target.checked" # For checkboxes - type: Markdown content: | ## The `<reactive-json:event-new-value>` shortcut `<reactive-json:event-new-value>` automatically detects and returns the most relevant value from different types of events. The extraction logic varies based on the event type and the target element. ### Extraction Rules Reference | Event Type | Target Element | Logic | Return Value | Example | |------------|----------------|-------|--------------|---------| | **CustomEvent** | Any | Returns `event.detail.value` | Any value from custom event payload | `<reactive-json:event-new-value>.preferences.theme` | | **DOM Event** | `input[type="checkbox"]` | Returns `event.target.checked` | `true` or `false` | `<reactive-json:event-new-value>``true` | | **DOM Event** | `input[type="radio"]` | Returns `event.target.value` if checked, otherwise `undefined` | String value or `undefined` | `<reactive-json:event-new-value>``"option1"` | | **DOM Event** | `input[type="text"]`, `textarea`, `select` | Returns `event.target.value` | String value | `<reactive-json:event-new-value>``"user input"` | | **DOM Event** | Element with `value` property | Returns `event.target.value` | Any value | `<reactive-json:event-new-value>``"42"` | | **DOM Event** | Element with `checked` property (fallback) | Returns `event.target.checked` | `true` or `false` | `<reactive-json:event-new-value>``false` | | **Any Event** | No applicable property | Returns `undefined` | `undefined` | `<reactive-json:event-new-value>``undefined` | ### Processing Priority For DOM events, the extraction follows this priority order: 1. **Checkbox**: `event.target.checked` (boolean) 2. **Radio button**: `event.target.value` only if checked, otherwise `undefined` 3. **General case**: `event.target.value` (if property exists) 4. **Fallback**: `event.target.checked` (if property exists) 5. **Default**: `undefined` For CustomEvent objects (like `response` events from `fetchData`), it directly accesses `event.detail.value` and allows further property access with dot notation. **Good practice** - For standard form events (`change`, `input`, etc.), prefer the shortcut `<reactive-json:event-new-value>`. - For custom events (e.g. messages via `postMessage`, `CustomEvent`), reference the payload explicitly : - `<reactive-json:event>.data.foo` (MessageEvent) - `<reactive-json:event>.detail.bar` (CustomEvent) - The bare placeholder `<reactive-json:event>` returns `undefined` on purpose, to avoid storing large non-serializable objects. If no property path is provided (`<reactive-json:event>` alone), nothing is forwarded (`undefined`). You can access any nested property (`detail`, `key`, etc.). ## Event Types ### Standard DOM Events The forward update system works with standard DOM events (`change`, `input`, `click`, etc.) from form elements and other HTML components. ### Response Event You can also use the special `response` event with reactions like `fetchData`. This event is triggered when an HTTP request completes successfully, allowing you to access the response data directly. Typical use-cases: - Real-time mirroring of form fields - "Select all" checkboxes - Forward arbitrary values coming from events - Process HTTP response data immediately after fetch operations - type: Markdown content: | ## Examples # --- Interactive example: Synchronized CheckBoxes (use-case "Select all") - type: RjBuildDescriber title: "Synchronized CheckBoxes (Select-all pattern)" description: type: Markdown content: | Ticking the **Controller** checkbox instantly updates the **Mirror** checkbox thanks to `value: "<reactive-json:event>.target.checked"`. toDescribe: renderView: - type: CheckBoxField dataLocation: ~~.controller_checked options: - label: "Controller" value: true actions: - what: setData on: change path: ~~.mirror_checked value: "<reactive-json:event>.target.checked" - type: CheckBoxField dataLocation: ~~.mirror_checked options: - label: "Mirror (synced)" value: true data: controller_checked: false mirror_checked: false # --- Interactive example: Synchronized TextFields --- - type: RjBuildDescriber title: "Synchronized TextFields" description: type: Markdown content: | Each keystroke in the **Primary** field is forwarded to the **Secondary** field via `value: "<reactive-json:event>.target.value"`. toDescribe: renderView: - type: TextField label: Primary input placeholder: Type here... dataLocation: ~~.primary_text actions: - what: setData on: change path: ~~.secondary_text value: "<reactive-json:event>.target.value" - type: TextField label: Secondary input (synced) placeholder: Echo... dataLocation: ~~.secondary_text data: primary_text: "" secondary_text: "" - type: Markdown content: | ### Response Event Processing This example shows how to use the `response` event to process data returned by an HTTP request. When `fetchData` completes successfully, you can extract specific values from the response and store them in different locations using `<reactive-json:event-new-value>`. - type: SyntaxHighlighter language: yaml title: "Response Event Processing" content: | renderView: - type: button content: "Load User Profile" actions: - what: fetchData on: click url: "/api/user-profile.json" updateOnlyData: true updateDataAtLocation: ~~.userProfile - what: setData on: response # Triggered when fetchData completes path: ~~.userTheme value: <reactive-json:event-new-value>.preferences.theme - what: setData on: response path: ~~.userName value: <reactive-json:event-new-value>.name - type: div content: - "User theme: " - type: code content: ~~.userTheme - type: div content: - "User name: " - type: strong content: ~~.userName data: userTheme: "not-loaded" userName: "not-loaded" templates: data: {}