Skip to content

Commit a6d40fe

Browse files
React.Router ReactDOM.hydrate with ClientOnly reactjs#1140 (reactjs#1142)
* Added UseServerSideRendering and ClientOnly check to ReactRouterComponent * Small changes * Use auto-property for ClientOnly Co-authored-by: Dustin Masters <[email protected]>
1 parent ebc08ce commit a6d40fe

File tree

4 files changed

+54
-20
lines changed

4 files changed

+54
-20
lines changed

src/React.Router/ReactEnvironmentExtensions.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ public static ReactRouterComponent CreateRouterComponent<T>(
4343
)
4444
{
4545
Props = props,
46+
ClientOnly = clientOnly,
4647
};
4748

4849
return env.CreateComponent(component, clientOnly) as ReactRouterComponent;

src/React.Router/ReactRouterComponent.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,8 @@ public override void RenderJavaScript(TextWriter writer, bool waitForDOMContentL
102102
writer.Write("window.addEventListener('DOMContentLoaded', function() {");
103103
}
104104

105-
writer.Write("ReactDOM.hydrate(");
105+
writer.Write(
106+
!_configuration.UseServerSideRendering || ClientOnly ? "ReactDOM.render(" : "ReactDOM.hydrate(");
106107
base.WriteComponentInitialiser(writer);
107108
writer.Write(", document.getElementById(\"");
108109
writer.Write(ContainerId);

tests/React.Tests/Router/HtmlHelperExtensionsTest.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,8 @@ class ReactRouterMocks
9292
public ReactRouterMocks(
9393
Mock<IReactSiteConfiguration> conf,
9494
Mock<IReactEnvironment> env,
95-
Mock<IReactIdGenerator> idGenerator
95+
Mock<IReactIdGenerator> idGenerator,
96+
bool clientOnly = false
9697
)
9798
{
9899
config = conf;
@@ -126,7 +127,7 @@ public void EngineIsReturnedToPoolAfterRender()
126127
var config = ConfigureMockConfiguration();
127128
var environment = ConfigureMockEnvironment();
128129
var reactIdGenerator = ConfigureReactIdGenerator();
129-
var routerMocks = new ReactRouterMocks(config, environment, reactIdGenerator);
130+
var routerMocks = new ReactRouterMocks(config, environment, reactIdGenerator, true);
130131
var htmlHelperMock = new HtmlHelperMocks();
131132

132133
environment.Verify(x => x.ReturnEngineToPool(), Times.Never);
@@ -150,7 +151,7 @@ public void ReactWithClientOnlyTrueShouldCallRenderHtmlWithTrue()
150151
var htmlHelperMock = new HtmlHelperMocks();
151152
var environment = ConfigureMockEnvironment();
152153
var reactIdGenerator = ConfigureReactIdGenerator();
153-
var routerMocks = new ReactRouterMocks(config, environment, reactIdGenerator);
154+
var routerMocks = new ReactRouterMocks(config, environment, reactIdGenerator, true);
154155

155156
var result = HtmlHelperExtensions.ReactRouter(
156157
htmlHelper: htmlHelperMock.htmlHelper.Object,

tests/React.Tests/Router/ReactRouterComponentTest.cs

Lines changed: 47 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,50 +8,81 @@
88

99
using Moq;
1010
using Xunit;
11-
using React.Exceptions;
1211
using React.Router;
13-
using React.Tests.Core;
1412

1513
namespace React.Tests.Router
1614
{
1715
public class ReactRouterComponentTest
1816
{
19-
[Fact]
20-
public void RenderJavaScriptShouldNotIncludeContextOrPath()
17+
[Theory]
18+
[InlineData(true, true)]
19+
[InlineData(true, false)]
20+
[InlineData(false, true)]
21+
[InlineData(false, false)]
22+
public void RenderJavaScriptShouldNotIncludeContextOrPath(bool clientOnly, bool useServerSideRendering)
2123
{
2224
var environment = new Mock<IReactEnvironment>();
2325
var config = new Mock<IReactSiteConfiguration>();
26+
config.Setup(x => x.UseServerSideRendering).Returns(useServerSideRendering);
2427
var reactIdGenerator = new Mock<IReactIdGenerator>();
2528

2629
var component = new ReactRouterComponent(environment.Object, config.Object, reactIdGenerator.Object, "Foo", "container", "/bar")
2730
{
28-
Props = new { hello = "World" }
31+
Props = new { hello = "World" },
32+
ClientOnly = clientOnly,
2933
};
3034
var result = component.RenderJavaScript(false);
3135

32-
Assert.Equal(
33-
@"ReactDOM.hydrate(React.createElement(Foo, {""hello"":""World""}), document.getElementById(""container""))",
34-
result
35-
);
36+
if (clientOnly || !useServerSideRendering)
37+
{
38+
Assert.Equal(
39+
@"ReactDOM.render(React.createElement(Foo, {""hello"":""World""}), document.getElementById(""container""))",
40+
result
41+
);
42+
}
43+
else
44+
{
45+
Assert.Equal(
46+
@"ReactDOM.hydrate(React.createElement(Foo, {""hello"":""World""}), document.getElementById(""container""))",
47+
result
48+
);
49+
}
50+
3651
}
3752

38-
[Fact]
39-
public void RenderJavaScriptShouldHandleWaitForContentLoad()
53+
[Theory]
54+
[InlineData(true, true)]
55+
[InlineData(true, false)]
56+
[InlineData(false, true)]
57+
[InlineData(false, false)]
58+
public void RenderJavaScriptShouldHandleWaitForContentLoad(bool clientOnly, bool useServerSideRendering)
4059
{
4160
var environment = new Mock<IReactEnvironment>();
4261
var config = new Mock<IReactSiteConfiguration>();
62+
config.Setup(x => x.UseServerSideRendering).Returns(useServerSideRendering);
4363
var reactIdGenerator = new Mock<IReactIdGenerator>();
4464

4565
var component = new ReactRouterComponent(environment.Object, config.Object, reactIdGenerator.Object, "Foo", "container", "/bar")
4666
{
47-
Props = new { hello = "World" }
67+
Props = new { hello = "World" },
68+
ClientOnly = clientOnly
4869
};
4970
var result = component.RenderJavaScript(true);
5071

51-
Assert.Equal(
52-
@"window.addEventListener('DOMContentLoaded', function() {ReactDOM.hydrate(React.createElement(Foo, {""hello"":""World""}), document.getElementById(""container""))});",
53-
result
54-
);
72+
if (clientOnly || !useServerSideRendering)
73+
{
74+
Assert.Equal(
75+
@"window.addEventListener('DOMContentLoaded', function() {ReactDOM.render(React.createElement(Foo, {""hello"":""World""}), document.getElementById(""container""))});",
76+
result
77+
);
78+
}
79+
else
80+
{
81+
Assert.Equal(
82+
@"window.addEventListener('DOMContentLoaded', function() {ReactDOM.hydrate(React.createElement(Foo, {""hello"":""World""}), document.getElementById(""container""))});",
83+
result
84+
);
85+
}
5586
}
5687
}
5788
}

0 commit comments

Comments
 (0)