【问题标题】:Prevent ChildComponent to be reloaded after StateHasChanged?防止在 StateHasChanged 之后重新加载 ChildComponent?
【发布时间】:2021-04-14 07:14:11
【问题描述】:

我有一个内部包含不同组件的组件,这些组件具有父组件给出的不同参数。在一个组件中,例如,一个布尔值。它从父组件获取值(true)作为参数。 如果我将子组件内的布尔值更改为 false(为 false),然后在触发 StateHasChanged 的​​父组件中发生某些事情,则子组件会使用来自父组件的 bool 参数进行刷新(true)。

有没有什么很酷的方法可以防止这种情况,让 bool 保持它的价值? 或者我是否必须做一个回调之类的事情,以便每次当孩子内部的布尔值发生变化时,父级内部的布尔值都会发生变化?如果我必须这样做,以下是正确的方法,还是有更简单的方法?

Parent

<TestComponent boolChanged="this.ChangeBool" MyBool="this.myBool"></TestComponent>

@code {
    private bool myBool = true;

private void ChangeBool(bool change)
{
    this.myBool = change;
}
}


Child

@code {
    [Parameter]
    public bool MyBool { get; set; }

[Parameter]
public EventCallback<bool> boolChanged { get; set; }

private async Task SetBoolFalse()
{
    this.MyBool = false;
    await this.boolChanged.InvokeAsync(this.MyBool);
}
}

如果有多个参数,看起来工作量很大。

【问题讨论】:

  • 孩子不应该设置那个参数,你的设计有问题。考虑使用不同的 var 来存储内部状态。

标签: c# blazor blazor-server-side


【解决方案1】:

子组件(TestComponent)

@code {
    private bool myBool; 
    [Parameter]
    public bool MyBool { get; set; }

    [Parameter]
    public EventCallback<bool> MyBoolChanged { get; set; }

    protected override void OnParametersSet()
    {
        myBool = MyBool;
    }

   private async Task SetBoolFalse()
   {
      myBool = false;
      await MyBoolChanged.InvokeAsync(myBool);
   }
}

父组件

<div>@myBool.ToString()</div>

<TestComponent @bind-Value="myBool"/>

@code {
    private bool myBool = true;
}

注意:你不应该改变参数的状态。参数属性仅用于在组件之间流动数据。您应该定义一个局部变量 (myBool) 来维护您的状态。请注意,我在 OnParametersSet 生命周期方法中使用 MyBool 参数属性的值来初始化变量 myBool。

【讨论】:

  • 谢谢。当我像你一样使用@bind-Value 时,有没有办法使用多个参数来做到这一点?
  • 不确定我是否明白,但如果您的意思是要向子组件发送两个参数,第一个是 string 类型,第二个是 int 类型,那么您可以定义具有适当参数的类并将其绑定到您的组件。
  • 是的,就是这个意思。对我帮助很大,谢谢。
  • 如果它解决了您的问题,您是否介意将其标记为答案,以便其他人知道它很有用。
  • 代码中的小错误:它必须是 @bind-MyBool="myBool" 而不是 @bind-Value="myBool"
猜你喜欢
  • 2015-12-05
  • 2015-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-06
  • 1970-01-01
  • 2018-11-18
相关资源
最近更新 更多