这个问题花了我几个小时才找到,我终于能够整理一个示例应用程序来演示我遇到的问题。这似乎是一个非常奇怪的“错误?”。如果需要更多说明,请发表评论。
问题:
当具有 1+ 行和 28+ 列的 MudDataGrid 位于设置了 onkeydown AND onkeyup 事件的 div 内时,它将导致滞后。对于我的情况,快速输入文本区域将开始滞后,并且文本将以块的形式显示。
情况/背景:
所以我在 div 中有一个 MudDataGrid,配置了 onkeydown 和 onkeyup 事件。我还有一个文本区域,用户可以在其中输入文本。当 DataGrid 有 28 列以上时,将导致文本区域中的输入滞后。 DataGrid 的列越多,它就会变得越滞后。在我的测试中,我开始在 28 列左右看到这个问题。
如果我删除 onkeydown 和 onkeyup 事件并填充 DataGrid,它不会滞后。如果我删除 DataGrid 并保留事件,它不会滞后。仅当 DataGrid 有 28 列以上且其内部设置了 onkeydown 和 onkeyup 事件的 div 时,它才会滞后。
重现此问题的步骤
其他:
代码:
<div @onkeydown="KeyDown" @onkeyup="KeyUp">
<div style="height: 20vh; width: 100vw; display:flex; flex-direction: column; align-items: center; justify-content: center;">
<textarea style="width: 70vw; border: 2px solid black;"></textarea>
<button class="btn btn-primary" @onclick="AddData">Add Data</button>
</div>
<div style="height:60vh; width: 100vw;">
@if (Data.Count > 0)
{
<MudDataGrid T="IDictionary<string, object>" Items="@Data">
<Columns>
@foreach (var col in Columns)
{
<Column T="IDictionary<string, object>" FieldType="@col.Value" Field="@col.Key" Title="@col.Key" />
}
</Columns>
</MudDataGrid>
}
</div>
</div>
@code {
Dictionary<String, Type> Columns { get; set; } = new Dictionary<String, Type>();
List<Dictionary<String, Object>> Data { get; set; } = new List<Dictionary<String, Object>>();
private void KeyUp()
{
}
private void KeyDown()
{
}
private void AddData()
{
int ColumnCount = 40;
Dictionary<string, object> Row1 = new Dictionary<string, object>();
Dictionary<string, object> Row2 = new Dictionary<string, object>();
for (int i = 1; i <= ColumnCount; i++)
{
Columns.Add($"Col_{i}", typeof(string));
Row1.Add($"Col_{i}", $"TestValue1_{i}");
Row2.Add($"Col_{i}", $"TestValue2_{i}");
}
Data.Add(Row1);
Data.Add(Row2);
}
}
在 MudBlazor 团队的帮助下,我终于找到了解决方案。我需要像这样设置我的包含 div:
<div @onkeydown="EventUtil.AsNonRenderingEventHandler<KeyboardEventArgs>(KeyDown)" @onkeyup="EventUtil.AsNonRenderingEventHandler<KeyboardEventArgs>(KeyUp)">