如何解决从页面或组件将blazor RenderFragment模板化为布局 设置器用法
我想在我的布局页面中使用可定制的内容。我尝试在布局中添加一个renderfragment参数,并在组件中添加具有相同名称的化妆,但是它并未在布局中呈现
例如
layout.razor:
<header>
@HeaderContent
</header>
@body
@code
{
[Parameter] public RenderFragment HeaderContent { get; set; }
}
component.razor:
<HeaderContent>
<p>my page specific content</p>
</HeaderContnt>
,但是headercontent呈现在正文中。任何人都可以解释如何执行此操作,或者为什么不能在布局中进行解释。我发现可行的唯一方法是this,但是如果我更改渲染片段中的绑定参数,它将无法刷新内容
解决方法
- 灵活的内容
- 清除导航
- 更新而无需进行任何连接
MainLayout.razor.cs
@inherits LayoutComponentBase
...
<div class="top-row px-4">
@headerContent
</div>
<div class="content px-4">
<CascadingValue Value="this">
@Body
</CascadingValue>
</div>
...
@code {
RenderFragment headerContent => setHeader?.ChildContent;
SetHeader setHeader;
public void SetHeader(SetHeader setHeader)
{
this.setHeader = setHeader;
Update();
}
public void Update() => StateHasChanged();
}
设置器
public class SetHeader : ComponentBase,IDisposable
{
[CascadingParameter]
public MainLayout MainLayout { get; set; }
[Parameter]
public RenderFragment ChildContent { get; set; }
protected override void OnInitialized()
{
MainLayout.SetHeader(this);
base.OnInitialized();
}
protected override bool ShouldRender()
{
var shouldRender = base.ShouldRender();
if (shouldRender)
{
MainLayout.Update();
}
return base.ShouldRender();
}
public void Dispose()
{
MainLayout?.SetHeader(null);
}
}
用法
<SetHeader>
<p>Current count: @currentCount</p>
</SetHeader>
,
先前的答案非常接近,但对我而言不起作用。 这就是我的解决方法:
MainLayout:
<div class="main">
<div class="top-row px-4">
@headerContent
@*<a href="https://docs.microsoft.com/aspnet/" target="_blank">About</a>*@
</div>
<div class="content px-4">
<CascadingValue Value="this">
@Body
</CascadingValue>
</div>
</div>
@code {
RenderFragment headerContent => setHeader?.ChildContent;
SetHeader setHeader;
public void SetHeader(SetHeader setHeader)
{
if (setHeader == null) return;
this.setHeader = setHeader;
this.setHeader.OnChange += StateHasChanged;
}
}
SetHeader:
public class SetHeader : ComponentBase,IDisposable
{
[CascadingParameter] public MainLayout MainLayout { get; set; }
[Parameter] public RenderFragment ChildContent { get; set; }
public event Action OnChange;
protected override void OnInitialized()
{
MainLayout.SetHeader(this);
Update();
base.OnInitialized();
}
public void Update()
{
OnChange?.Invoke();
StateHasChanged();
}
public void Dispose()
{
MainLayout?.SetHeader(null);
}
}
用于任何剃须刀页面:
<SetHeader @ref="@setHeader">
<p>Current count: @currentCount</p>
<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
</SetHeader>
进入该页面的代码:
SetHeader setHeader;
private int currentCount = 0;
private void IncrementCount()
{
currentCount++;
setHeader.Update();
}
现在只有一个问题仍然存在...当您更改页面时,必须将该页面空白以清除它
,布赖恩·帕克 (Brian Parker) 的回答非常适合我。但是,我想要两个标题片段,所以我不能使用默认的 ChildContent 命名。
主布局:
<div class="main">
<div class="top-row px-4">
@FirstHeader
</div>
<div class="top-row px-4">
@SecondHeader
</div>
<div class="content px-4">
<CascadingValue Value="this">
@Body
</CascadingValue>
</div>
</div>
@code
{
RenderFragment FirstHeader => _setHeader?.FirstHeaderTemplate;
RenderFragment SecondHeader => _setHeader?.SecondHeaderTemplate;
SetHeader _setHeader;
public void SetHeader(SetHeader setHeader)
{
_setHeader = setHeader;
Update();
}
public void Update() => StateHasChanged();
}
SetHeader 类:
public class SetHeader : ComponentBase,IDisposable
{
[CascadingParameter]
public MainLayout MainLayout { get; set; }
[Parameter]
public RenderFragment FirstHeaderTemplate { get; set; }
[Parameter]
public RenderFragment SecondHeaderTemplate { get; set; }
protected override void OnInitialized()
{
MainLayout.SetHeader(this);
base.OnInitialized();
}
protected override bool ShouldRender()
{
var shouldRender = base.ShouldRender();
if (shouldRender)
{
MainLayout.Update();
}
return base.ShouldRender();
}
public void Dispose()
{
MainLayout?.SetHeader(null);
}
}
用法:
<SetHeader>
<FirstHeaderTemplate>
<LoginDisplay />
</FirstHeaderTemplate>
<SecondHeaderTemplate>
<p>Current count: @currentCount</p>
</SecondHeaderTemplate>
</SetHeader>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。