何时在Blazor中使用ValueChanged和ValueExpression?

文科夫斯基

我在一些具有ValueChangedValueExpression属性的库(MatBlazor,Telerik)中看到这种常见模式,这确实使我感到困惑。

两者有什么区别?以及何时使用它?

互联网

实际上,您已经忘记了该模式的第三个元素:Value这种属性的“三位一体”经常用于组件双向数据绑定。值得注意的是,这些属性是在内置Blazor表单组件(例如)中采用的<InputText>

让我们看一个例子:

<InputText @bind-Value="employee.FirstName" />
  1. Value是以形式提供的属性@bind-Value="model.PropertyName"

  2. ValueChanged是类型EventCallback<TValue>它代表更新绑定值的回调。如您所见,在上面的示例中我们没有使用它-不必要。编译器知道它的工作,并会做这件事,这意味着它会在EventCallback后面添加带有所有必要设置“委托”。

  3. ValueExpression最后,指代标识绑定值的表达式。它由编译器自动创建,几乎不需要(如果需要)对其进行设置。

现在,让我们将上面的代码与下面的代码进行比较。下面的示例在父组件和子组件之间创建双向数据绑定。然而,而是采用了标准的“三位一体”( ,ValueValueChanged),ValueExpression我们将复制为自己的基本模式:

ParentComponent.razor:

<ChildComponent @bind-Text="FirstName" />

@code {
    [Parameter]
    public string FirstName { get; set; }
}

ChildComponent.razor:

<input @bind="Text" />

@code {
    private string text;

    [Parameter]
    public string Text
    {
        get { return text; }
        set
        {
            if (text != value) {
                text = value;
                if (TextChanged.HasDelegate)
                {
                    TextChanged.InvokeAsync(value);
                }
            }
        }
    }

    [Parameter]
    public EventCallback<string> TextChanged { get; set; }
}

内置的<InputText>和我们的自定义<ChildComponent>基本相同!


要回答您的其他问题...

我什么时候可以使用ValueChanged,并ValueExpression在Blazor?我正在从另一个库创建输入的包装,这是使用这种三位一体的情况吗?

如上所述,ValueChanged并且ValueExpression是Blazor内置组件中定义的属性,大多数情况下,您无需直接使用它们。

再次查看我在上面定义的两个组件:<ParentComponent><ChildComponent>变化TextTextChangedValueValueChanged,和我的部件仍然有效并正常工作。唯一的区别是命名。我该怎么办<ChildComponent>我定义了一个名为Text(代表Value的参数属性由于我想启用父组件和子组件之间的双向数据绑定,因此我还需要定义一个称为此处的参数属性TextChanged(代表ValueChanged)。TextTextChangedValueValueChangedYearYearChanged命名仅是约定。要点是必须定义一个属性,并且必须定义与该属性EventCallback相同的数据类型。

在父组件内部,我提供了如下属性:

<ChildComponent @bind-Text="NameOfAPropertyDefinedInTheParentComponent" /><ChildComponent @bind-Value="NameOfAPropertyDefinedInTheParentComponent" /><ChildComponent @bind-Year="NameOfAPropertyDefinedInTheParentComponent" />

在我上面的组件中,还有代码,例如在子组件中,该代码调用TextChanged委托以将值传递回父组件。这正是ValueChanged委托在定义它的组件中所做的事情。但是您作为用户不必使用它。看我的组件...它们工作得很好。无需触摸。如果您作为我的组件的用户想要对其进行子类化,那么您需要知道您在做什么以及如何正确地对Blazor组件进行子类化。但是,这里部分介绍的我的组件相对简单。

假设您要基于创建一个密码输入<InputText>,这不仅可行而且非常容易。在这种情况下,除了<InputText>组件的外观之外,您将不做任何更改,以便显示星号符号而不是普通文本。其余部分不变。您无需处理此类事件。当然,这并不意味着组件作者永远不需要EventCallback在其代码中的某个地方调用就是说,我从来没有充分的理由ValueChanged在使用<InputText>组件触发委托而且我只需要提供一个ValueExpression,因为编译器无法识别绑定值。(我会寻找它,如果找到我会在这里发布...)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章