@bind 和 @bind-value 之间的区别

Posted

技术标签:

【中文标题】@bind 和 @bind-value 之间的区别【英文标题】:Difference between @bind and @bind-value 【发布时间】:2020-02-01 22:29:34 【问题描述】:

@bind@bind-value有什么区别?

我做了这个简单的例子,并在浏览器中测试,我没有发现任何区别。

<p>@@bind @increment1</p>

<input 
    type="text"
    @bind="@increment1"
/>

<p>@@bind-value @increment2</p>
<input 
    type="text"
    @bind-value="@increment2"
/>

@code 
    string increment1;
    string increment2;

【问题讨论】:

【参考方案1】:

短版

@bind@bind-value 的覆盖,事件设置为“onchange”。

这两个命令是等价的:

 ... @bind-value="userName" @bind-value:event="onchange" ...
 ... @bind="userName" ...

加长版

@bind 属性完成两个独立(但相关)的任务:

    将表达式绑定到&lt;Input... 组件的值 绑定将触发组件的ValueChanged 属性的委托

表达式和委托都是必需的@bind-Value 的实现如下所示:

 ... @bind-value="userName" @bind-value:event="onchange" ...

我们正在设置 both 表达式 (="userName") 和委托 (="onchange")。

“更简单”的@bind= 只是一个覆盖,委托预设为“onchange”。所以这两个命令在功能上是一样的:

 ... @bind-value="userName" @bind-value:event="onchange" ...
 ... @bind="userName" ...

使用重写方法的一个大大简化的类比:

public void bind-value(string value, string event)
..

public void bind(string value)

  bind-value(value, "onchange");

使用完整 @bind-value 版本的几个常见用例是

    根据用户类型更新 UI 验证电子邮件地址作为用户类型

记住,onchange 事件只会在组件失去焦点时触发PropertyChanged。相反,我们希望PropertyChangedoninput 事件触发:

... @bind-value="H1Content" @bind-value:event="oninput" ...
... @bind-value="email" @bind-value:event="oninput" ...

【讨论】:

有没有办法同时指定一个调用 get 的回调?我知道我们可以只设置 value"MyValue" @onchange="myCallback" 但它在更新时不一致。我认为不建议在 MyValue 集(在这种情况下是组件参数)上调用它。 @bind-value="userName" 也将默认为onchange。 2.没有区别。【参考方案2】:

引用Component Binding docs:

到组件和 DOM 元素的数据绑定是通过 @bind 属性完成的。 (...) 使用 @bindCurrentValue 属性 (&lt;input @bind="CurrentValue" /&gt;) 基本上等同于以下内容:

<input value="@CurrentValue"
       @onchange="@((ChangeEventArgs __e) => CurrentValue = __e.Value)" />

除了使用@bind 语法处理onchange 事件外,还可以通过指定带有事件参数(@bind-value:event) 的@bind-value 属性来使用其他事件绑定属性或字段。 (onchange, oninput)

总结

如果您想在每次输入更改时重置绑定值(而不是在失去输入焦点时立即设置所有更改),您应该在@bind-value:event 上使用@bind-valueoninput

<input @bind-value="CurrentValue" 
       @bind-value:event="oninput" />

如果您尝试在不使用 @bind-value 的情况下使用 @bind-value:event(仅使用 @bind),则会引发预编译错误:

错误 RZ10004:找不到对应于属性 'bind-value:event' 的非参数化绑定属性

XXX.razor.g.cs 生成的文件对于@bind@bind-value 是相同的。

【讨论】:

所以这意味着它是一样的,但是如果你想添加额外的功能(:event),你需要使用@bind-value @Vencovsky ,这是我从文档中了解到的以及测试确认的内容。 您是否也有文档没有解释那么多的感觉?有些东西有点模糊 我同意这个 看起来我们也可以做到 @bind="CurrentValue" @bind:event="oninput" !观看此视频:youtube.com/watch?v=GRN30_Q2h_Y 这再次问我 @bind@bind-value 之间的真正区别是什么【参考方案3】:

这两者之间没有任何显着差异。你可以使用@bind-value 和@bind-value:event 或者你可以使用@bind 和@bind:event 对任意的。

【讨论】:

以上是关于@bind 和 @bind-value 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

jQuery的.bind().live()和.delegate()之间区别

ng-model 和 ng-bind 有啥区别

Js(Javascript)的apply call 和bind区别

jQuery中 .bind() .live(). delegate() . on() 的区别

jquery中bind,live,delegate,on的区别

CC_CALLBACK之间的区别