我正在尝试创建由与父组件绑定的数据相关的较小组件组成的组件,但我无法更新这些子组件中的变量。这样做的想法是能够在其他组件中重用它们。
我将展示一个小例子。
当父组件被称为OnInitializedAsync添加值到列表,这是显示在子组件2正确,但如果我添加一个新的元素到该列表在其他子组件1列表永远不会在视图中更新(数据已在数据库中更新)
父组件(基列表变量)
<CascadingValue Value="@thelist">
<Child1></child1>
<Child2></child2>
<CascadingValue>
@code {
private List<thetype> thelist { get; set; }
protected override async Task OnInitializedAsync()
{
thelist = service.loadvalues()
}
}
子组件1 (add values to list)
Button UpdateList
@code {
[CascadingParameter]
public List<thetype> thelist { get; set; }
private async Task UpdateList()
{
thislist changed
}
}
子组件2 (show list)
Show list
@code {
[CascadingParameter]
public List<thetype> thelist { get; set; }
}
我也尝试过使用EventCallback,这是我用来传递参数的方式,但这种方式也不起作用,是一个参数与多个级联组件共享。
<Child1 thelist="@thelist"></child1>
<Child2 thelist="@thelist"></child2>
[Parameter]
public List<thetype> thelist{ get; set; }
[Parameter]
public EventCallback<ChangeEventArgs> thelistChanged { get; set; }
和使用StateHasChanged,但结果是一样的。
通过这两种方式,更新后的列表都可以用新值显示在父组件中,但不能显示在子列表组件中。
我希望你明白我想问什么。我找到的所有帖子和文章都是关于在组件之间传递参数的,但这并不是我真正的问题。我希望当一个组件通知父组件发生更改时,该更改会被复制到该父组件的所有后代组件中。
谢谢。
我已经找到了这个解决方案的工作链接解决方案
使用动作参数向父组件发出某个参数已更改的警报。这是一个解决方案和工作,但我仍然不明白为什么我的代码不与EventCallback工作。
这里我将它应用到我的例子
父组件(基列表变量)
<CascadingValue Value="@thelist">
<Child1 InvokeChange="@UpdateTheList"></child1>
<Child2></child2>
<CascadingValue>
@code {
private List<thetype> thelist { get; set; }
protected override async Task OnInitializedAsync()
{
thelist = service.loadvalues()
}
private void UpdateTheList(List<thetype> updatedList)
{
thelist = updatedList;
StateHasChanged();
}
}
子组件1 (add values to list)
Button UpdateList
@code {
[Parameter]
public Action<List<thetype>> InvokeChange { get; set; }
[CascadingParameter]
public List<thetype> thelist { get; set; }
private async Task UpdateList()
{
thislist changed;
InvokeChange?.Invoke(thelist);
}
}
子组件2 (show list)
Show list
@code {
[CascadingParameter]
public List<thetype> thelist { get; set; }
}