Skip to content

Commit 9b98494

Browse files
committed
Add an integration test for registerRenderer
Added a new page /client_side_manual_render. This page renders the react component `ManualRenderApp`, which is registered on the client side using `registerRenderer`. The given renderer function just renders some simple html to the DOM. The integration test tests for the presence of the html rendered by the ManualRenderApp renderer. The test passing suggests that ReactOnRails properly delegates to the renderer function on client startup.
1 parent 99955f9 commit 9b98494

File tree

6 files changed

+84
-0
lines changed

6 files changed

+84
-0
lines changed

spec/dummy/app/views/pages/_header.erb

+3
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,9 @@
5656
<li>
5757
<%= link_to "One Page with Many Examples at Once", root_path %>
5858
</li>
59+
<li>
60+
<%= link_to "Manually Rendered Component", client_side_manual_render_path %>
61+
</li>
5962
<li>
6063
<%= link_to "React Router", react_router_path %>
6164
</li>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
<%= render "header" %>
2+
3+
<%= react_component("ManualRenderApp", props: {}, prerender: false) %>
4+
<hr/>
5+
6+
<h2>Manual Rendering with registerRenderer</h2>
7+
<ul>
8+
<li>
9+
<p>Use react_component the same way you would if you were using register:</p>
10+
<pre>
11+
<%%= react_component("ManualRenderApp", props: {}, prerender: false) %>
12+
</pre>
13+
<p>spec/dummy/app/views/pages/client_side_manual_render.html.erb</p>
14+
<br>
15+
</li>
16+
17+
<li>
18+
<p>Use registerRenderer to expose the rendering function to ReactOnRails:</p>
19+
<pre>
20+
import ManualRenderApp from './ManualRenderAppRenderer';
21+
22+
ReactOnRails.registerRenderer({
23+
ManualRenderApp,
24+
});
25+
</pre>
26+
<p>spec/dummy/client/app/startup/clientRegistration.jsx</p>
27+
<br>
28+
</li>
29+
30+
<li>
31+
<p>A renderer is a function that accepts props, railsContext, domNodeId:</p>
32+
<pre>
33+
const ManualRenderApp = (props, railsContext, domNodeId) => {
34+
const reactElement = (
35+
<%= '<div>' %>
36+
<%= '<h1>Manual Render Example</h1>' %>
37+
<%= '<p>If you can see this, registerRenderer works.</p>' %>
38+
<%= '</div>' %>
39+
);
40+
41+
ReactDOM.render(reactElement, document.getElementById(domNodeId));
42+
};
43+
</pre>
44+
<p>spec/dummy/client/app/startup/ManualRenderAppRenderer.jsx</p>
45+
<br>
46+
</li>
47+
</ul>
48+
49+
<p>
50+
One possible use case for this is
51+
<a href="https://github.com/shakacode/react_on_rails/blob/master/docs/additional-reading/code-splitting.md"> Code Splitting</a>.
52+
</p>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import React from 'react';
2+
import ReactDOM from 'react-dom';
3+
4+
export default (props, railsContext, domNodeId) => {
5+
const reactElement = (
6+
<div>
7+
<h1>Manual Render Example</h1>
8+
<p>If you can see this, registerRenderer works.</p>
9+
</div>
10+
);
11+
12+
ReactDOM.render(reactElement, document.getElementById(domNodeId));
13+
};

spec/dummy/client/app/startup/clientRegistration.jsx

+5
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import ReduxSharedStoreApp from './ClientReduxSharedStoreApp';
1010
import RouterApp from './ClientRouterApp';
1111
import PureComponent from '../components/PureComponent';
1212
import CssModulesImagesFontsExample from '../components/CssModulesImagesFontsExample';
13+
import ManualRenderApp from './ManualRenderAppRenderer'
1314

1415
import SharedReduxStore from '../stores/SharedReduxStore';
1516

@@ -29,6 +30,10 @@ ReactOnRails.register({
2930
CssModulesImagesFontsExample,
3031
});
3132

33+
ReactOnRails.registerRenderer({
34+
ManualRenderApp,
35+
});
36+
3237
ReactOnRails.registerStore({
3338
SharedReduxStore,
3439
});

spec/dummy/config/routes.rb

+1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
get "server_side_redux_app" => "pages#server_side_redux_app"
2121
get "server_side_hello_world_with_options" => "pages#server_side_hello_world_with_options"
2222
get "server_side_redux_app_cached" => "pages#server_side_redux_app_cached"
23+
get "client_side_manual_render" => "pages#client_side_manual_render"
2324
get "render_js" => "pages#render_js"
2425
get "react_router(/*all)" => "react_router#index", as: :react_router
2526
get "pure_component" => "pages#pure_component"

spec/dummy/spec/features/integration_spec.rb

+10
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,16 @@ def change_text_expect_dom_selector(dom_selector)
143143
end
144144
end
145145

146+
feature "Manual Rendering", :js do
147+
subject { page }
148+
background { visit "/client_side_manual_render" }
149+
scenario "renderer function is called successfully" do
150+
header_text = page.find(:css, "h1").text
151+
expect(header_text).to eq("Manual Render Example")
152+
expect(subject).to have_text "registerRenderer works"
153+
end
154+
end
155+
146156
shared_examples "React Component Shared Store" do |url|
147157
subject { page }
148158
background { visit url }

0 commit comments

Comments
 (0)