我想为第三方组件的参数设置默认值。假设我有这个:
myBasePage.cs:
public class MyBasePage : ComponentBase
{
public IEnumerable MyData { get; set; }
}
myPage.razor:
@inherits MyBasePage
<ThirdPartyComponent Data="@MyData" />
由于ThirdPartyComponent
上的Data
是一个具有DataHasChanged()
虚拟方法的[Parameter]
,因此通过这样渲染blazor组件,我将获得单向绑定,如果我在页面上以编程方式更改MyData
,组件将更新这会很好用的
现在,假设我不能修改ThirdPartyComponent
,但我想根据我的基本页面在其中设置一些默认值。。。像这样:
myPage.razor:
@inherits MyBasePage
<MyDerivedComponent PageComponent="@this" />
myDerivedComponent.cs:
public class MyDerivedComponent : ThirdPartyComponent
{
[Parameter] public MyBasePage PageComponent { get; set; }
public override void OnInitialized()
{
/* Set other parameter defaults */
this.OtherParameter = 10;
/* Bind to Data, as if I was passing it as a parameter in the Razor template */
this.Data = PageComponent.MyData;
}
}
此行:
this.Data = PageComponent.MyData;
根本不创建绑定(如果我修改MyData
,blazor组件就不会更新(。有什么方法可以通过编程方式创建它吗?
注意:真正的ThirdPartyComponent
不仅包括大量的参数,还包括模板等。出于多种原因,我希望MyDerivedComponent
是派生类型,而不是";父组件";有一个ThirdPartyComponent
的孩子(如果可能的话(。
这应该有效:
public class MyDerivedComponent : ThirdPartyComponent
{
[Parameter] public MyBasePage PageComponent { get; set; }
public override void OnInitialized()
{
/* Set other parameter defaults */
this.OtherParameter = 10;
//this.Data = PageComponent.MyData;
}
}
protected override void OnParametersSet()
{
Data = Data ?? PageComponent?.MyData ; // determine priority
base.OnParametersSet();
}
CCD_ 11通知组件它具有新的参数。最派生的类可以在此处进行干预。
但当this.MyData
发生变化时,没有简单的解决方案,这对Blazor来说是看不到的。
有什么方法可以通过编程方式创建它吗当然,但这并不意味着你应该。
不应在组件代码中设置或操作参数。每当Renderer
调用SetParametersAsync
时,都会从外部设置参数。如果你在内部改变它们,你就会创造出两个版本的真相。