Вот мой код в интерфейсе:

    @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.

enter image description here

Теперь вы обнаружите, что подсветка находится на апельсине, но не на банане.

Что в этом плохого?

0
Melon NG 1 Авг 2020 в 12:30

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?

1
enet 1 Авг 2020 в 17:14