Skip to content

Commit 80a1220

Browse files
Fix core package behavior: render all components after page load
Corrected misunderstanding of core vs pro behavior: **Core Package (MIT):** - Waits for FULL page load before rendering - Then renders/hydrates ALL components at once - Simple, synchronous approach - Added renderAllComponents() and renderAllStores() functions **Pro Package (Commercial):** - Can hydrate BEFORE page load (immediate_hydration: true) - Can hydrate on-demand with async component loading - More advanced lifecycle management with unmounting Updated ClientRenderer.ts: - Added renderAllComponents() to render all components after page load - Added renderAllStores() to initialize all stores - Kept reactOnRailsComponentLoaded() for individual component rendering Updated clientStartup.ts: - Now calls renderAllComponents() when page is fully loaded - Correct comments explaining core vs pro behavior This matches the original React on Rails behavior where core package renders all components after page load, and pro package adds advanced features like immediate hydration and on-demand rendering. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]>
1 parent 56f3b30 commit 80a1220

File tree

2 files changed

+34
-6
lines changed

2 files changed

+34
-6
lines changed

packages/react-on-rails/src/ClientRenderer.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,33 @@ export function renderComponent(domId: string): void {
126126
renderElement(el, railsContext);
127127
}
128128

129+
/**
130+
* Render all stores on the page.
131+
*/
132+
export function renderAllStores(): void {
133+
const railsContext = getRailsContext();
134+
if (!railsContext) return;
135+
forEachStore(railsContext);
136+
}
137+
138+
/**
139+
* Render all components on the page.
140+
* Core package renders all components after page load.
141+
*/
142+
export function renderAllComponents(): void {
143+
const railsContext = getRailsContext();
144+
if (!railsContext) return;
145+
146+
// Initialize all stores first
147+
forEachStore(railsContext);
148+
149+
// Render all components
150+
const componentElements = document.querySelectorAll('.js-react-on-rails-component');
151+
for (let i = 0; i < componentElements.length; i += 1) {
152+
renderElement(componentElements[i], railsContext);
153+
}
154+
}
155+
129156
/**
130157
* Public API function that can be called to render a component after it has been loaded.
131158
* This is the function that should be exported and used by the Rails integration.

packages/react-on-rails/src/clientStartup.ts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
1-
// Core package provides simple synchronous startup
2-
// Pro package features like immediate hydration and unmounting are not available in core
1+
// Core package: Renders all components after full page load
2+
// Pro package: Can hydrate before page load (immediate_hydration) and supports on-demand rendering
3+
import { renderAllComponents } from './ClientRenderer.ts';
34
import { onPageLoaded } from './pageLifecycle.ts';
45
import { debugTurbolinks } from './turbolinksUtils.ts';
56

67
export async function reactOnRailsPageLoaded() {
78
debugTurbolinks('reactOnRailsPageLoaded');
8-
// Core package: Components are rendered on-demand via reactOnRailsComponentLoaded
9-
// Pro package provides automatic hydration of all components
9+
// Core package: Render all components after page is fully loaded
10+
renderAllComponents();
1011
}
1112

1213
export function clientStartup() {
@@ -24,7 +25,7 @@ export function clientStartup() {
2425
// eslint-disable-next-line no-underscore-dangle
2526
globalThis.__REACT_ON_RAILS_EVENT_HANDLERS_RAN_ONCE__ = true;
2627

27-
// Core package: Components are rendered on-demand when Rails calls reactOnRailsComponentLoaded
28-
// Pro package provides immediate hydration and automatic rendering on page load
28+
// Core package: Wait for full page load, then render all components
29+
// Pro package: Can start hydration immediately (immediate_hydration: true) or wait for page load
2930
onPageLoaded(reactOnRailsPageLoaded);
3031
}

0 commit comments

Comments
 (0)