File tree 6 files changed +84
-0
lines changed
6 files changed +84
-0
lines changed Original file line number Diff line number Diff line change 56
56
< li >
57
57
<%= link_to "One Page with Many Examples at Once" , root_path %>
58
58
</ li >
59
+ < li >
60
+ <%= link_to "Manually Rendered Component" , client_side_manual_render_path %>
61
+ </ li >
59
62
< li >
60
63
<%= link_to "React Router" , react_router_path %>
61
64
</ li >
Original file line number Diff line number Diff line change
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 number Diff line number Diff line change
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
+ } ;
Original file line number Diff line number Diff line change @@ -10,6 +10,7 @@ import ReduxSharedStoreApp from './ClientReduxSharedStoreApp';
10
10
import RouterApp from './ClientRouterApp' ;
11
11
import PureComponent from '../components/PureComponent' ;
12
12
import CssModulesImagesFontsExample from '../components/CssModulesImagesFontsExample' ;
13
+ import ManualRenderApp from './ManualRenderAppRenderer'
13
14
14
15
import SharedReduxStore from '../stores/SharedReduxStore' ;
15
16
@@ -29,6 +30,10 @@ ReactOnRails.register({
29
30
CssModulesImagesFontsExample,
30
31
} ) ;
31
32
33
+ ReactOnRails . registerRenderer ( {
34
+ ManualRenderApp,
35
+ } ) ;
36
+
32
37
ReactOnRails . registerStore ( {
33
38
SharedReduxStore,
34
39
} ) ;
Original file line number Diff line number Diff line change 20
20
get "server_side_redux_app" => "pages#server_side_redux_app"
21
21
get "server_side_hello_world_with_options" => "pages#server_side_hello_world_with_options"
22
22
get "server_side_redux_app_cached" => "pages#server_side_redux_app_cached"
23
+ get "client_side_manual_render" => "pages#client_side_manual_render"
23
24
get "render_js" => "pages#render_js"
24
25
get "react_router(/*all)" => "react_router#index" , as : :react_router
25
26
get "pure_component" => "pages#pure_component"
Original file line number Diff line number Diff line change @@ -143,6 +143,16 @@ def change_text_expect_dom_selector(dom_selector)
143
143
end
144
144
end
145
145
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
+
146
156
shared_examples "React Component Shared Store" do |url |
147
157
subject { page }
148
158
background { visit url }
You can’t perform that action at this time.
0 commit comments