Вот мой код в интерфейсе:
@page "/"
@inject IJSRuntime JSRuntime
<ul>
@foreach (TestClass i in TestList)
{
if (i.Count != 0)
{
<li>
<button @onclick="() => RemoveVoid(i)" style="display:inline-block">Remove</button>
<p @ref="@i.Reference" style="display:inline-block">@(string.Format("{0}×{1}", @i.Name, i.Count))</p>
<button @onclick="() => AddVoid(i)" style="display:inline-block">Add</button>
</li>
}
}
</ul>
@code{
public class TestClass
{
public string Name;
public int Count=1;
public ElementReference Reference;
}
List<TestClass> TestList = new List<TestClass>()
{
new TestClass(){ Name="Apple" },
new TestClass(){ Name="Pear" },
new TestClass(){ Name="Banana" },
new TestClass(){ Name="Orange" },
new TestClass(){ Name="Melon" }
};
void AddVoid(TestClass i)
{
i.Count++;
StateHasChanged();
JSRuntime.InvokeVoidAsync("AppFunctions.Test", i.Reference);
}
void RemoveVoid(TestClass i)
{
i.Count--;
StateHasChanged();
}
}
А вот код на JS:
window.AppFunctions = {
Test: function (o) {
o.style.backgroundColor = "red";
setTimeout(function () {
o.style.backgroundColor = "white";
}, 2000);
}
};
Сначала убираем Грушу на 0.
А затем добавляем банан к 2.
Теперь вы обнаружите, что подсветка находится на апельсине, но не на банане.
Что в этом плохого?
1 ответ
Используйте @key для управления сохранением элементов и компонентов. При рендеринге списка элементов или компонентов и последующем изменении элементов или компонентов алгоритм сравнения Blazor должен решить, какие из предыдущих элементов или компонентов могут быть сохранены и как объекты модели должны сопоставляться с ними. . Обычно этот процесс происходит автоматически, и его можно игнорировать, но в некоторых случаях вы можете захотеть контролировать процесс.
Ваша проблема решается с помощью атрибута @key следующим образом:
<p @key="@i" @ref="@i.Reference" style="display:inline-block">@(string.Format("{0}×{1}", @i.Name, i.Count))</p>
Примечание: вызывать метод StateHasChanged не обязательно ...
Почему бы вам не удалить объекты TestClass из списка с помощью метода Remove?
Похожие вопросы
Новые вопросы
asp.net-core
ASP.NET Core — это компактная, компонуемая и кроссплатформенная платформа для создания веб-приложений и облачных приложений. Это полностью открытый исходный код на GitHub. Приложения ASP.NET Core можно запускать в Windows, Linux или macOS.