React 的界面与数据分离问题
React 生态庞大,没办法只能学一点。第一段学完就有一个根本性的问题了:它竟然把数据、业务逻辑和界面混在一起,组件变成了有“业务状态”的组件,这就意味着UI和业务绑定了。而这种糟糕的设计是 d2js (前端库)从一开始就避免的。
React 发明了 react hooks 之类高级概念进行挽救:
使用React Hooks代替类的6大理由_语言 & 开发_Dilantha Prasanjith_InfoQ精选文章
还发明了“关注点分离”这样的高深莫测的名词。用Hooks实现关注点分离 | Deathdealer's Blog
模仿 react 的 Jetpack Compose 也想明白了这点,把界面输出变成了一套数据->UI 的渲染函数。
但是渲染函数也不一定合理,好好的二阶的面向对象坍缩成了一阶的函数,其实界面和数据确实应该有一个关系。界面组件引用数据,界面组件有一个位子为数据预留,这本来是很合理的,但 React 把"数据"的范围搞的太宽泛了,它的 State 支持任意 js 数据,这导致用户要手工调用 setState 来实现刷新。
在 d2js 中,数据不需要知道组件,数据更新后组件可以总刷新, 而在 react 中,必须找到组件以调用组件的 setState 进行刷新。的确,react 渲染函数中的组件是匿名的,不需要“摸”它们,但“这个组件”本身不是,需要摸到它才能进行 render。react hook 化解了这个危机,变成了一组渲染函数,最终效果和 d2js 有点相似,但 useState 这样的写法还是不如向上游提出要求。
react 的 state 不应是任意 js 对象,应当要求数据支持变更事件,界面组件订阅数据变更事件,从而重绘UI。对单元测试来说给数据挂变更侦听也是更方便的做法。
另一个问题是,React 的组件中真正的UI元素都是通过 render 给出的,即使是复合组件也不是复合的,子元素不是组件的成员,子元素无法抓获,父元素的树也没有它们的树的地位,所以也无法操作它们,当然,要说完全无法抓获也不对,通过给它起个id什么的也能抓获,但是它不是一种复合,这很奇怪。
React 的解释是这种 UI 元素并不属于用户所给的UI元素,比如有一个容器组件,它在使用时用户给定的内容组件,才是 react 所认可的子元素,而渲染出图的 ui 元素,不能属于子元素。这种做法其实很费解,react 最大的优势是 vdom,vdom 的本质是dom 元素交给托管状态的diff函数,为了一些可托管状态的子元素而导致子元素无法把控,让人难以理解。
复合行为诡异,不支持继承,说明 React 的设计可能是错的,它不是在搭UI的积木,而是在搞状态化的渲染函数,这种对UI元素漠然的UI思想似不及 moulecule。
React 的界面与数据分离问题的更多相关文章
- wxWidgets一个界面与数据分离的简单例子
/*************************************************************** * Name: MyApp.h * Purpose: Defines ...
- 解析大型.NET ERP系统 界面与逻辑分离
Windows Forms程序实现界面与逻辑分离的关键是数据绑定技术(Data Binding),这与微软推出的ASP.NET MVC的原理相同,分离业务代码与界面层,提高系统的可维护性. 数据绑定 ...
- jQuery MiniUI开发系列之:UI和数据分离
使用MiniUI需要注意:UI和数据是分离的. 传统的WEB开发,开发者经常将数据库操作.服务端业务.HTML标签写在一个页面内. 这样会造成开发的混乱,并且难以维护和升级. 使用MiniUI开发的时 ...
- WPF MVVM UI分离之《交互与数据分离》
在我们使用WPF过程中,不可避免并且超级喜欢使用MVVM框架. 那么,使用MVVM的出发点是视觉与业务逻辑分离,即UI与数据分离 诸如下面的问题: 删除操作,假如需要先执行一部分数据的处理,然后删除界 ...
- tkinter的GUI设计:界面与逻辑分离(四)-- 与 matplotlib 结合
有些场合,我们需要对数据可视化.单是靠 tkinter 难度太大,而且做出来的效果不一定理想. 此时,将 tkinter 与 matplotlib 结合,是最好的选择. 知识点: 将 tkinter ...
- WPF MVVM UI分离之《交互与数据分离》 基础才是重中之重~delegate里的Invoke和BeginInvoke 将不确定变为确定系列~目录(“机器最能证明一切”) 爱上MVC3系列~全局异常处理与异常日志 基础才是重中之重~lock和monitor的区别 将不确定变成确定~我想监视我的对象,如果是某个值,就叫另一些方法自动运行 将不确定变成确定~LINQ DBML模型可以对
WPF MVVM UI分离之<交互与数据分离> 在我们使用WPF过程中,不可避免并且超级喜欢使用MVVM框架. 那么,使用MVVM的出发点是视觉与业务逻辑分离,即UI与数据分离 诸如下 ...
- react中界面跳转 A界面跳B界面,返回A界面,A界面状态保持不变 redux的state方法
在上一篇文章中说过了react中界面A跳到B,返回A,A界面状态保持不变,上篇中使用的是传统的localStorage方法,现在来使用第二种redux的state方法来实现这个功能 现在我刚接触red ...
- 【web前端面试题整理07】我不理解表现与数据分离。。。
拜师传说 今天老夫拜师了,老夫有幸认识一个JS高手,在此推荐其博客,悄悄告诉你,我拜他为师了,他承诺我只收我一个男弟子..... 师尊刚注册的账号,现在博客数量还不多,但是后面点会有干货哦,值得期待. ...
- Robot Framework--05 案例设计之流程与数据分离
转自:http://blog.csdn.net/tulituqi/article/details/7651049 这一讲主要说一下案例设计了.还记得我们前面做的case么?先打开浏览器访问百度,输入关 ...
- 3.SpringMVC修改配置文件路径和给界面传递数据
1.修改配置文件路径 达到 配置多文件的目的 web.xml文件中基础配置有springMVC配置的servlet路径 <servlet-name>SpringMVC</serv ...
随机推荐
- 【ZZ】Linux 安装 edge 浏览器
For Debain/Ubuntu/Deepin etc.## Setupcurl https://packages.microsoft.com/keys/microsoft.asc | gpg -- ...
- android ion
1. 简介 Android的ION子系统的目的主要是通过在硬件设备和用户空间之间分配和共享内存,实现设备之间零拷贝共享内存.说来简单,其实不易.在Soc硬件中,许多设备可以进行DMA,这些设备可能有不 ...
- 活动预告 | 中国数据库联盟(ACDU)中国行第二站定档杭州,邀您探讨数据库技术与实践!
数据库技术一直是信息时代中不可或缺的核心组成部分,随着信息量的爆炸式增长和数据的多样化,其重要性愈发凸显.作为中国数据库联盟(ACDU)的品牌活动之一,[ACDU 中国行]在线下汇集数据库领域的行业知 ...
- 技术分享 | 徐轶韬:从MySQL5.7升级到MySQL 8.0
在6月20日举办的[墨天轮数据库沙龙-MySQL 5.7 停服影响与应对方案]中,甲骨文MySQL解决方案首席工程师徐轶韬分享了<从MySQL5.7升级到MySQL 8.0>主题演讲,本文 ...
- KubeSphere 社区双周报 | OpenFunction v1.0.0-rc.0 发布
KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书.新增的讲师证书以及两周内提交过 commit 的贡献者,并对近期重要的 PR 进行解析,同时还包含了线上/线下活动和布道推广等一系列 ...
- Mongo oplog理解
转载请注明出处: oplog(操作日志)是MongoDB中用于记录所有写操作的日志.它是一个特殊的集合,存储在副本集的主节点中.oplog用于确保副本集中的副节点与主节点的数据保持一致.当主节点执行写 ...
- AI五子棋_10 更多的算法探索
AI五子棋 第十步 恭喜你到达第十步! 你已经完成了一个AI的设计,下面就需要发动你的智慧让你的机器大脑变得更聪明了! 我们的征途是星辰大海! 更多资料可以参考这个列表 https://gomocup ...
- Oracle-表分析和索引分析解读
概述当表没有做分析的时候,Oracle 会使用动态采样来收集统计信息. 获取准确的段对象(表,表分区,索引等)的分析数据,是CBO存在的基石,CBO的机制就是收集尽可能多的对象信息和系统信息,通过对这 ...
- 一文彻底弄懂Spring Boot的启动过程
一,Spring Boot启动过程 1. 启动入口 Spring Boot 应用的启动入口通常是一个包含 @SpringBootApplication 注解的主类,并调用 SpringApplicat ...
- AlignSum:数据金字塔与层级微调,提升文本摘要模型性能 | EMNLP'24
来源:晓飞的算法工程笔记 公众号,转载请注明出处 论文: AlignSum: Data Pyramid Hierarchical Fine-tuning for Aligning with Human ...