diff --git a/src/Microsoft.AspNetCore.Blazor/Components/BlazorComponent.cs b/src/Microsoft.AspNetCore.Blazor/Components/BlazorComponent.cs index 332dc4043f..3e879515ec 100644 --- a/src/Microsoft.AspNetCore.Blazor/Components/BlazorComponent.cs +++ b/src/Microsoft.AspNetCore.Blazor/Components/BlazorComponent.cs @@ -20,14 +20,14 @@ namespace Microsoft.AspNetCore.Blazor.Components { public const string BuildRenderTreeMethodName = nameof(BuildRenderTree); - private readonly Action _renderAction; + private readonly RenderFragment _renderFragment; private RenderHandle _renderHandle; private bool _hasNeverRendered = true; private bool _hasPendingQueuedRender; public BlazorComponent() { - _renderAction = BuildRenderTree; + _renderFragment = BuildRenderTree; } /// @@ -64,7 +64,7 @@ namespace Microsoft.AspNetCore.Blazor.Components if (_hasNeverRendered || ShouldRender()) { _hasPendingQueuedRender = true; - _renderHandle.Render(_renderAction); + _renderHandle.Render(_renderFragment); } } diff --git a/src/Microsoft.AspNetCore.Blazor/Components/RenderHandle.cs b/src/Microsoft.AspNetCore.Blazor/Components/RenderHandle.cs index 600380654a..13d3b22804 100644 --- a/src/Microsoft.AspNetCore.Blazor/Components/RenderHandle.cs +++ b/src/Microsoft.AspNetCore.Blazor/Components/RenderHandle.cs @@ -31,14 +31,15 @@ namespace Microsoft.AspNetCore.Blazor.Components /// /// Notifies the renderer that the component should be rendered. /// - public void Render(Action renderAction) + /// The content that should be rendered. + public void Render(RenderFragment renderFragment) { if (_renderer == null) { throw new InvalidOperationException("The render handle is not yet assigned."); } - _renderer.AddToRenderQueue(new RenderQueueEntry(_componentId, renderAction)); + _renderer.AddToRenderQueue(new RenderQueueEntry(_componentId, renderFragment)); } } } diff --git a/src/Microsoft.AspNetCore.Blazor/RenderTree/RenderFragment.cs b/src/Microsoft.AspNetCore.Blazor/RenderTree/RenderFragment.cs new file mode 100644 index 0000000000..6b206bfc20 --- /dev/null +++ b/src/Microsoft.AspNetCore.Blazor/RenderTree/RenderFragment.cs @@ -0,0 +1,12 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace Microsoft.AspNetCore.Blazor.RenderTree +{ + /// + /// Represents a segment of UI content, implemented as a delegate that + /// writes the content to a . + /// + /// The to which the content should be written. + public delegate void RenderFragment(RenderTreeBuilder builder); +} diff --git a/src/Microsoft.AspNetCore.Blazor/Rendering/ComponentState.cs b/src/Microsoft.AspNetCore.Blazor/Rendering/ComponentState.cs index e52ad0be19..6b4bea78e4 100644 --- a/src/Microsoft.AspNetCore.Blazor/Rendering/ComponentState.cs +++ b/src/Microsoft.AspNetCore.Blazor/Rendering/ComponentState.cs @@ -35,13 +35,13 @@ namespace Microsoft.AspNetCore.Blazor.Rendering _renderTreeBuilderPrevious = new RenderTreeBuilder(renderer); } - public void RenderIntoBatch(RenderBatchBuilder batchBuilder, Action renderAction) + public void RenderIntoBatch(RenderBatchBuilder batchBuilder, RenderFragment renderFragment) { // Swap the old and new tree builders (_renderTreeBuilderCurrent, _renderTreeBuilderPrevious) = (_renderTreeBuilderPrevious, _renderTreeBuilderCurrent); _renderTreeBuilderCurrent.Clear(); - renderAction(_renderTreeBuilderCurrent); + renderFragment(_renderTreeBuilderCurrent); var diff = RenderTreeDiffBuilder.ComputeDiff( _renderer, diff --git a/src/Microsoft.AspNetCore.Blazor/Rendering/RenderQueueEntry.cs b/src/Microsoft.AspNetCore.Blazor/Rendering/RenderQueueEntry.cs index 2d5e611318..b6e1a6cb98 100644 --- a/src/Microsoft.AspNetCore.Blazor/Rendering/RenderQueueEntry.cs +++ b/src/Microsoft.AspNetCore.Blazor/Rendering/RenderQueueEntry.cs @@ -9,12 +9,12 @@ namespace Microsoft.AspNetCore.Blazor.Rendering internal readonly struct RenderQueueEntry { public readonly int ComponentId; - public readonly Action RenderAction; + public readonly RenderFragment RenderFragment; - public RenderQueueEntry(int componentId, Action renderAction) + public RenderQueueEntry(int componentId, RenderFragment renderFragment) { ComponentId = componentId; - RenderAction = renderAction ?? throw new ArgumentNullException(nameof(renderAction)); + RenderFragment = renderFragment ?? throw new ArgumentNullException(nameof(renderFragment)); } } } diff --git a/src/Microsoft.AspNetCore.Blazor/Rendering/Renderer.cs b/src/Microsoft.AspNetCore.Blazor/Rendering/Renderer.cs index 583596d252..e746696d15 100644 --- a/src/Microsoft.AspNetCore.Blazor/Rendering/Renderer.cs +++ b/src/Microsoft.AspNetCore.Blazor/Rendering/Renderer.cs @@ -145,7 +145,7 @@ namespace Microsoft.AspNetCore.Blazor.Rendering { var componentId = renderQueueEntry.ComponentId; GetRequiredComponentState(componentId) - .RenderIntoBatch(_batchBuilder, renderQueueEntry.RenderAction); + .RenderIntoBatch(_batchBuilder, renderQueueEntry.RenderFragment); // Process disposal queue now in case it causes further component renders to be enqueued while (_batchBuilder.ComponentDisposalQueue.Count > 0) diff --git a/test/Microsoft.AspNetCore.Blazor.Test/RenderTreeDiffBuilderTest.cs b/test/Microsoft.AspNetCore.Blazor.Test/RenderTreeDiffBuilderTest.cs index 331233a90f..5822f29a29 100644 --- a/test/Microsoft.AspNetCore.Blazor.Test/RenderTreeDiffBuilderTest.cs +++ b/test/Microsoft.AspNetCore.Blazor.Test/RenderTreeDiffBuilderTest.cs @@ -27,11 +27,11 @@ namespace Microsoft.AspNetCore.Blazor.Test [Theory] [MemberData(nameof(RecognizesEquivalentFramesAsSameCases))] - public void RecognizesEquivalentFramesAsSame(Action appendAction) + public void RecognizesEquivalentFramesAsSame(RenderFragment appendFragment) { // Arrange - appendAction(oldTree); - appendAction(newTree); + appendFragment(oldTree); + appendFragment(newTree); // Act var (result, referenceFrames) = GetSingleUpdatedComponent(initializeFromFrames: true); @@ -41,7 +41,7 @@ namespace Microsoft.AspNetCore.Blazor.Test } public static IEnumerable RecognizesEquivalentFramesAsSameCases() - => new Action[] + => new RenderFragment[] { builder => builder.AddContent(0, "Hello"), builder => builder.OpenElement(0, "Some Element"), diff --git a/test/Microsoft.AspNetCore.Blazor.Test/RendererTest.cs b/test/Microsoft.AspNetCore.Blazor.Test/RendererTest.cs index c2caab5346..6d396fed6e 100644 --- a/test/Microsoft.AspNetCore.Blazor.Test/RendererTest.cs +++ b/test/Microsoft.AspNetCore.Blazor.Test/RendererTest.cs @@ -790,11 +790,11 @@ namespace Microsoft.AspNetCore.Blazor.Test private class TestComponent : IComponent { private RenderHandle _renderHandle; - private Action _renderAction; + private RenderFragment _renderFragment; - public TestComponent(Action renderAction) + public TestComponent(RenderFragment renderFragment) { - _renderAction = renderAction; + _renderFragment = renderFragment; } public void Init(RenderHandle renderHandle) @@ -806,7 +806,7 @@ namespace Microsoft.AspNetCore.Blazor.Test => TriggerRender(); public void TriggerRender() - => _renderHandle.Render(_renderAction); + => _renderHandle.Render(_renderFragment); } private class MessageComponent : AutoRenderComponent diff --git a/test/testapps/BasicTestApp/RenderBlockComponent.cs b/test/testapps/BasicTestApp/RenderBlockComponent.cs index e224cbd9f2..aaf454e288 100644 --- a/test/testapps/BasicTestApp/RenderBlockComponent.cs +++ b/test/testapps/BasicTestApp/RenderBlockComponent.cs @@ -12,16 +12,13 @@ namespace BasicTestApp private RenderHandle _renderHandle; private bool _showRegion; - // Important: Notice that the sequence numbers inside the region are higher + // Important: Notice that the sequence numbers inside the fragment are higher // that the sequence numbers outside it. Without the region delimiter, the // differencer would think the following nodes had been removed, then the // region was inserted, followed by a new copy of the following nodes. That's // not as efficient and wouldn't preserve focus etc. - private Action _exampleRegion = builder => + private RenderFragment _exampleContent = builder => { - // TODO: Support some kind of RenderBlock primitive - // which is an Action. Can use the - // same type name for RenderHandle.Render's arg. builder.OpenElement(100, "p"); builder.AddAttribute(101, "name", "region-element"); builder.AddAttribute(102, "style", "color: red"); @@ -52,7 +49,7 @@ namespace BasicTestApp if (_showRegion) { builder.OpenRegion(3); - _exampleRegion(builder); + _exampleContent(builder); builder.CloseRegion(); }