.net core Blazor StateHasChanged不会将组件重置为其初始状态

.net core Blazor StateHasChanged不会将组件重置为其初始状态,.net-core,razor,blazor,.net Core,Razor,Blazor,我正在使用Blazor服务器页面。我需要重置为组件的初始状态onClick。我使用的是StateHasChanged(),单击update按钮会调用它,但不会将input字段重置为初始值。 下面给出了我的组件 @using DataAcessLibrary; @using TableMaintenance.Models @using TableMaintenance.Data; @if (dr != null) { int count = 0; <tr> <

我正在使用Blazor服务器页面。我需要重置为组件的初始状态
onClick
。我使用的是
StateHasChanged()
,单击
update
按钮会调用它,但不会将
input
字段重置为初始值。 下面给出了我的组件

@using DataAcessLibrary;
@using TableMaintenance.Models
@using TableMaintenance.Data;

@if (dr != null)
{
    int count = 0;
<tr>

    <td style="padding:0px"><button type="button" class="btn btn-link btn-sm" style="padding:0px" @onclick="@DeleteRow"><img src="/images/x-square.svg" /></button></td>
    @foreach (var item in dr.ItemArray.Where((a, b) => ColDisplayIndex.Contains(b)))
    {
        string id = ColumnsList[ColDisplayIndex[count++]].ToString();
      
        <td style="padding:0px;">
            <DataRowInput Id="@id" Input=@(item.ToString()) OnChangeDropDown="@AddDropDownValue" OnChangeInput="@AddInputValue" />
        </td>
        <td>
            <input type="text" />
        </td>
    }
<td  style="padding:0px">
    <button style="padding:3px;margin:0px" type="button" class="btn btn-light btn-sm" @onclick="@UpdateRow">update</button>
</td>
</tr>
}

StateHasChanged()可以这样做吗?或者还有其他方法吗?

除非我遗漏了什么,否则Update()函数除了调用StateHasChanged()之外什么都不做

我想你可能误解了Blazor中“重新渲染”的工作原理。它不会尝试从原始状态重新渲染组件。这是一个函数,它让Blazor知道某些东西应该在视觉上发生了变化

在大多数情况下,这应该自动发生,而无需专门调用StateHasChanged()

要执行您试图执行的操作,可以将输入绑定到字符串,然后让更新函数将其重置为默认值。它看起来像这样:
(请注意,我没有仔细检查语法。这是一个示例。)


重置
@代码{
私有字符串myString{get;set;}
私有void resetMyString(){
myString=“”;
}
}
编辑:
我现在明白了,你正试图在一个对象列表上这样做。 这有点不同,特别是取决于您使用的数据

如果您使用的是原语列表,请查看此堆栈溢出答案。他比我更好地总结了对象列表的“绑定”。

如果您使用的是非原语列表,我认为您可以绑定到各个属性,而不必使用@onchange来更新列表中的元素

编辑2(使用上述答案的工作实施):

添加到列表

@for(int i=0;i 删除最后一项 @代码{ 私有列表myList=new(){“一”、“二”、“三”、“四”、“五”}; 私有无效重置行(int i) { myList[i]=“”; } 私有void addToList() { myList.Add(“”); } 私有无效删除项() { 如果(myList.Count>0) myList.RemoveAt(myList.Count-1); } }
除非我遗漏了什么,否则Update()函数除了调用StateHasChanged()之外什么也不做

我想你可能误解了Blazor中“重新渲染”的工作原理。它不会尝试从原始状态重新渲染组件。这是一个函数,它让Blazor知道某些东西应该在视觉上发生了变化

在大多数情况下,这应该自动发生,而无需专门调用StateHasChanged()

要执行您试图执行的操作,可以将输入绑定到字符串,然后让更新函数将其重置为默认值。它看起来像这样:
(请注意,我没有仔细检查语法。这是一个示例。)


重置
@代码{
私有字符串myString{get;set;}
私有void resetMyString(){
myString=“”;
}
}
编辑:
我现在明白了,你正试图在一个对象列表上这样做。 这有点不同,特别是取决于您使用的数据

如果您使用的是原语列表,请查看此堆栈溢出答案。他比我更好地总结了对象列表的“绑定”。

如果您使用的是非原语列表,我认为您可以绑定到各个属性,而不必使用@onchange来更新列表中的元素

编辑2(使用上述答案的工作实施):

添加到列表

@for(int i=0;i 删除最后一项 @代码{ 私有列表myList=new(){“一”、“二”、“三”、“四”、“五”}; 私有无效重置行(int i) { myList[i]=“”; } 私有void addToList() { myList.Add(“”); } 私有无效删除项() { 如果(myList.Count>0) myList.RemoveAt(myList.Count-1); } }
如果我的答案回答了您的问题,您能将其标记为正确答案吗?如果我的答案回答了您的问题,您能将其标记为正确答案吗?
public void UpdateRow()
{
StateHasChanged();
}
<input @bind="myString" />
<button @onclick="resetMyString">Reset</button>
@code{
    private string myString {get; set;}
    private void resetMyString(){
        myString = "";
    }
}
    <button @onclick="addToList">Add To List</button>
    <br />
    @for (int i = 0; i < myList.Count; i++)
    {
        var index = i;
        <div>
            <input type="text" value="@myList[index]" @onchange="(e => myList[index] = e.Value.ToString())" />
            <button @onclick="() => resetRow(index)">Reset</button>
        </div>
    }
    <br />
    <button @onclick="removeLastItem">Remove Last Item</button>

@code {
    private List<string> myList = new() { "one", "two", "three", "four", "five" };
    private void resetRow(int i)
    {
        myList[i] = "";
    }
    private void addToList()
    {
        myList.Add("");
    }
    private void removeLastItem()
    {
        if (myList.Count > 0)
            myList.RemoveAt(myList.Count - 1);
    }
}