2020-06-11-ASP.NET Core Blazor 子组件父组件数据同步的问题
2020-06-12 09:40
639 查看
钉钉、微博极速扩容黑科技,点击观看阿里云弹性计算年度发布会!>>>
上一篇写数据绑定的文章,写到最后留了一个坑。当子组件绑定父组件的一个字段,并且子组件修改它的时候父组件不能实时进行同步更新UI的问题,最近终于在Blazui作者的指导下搞定了。
UserInfo类要实现INotifyPropertyChanged接口
public class UserInfo: INotifyPropertyChanged { private string _userName; public string UserName { get { return _userName; } set { _userName = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(UserName))); } } public string Sex { get; set; } public DateTime BrithDay { get; set; } public event PropertyChangedEventHandler PropertyChanged; }
没想到微软blazor还是借用了WPF搞MVVM的模式,模型需要实现INotifyPropertyChanged类,在属性发生修改的时候可以发出通知。
父组件订阅PropertyChanged事件:
@page "/" ====================parent```================== <p> userName: @userInfo.UserName </p> <p> sex: @userInfo.Sex </p> <p> brithday: @userInfo.BrithDay </p> <p> title: @title </p> <InfoEdit UserInfo="userInfo" UserInfoChanged="HandleUserInfoChanged"></InfoEdit> @code { private UserInfo userInfo; private string title; protected override void OnInitialized() { userInfo = new UserInfo { UserName = "abc", Sex = "f", BrithDay = DateTime.Now }; this.userInfo.PropertyChanged += (o, e) => StateHasChanged(); base.OnInitialized(); } private void HandleUserInfoChanged(UserInfo info) { this.userInfo = info; Console.WriteLine("HandleUserInfoChanged"); } }
父组件订阅子组件的PropertyChanged事件,当事件发生的时候调用组件的StateHasChanged方法。StateHasChanged方法会通知组件说状态发生变化了,也就是说组件会被重新渲染。这就是最关键的东西了。
子组件
====================child================== <p> userName: <input @bind="UserInfo.UserName" @bind:event="oninput" /> </p> <p> sex: <select @bind="UserInfo.Sex"> <option value="m">男</option> <option value="f">女</option> </select> </p> <p> BrithDay:<input @bind="UserInfo.BrithDay" /> </p> <button class="btn btn-danger" @onclick="InvokeChanged">保存</button> @code { [Parameter] public UserInfo UserInfo { get; set; } [Parameter] public EventCallback<UserInfo> UserInfoChanged { get; set; } private void InvokeChanged() { UserInfoChanged.InvokeAsync(this.UserInfo); Console.WriteLine("InvokeChanged"); } }
运行
一些吐槽
虽然搞定了子父组件同步的问题,但是我不能理解的是,为什么微软要搞的这么复杂。使用@bind-UserInfo会强制用户在子组件实现一个 EventCallback UserInfoChanged 事件。那么既然@bind:event="oninput"可以实时回写字段的值,那么为什么不直接同时调用UserInfoChanged对外抛事件呢?而且在父组件同样可以在编译器直接植入对UserInfoChanged事件的监听同时刷新UI。可能是微软为了性能,想要用户手工控制父组件的渲染时机吧。
相关文章推荐
- [Asp.net core 3.1] 通过一个小组件熟悉Blazor服务端组件开发
- [ASP.NET Core 3框架揭秘] 配置[5]:配置数据与数据源的实时同步
- asp.net关于分页上的数据删除问题
- ASP.NET应用程序中TreeView 控件 即需填充 TreeNode 数据时,节点展开问题
- 【转】Asp.NET大文件上传组件开发总结(四)---封送数据给Asp.NET页面
- ASP.NET 2.0 解决了 Code-Behind 需要控件声明同步的问题
- ASP.NET: TextBox控件如果设置为ReadOnly则PostBack之后可能丢失数据的问题
- asp.net 导入CSV 文件内容 到 SQL Server 数据库 解决CSV内容数据重复添加问题
- 解决Asp.net Mvc返回JsonResult中DateTime类型数据格式的问题
- 在Asp.net 2.0 中禁用页面缓存解决页面刷新(重新加载数据)的问题!
- ASP.NET关于分页上的数据删除问题
- asp.net 脏字典过滤问题 用正则表达式来过滤脏数据
- Asp.net MVC 2 中解决页面提交数据并发问题
- asp.net导出数据到execl并保存到本地 不需要调用Office组件
- ASP.NET|构建数据访问组件
- 使用Newtonsoft.json 解决 Asp.Net MVC DateTime类型数据Json格式化问题
- ASP.NET数据控件绑定需要注意的问题
- 在Asp.net 2.0 中禁用页面缓存解决页面刷新(重新加载数据)的问题!
- ASP.NET三层架构中数据绑定的问题
- Asp.net中在GridView数据绑定事件中改变显示内容要注意的问题