【问题标题】:Blazor not updating same value in input twice after manually manipulated same value though its firing change event通过触发更改事件手动操作相同的值后,Blazor 未在输入中更新相同的值两次
【发布时间】:2020-06-11 14:07:23
【问题描述】:

下面是简单的代码

 @page "/demo"
<h3>POCBlazor</h3>
Input 1 :<input type="text" value="@somedata" @onchange="changeValue" placeholder="text 1" />
Input 2 :<input type="text" placeholder="text 2" />
@code {
    public string somedata { get; set; }
    void changeValue(ChangeEventArgs eventArgs)
    {

        somedata = eventArgs.Value.ToString();
        somedata = somedata + "asdf";
        StateHasChanged();
    }
}

场景
1)我在输入1中添加新值,然后用“asdf”表示
例如: 输入值 "123" -- 调用 changeValue 函数 --> 输入 1 = "123asdf"

2)第二次我用相同的值更新输入 1,然后触发更改事件并且代码工作,但输入 1 中的值没有更新
第二次:再次输入值 "123" --- 调用 changeValue 函数 --> Input 1 = "123"

【问题讨论】:

    标签: blazor blazor-server-side asp.net-blazor


    【解决方案1】:

    我不确定是什么问题,应该对此进行调查。有空的时候我会做的。你对你的经历是正确的。但是,如果您使用 @bind 指令,则可以获得所需的行为。执行此操作并验证....

     Input 1 :<input type="text" @bind="@Somedata" placeholder="text 1" />
     Input 2 :<input type="text" placeholder="text 2" />
    
     <p>@somedata</p>
    
     @code {
    
     private string somedata;
    
     public string Somedata 
     { 
      get {return somedata; }
      set{
        if( somedata != value)
       {
          somedata = value + "asdf";
       }
      }
    
    }
    
    } 
    

    我想我知道是什么问题...

    <h3>POCBlazor</h3>
    Input 1 :<input type="text" value="@Somedata" @onchange="changeValue"> 
    placeholder="text 1" />
    Input 2 :<input type="text" placeholder="text 2" />
    <p>@Somedata</p>
    
    @code {
    
       public string Somedata { get; set; }
    
    
       void changeValue(ChangeEventArgs eventArgs)
       {
    
           Somedata = eventArgs.Value.ToString();
           Somedata += "asdf";
       }
    }
    }
    

    当您在文本框中输入值 123 时,将调用 onchnage 事件,并因此执行事件处理程序 .因此 Somedata 属性包含值 123asdf。由于更改事件是 UI 事件,因此 StateHasChanged 被自动调用,它通知组件它的值已经改变,它应该重新渲染。组件重新渲染, 现在文本框,如上所述,包含值 123asdf。

    当您再次输入值 123 时,处理循环会重复,但是,请查看您的代码:

    somedata = eventArgs.Value.ToString();
    

    将值 123 分配给 somedata 现在 somedata === 123,对吧?

    somedata = somedata + "asdf";
    

    将字符串“asdf”添加到 somedata 的值中,并将组合值分配给 somedata。现在 somedata 包含值“123asdf”。这与以前的值相同,对吗?这意味着您的组件不会重新渲染,因为组件的状态不会改变。 注意:StateHasChanged 方法只是组件状态发生变化的一种通知器,但组件是决定是否重新渲染的,所以即使你在代码中使用它,组件也拒绝让步。顺便说一下,StateHasChanged 方法的存在并不是必需的,因为它会自动通过 UI 事件调用。

    下次输入 123 并 tab out 时,根本不会触发 change 事件。但如果你 NEXT 输入值 1234,属性和文本框 将具有组合值:1234asdf

    这种行为是设计使然...

    【讨论】:

    • 感谢您的回复,但我创建了一些应该在页面内部调用的方法和 'public string Somedata { get;放; }' 是另一个模型的一部分,它也可以用作列表。所以我尝试了,但它不以这种方式工作。这是根据 POC 的正确答案,但在我的编码结构中不起作用。
    • 能否请您显示完整的相关代码,以便我可以尝试使其工作...
    • “这种行为是设计使然”,这是错误的设计。如果你有一个绑定到参数的输入并且你想限制为 9 个字符,你可以这样做 value= e.Value.ToString().Substring(0, 9); InvokeAsync(StateHasChanged); 但是,在输入第 10 个字符后,值属性保持不变,但输入值不断变化,因为它永远不会重新渲染。这可以通过将字符放在中间来验证,这会更改 value 属性并强制重新渲染。我认为应该有一种方法可以强制重新渲染组件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-02
    • 1970-01-01
    • 1970-01-01
    • 2020-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多