假设我有一个这样的组件:
<input type="text"/>
<div class="completion-list">
...
</div>
当我输入文本时,完成列表会更新(使用数据库)。此解决方案的性能足够,但是,通过更新完成列表input
元素也将进行更新,这会导致效果像系统正在与用户键入作斗争。
有时候(尤其是在重新启动该应用程序时),打字体验是完美的-因此,我打字时,文本会立即显示,然后一段时间后更新完成列表。
但是当我玩了一段时间后,打字变得越来越迟。
我100%确信在键入过程中不会将绑定设置值更新为代码中的输入。仅当从调用方传递的值确实与JS确定的值不同时,才在SetParametersAsync()
上设置输入元素的值。
输入无法按预期工作的唯一原因是Blazor在重新渲染我的整个自动完成组件时试图重绘它。
我已经尝试通过对更改的项目数据调用诸如CompletionList.StateChanged()
之类的内容来仅更新完成列表。如我所料-它极大地缓解了该问题-但是有一个问题,因为我看到完成列表“后面有一个字符”。我看到的每个击键列表都应该像上一个一样。因此,当我仅调用StateChanged()
时,我会看到当前列表,但是在键入时会出现延迟和断断续续的情况,当我用CompletionList.StateChanged()
替换更新时,键入会更好,但状态落后一个字符。
您对改善性能和响应能力有何想法?我试图将数据库查询推送给后台工作人员,但并没有太大帮助。实际上,这会使整个响应速度降低。
顺便说一句,我有一个疯狂的主意:如果我不使用Blazor“绘制”元素,如果我使用JS interop传递数据而只是“绘制” JS中的所有内容,该怎么办?值得尝试,还是疯了?
最重要的是:我能否使Blazor的输入元素“不可触摸”?就像它可以更新所需内容一样,但是它不能重绘输入元素。可能吗?我想如果我将输入内容输入一个单独的组件中,也许可以覆盖它的ShouldRender()
,但这看起来像是个疯狂的黑客。