C# 在blazor中渲染之前,将一些数据从子组件发送到父组件
我正在尝试创建一个ChildComponent,在ParentComponent呈现自己之前将一些数据发送到ParentComponent。 首先,我尝试向所有ChildComponent发送父级引用,然后尝试使用参数值直接从Childs设置ParentComponent中的easy文本。 有人能告诉我为什么我们不工作吗? 谢谢大家的帮助 主文件:C# 在blazor中渲染之前,将一些数据从子组件发送到父组件,c#,blazor,C#,Blazor,我正在尝试创建一个ChildComponent,在ParentComponent呈现自己之前将一些数据发送到ParentComponent。 首先,我尝试向所有ChildComponent发送父级引用,然后尝试使用参数值直接从Childs设置ParentComponent中的easy文本。 有人能告诉我为什么我们不工作吗? 谢谢大家的帮助 主文件: @page "/test" <h3>TestTabeli</h3> <ParentCompone
@page "/test"
<h3>TestTabeli</h3>
<ParentComponent>
<ChildComponent Name="Child nr 1" />
<ChildComponent Name="Child nr 2" />
</ParentComponent>
@page”/test
TestTabeli
父文件:
<h3>ParentComponent</h3>
<CascadingValue Value="Parent" Name="ParentRef">
@body
</CascadingValue>
<br />
<p>My Childrens: @text</p>
@code {
public string text { get; set; } = "blaaaa";
public ParentComponent Parent { get; set; }
protected override void OnInitialized()
{
base.OnInitialized();
Parent = this;
}
public RenderFragment body { get; set; }
}
父组件
@身体
我的孩子们:@text @代码{ 公共字符串文本{get;set;}=“blaaaa”; 公共ParentComponent父级{get;set;} 受保护的覆盖无效OnInitialized() { base.OnInitialized(); 父=此; } 公共RenderFragment主体{get;set;} } 子组件:
<h3>ChildComponent</h3>
@code {
[Parameter]
public string Name { get; set; } = "Child Name";
[CascadingParameter(Name = "ParentRef")]
public ParentComponent parent { get; set; }
protected override void OnParametersSet()
{
base.OnParametersSet();
parent.text += "<br /> Hi! My name is: " + Name;
}
}
ChildComponent
@代码{
[参数]
公共字符串名称{get;set;}=“子名称”;
[CascadingParameter(Name=“ParentRef”)]
公共ParentComponent父级{get;set;}
受保护的覆盖无效OnParametersSet()
{
base.OnParametersSet();
parent.text+=“
嗨!我的名字是:”+name;
}
}
不能直接在parentcomponent内部渲染子组件。相反,您需要使用模板参数,通过指定一个或多个RenderFragment或RenderFragment类型的组件参数来定义模板化组件。渲染片段表示要渲染的UI段。RenderFragment接受一个类型参数,可以在调用呈现片段时指定该参数。大概是这样的:
@typeparam TItem
@foreach (var item in Items)
{
@ChildTemplate(item)
}
@代码{
[Parameter]
public RenderFragment<TItem> ChildTemplate { get; set; }
[Parameter]
public IReadOnlyList<TItem> Items { get; set; }
[参数]
公共RenderFragment子模板{get;set;}
[参数]
公共IReadOnlyList项{get;set;}
}
可以使用与参数名称匹配的子元素指定模板参数。
看看
创建一个ChildComponent,将一些数据发送到ParentComponent,然后再发送到ParentComponent
会自己出现的
这是不可能的。女人在出生前能不能生孩子。但你稍后会看到,我们可以欺骗人类的眼睛相信这是可能的。但是你的问题是为什么你的代码不起作用,对吗
<CascadingValue Value="Parent" Name="ParentRef">
@body
</CascadingValue>
请注意,必须添加[Parameter]属性
对代码进行一些附加更改后,它可能会起作用:
剃须刀
@page”/ParentComponent
父组件
@儿童内容
我的孩子们:@text
@代码{
公共字符串文本{get;set;}=“blaaaa”;
//公共ParentComponent父级{get;set;}
受保护的覆盖无效OnInitialized()
{
base.OnInitialized();
//父=此;
}
[参数]
公共RenderFragment ChildContent{get;set;}
}
儿童剃须刀
@Name
@代码{
[参数]
公共字符串名称{get;set;}=“子名称”;
[CascadingParameter(Name=“ParentRef”)]
公共ParentComponent父级{get;set;}
受保护的覆盖无效OnParametersSet()
{
parent.text+=“嗨!我的名字是:”+name;
}
}
复制并运行该代码。请注意,“文本”属性中的文本不会更改。它将始终显示字符串“blaaaa”。解决方法是使用EventCallback将新值传递给Text属性,并重新呈现父组件
一般来说,使用CascadingValue组件是不合适的。并且不应将对父组件的引用传递给子组件。您通常应该使用组件参数和事件(EventCallback“delegate”)来处理父级和子级之间的关系
[Parameter]
public RenderFragment ChildContent { get; set; }
@page "/ParentComponent"
<h3>ParentComponent</h3>
<CascadingValue Value="this" Name="ParentRef">
@ChildContent
</CascadingValue>
<br />
<p>My Childrens: @text</p>
@code {
public string text { get; set; } = "blaaaa";
// public ParentComponent Parent { get; set; }
protected override void OnInitialized()
{
base.OnInitialized();
// Parent = this;
}
[Parameter]
public RenderFragment ChildContent { get; set; }
}
<h3>@Name</h3>
@code {
[Parameter]
public string Name { get; set; } = "Child Name";
[CascadingParameter(Name = "ParentRef")]
public ParentComponent parent { get; set; }
protected override void OnParametersSet()
{
parent.text += "Hi! My name is: " + Name;
}
}