组件内的 Blazor 双向绑定文本区域

Posted

技术标签:

【中文标题】组件内的 Blazor 双向绑定文本区域【英文标题】:Blazor Two Way Binding Text Area inside component 【发布时间】:2021-02-25 18:43:04 【问题描述】:

我正在尝试在 Blazor 的子组件内双向绑定文本区域,但我无法弄清楚。

家长

@page "/test"

<h3>Parent Component</h3>
<input type="text" @bind="mydata" />

<TWBTextArea @bind-ChildData=@mydata></TWBTextArea>

@code 
    public string mydata = "test";

儿童

<h4>Child Component</h4>

<textarea @bind=@ChildData></textarea>

@code 
    [Parameter] public string ChildData  get; set; 

    [Parameter]
    public EventCallback<string> ChildDataChanged  get; set; 

当我从父组件更新时,子文本区域更新,但是当我更新子文本区域时,父组件没有更新。

附加说明:如果我将传递的值从 string 更改为具有字符串属性的 对象 并将该对象传递给子组件,则双向绑定确实有效,但只有在更新父组件之后。

提前感谢您的帮助!

【问题讨论】:

【参考方案1】:

重要提示:您不应绑定到组件的参数,因为它可能会对您的应用产生副作用。阅读Steve Sanderson的这篇文章

请注意,我定义了一个名为data 的局部变量,我将OnParametersSet 方法中的ChildData 参数属性值分配到该变量中。正如我之前所说,这样做是为了避免绑定到组件的参数。

由于我们正在创建双向数据绑定,因此 textarea 元素的 value 属性绑定到变量 data。数据流是从变量到元素。我们还需要创建一个事件处理程序,这里命名为HandleOnChange,其作用是更新局部变量data,以及调用EventCallback 'delegate',传递存储在data 中的新值多变的。父组件的mydata 字段很高兴收到此值,之后会重新渲染以反映新的更改。

请注意,我使用的是input 事件,而不是change 事件,以使生活更轻松、更有趣。

子组件

<h4>Child Component</h4>

<textarea @oninput="HandleOnChange">@data</textarea>

@code 

    private string data;

    [Parameter] public string ChildData  get; set; 

    [Parameter]
    public EventCallback<string> ChildDataChanged  get; set; 

    private async Task HandleOnChange(ChangeEventArgs args)
    
        data = args.Value.ToString();

        await ChildDataChanged.InvokeAsync(data);
    

    protected override void OnParametersSet()
    
        data = ChildData;

        base.OnParametersSet();
    

用法

@page "/test"

<h3>Parent Component</h3>
<input type="text" @bind="mydata" @bind:event="oninput" />

<ChildComponent @bind-ChildData="mydata" />

@code 
    private string mydata = "test";

【讨论】:

太棒了。我现在知道了。非常感谢您的完美解释。

以上是关于组件内的 Blazor 双向绑定文本区域的主要内容,如果未能解决你的问题,请参考以下文章

Blazor University 组件 — 双向绑定

textarea 双向绑定不适用于 ng-model

VueJs:文本区域输入绑定

双向绑定和后台更新不重新渲染组件

angularjs1.x版本,父子组件之间的双向绑定

双向数据绑定到单例服务Blazor服务器端