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 ...
随机推荐
- html5新标签 画布 canvas 替代了 flash
绘制矩形边框,和填充不同的是绘制使用的是strokeRect, 和strokeStyle实现的 绘制路径 绘制路径的作用是为了设置一个不规则的多边形状态 路径都是闭合的,使用路径进行绘制的时候需要既定 ...
- .Net 反射的学习
// 反射 // 一切从 type 开始 2 种拿到 type 的方式 // 作用:动态的操作对象 获取属性 方法 特性 // 1. 拿到对象的 type // typeof(类); // 2. 拿到 ...
- 16 Transformer 的编码器(Encodes)——我在做更优秀的词向量
博客配套视频链接: https://space.bilibili.com/383551518?spm_id_from=333.1007.0.0 b 站直接看 配套 github 链接:https:// ...
- 在华为云上安装高可用 KubeSphere
随着多云多集群的场景越来越丰富,在各个云厂商环境部署 KubeSphere 的需求随之升高.由于各云厂商的云资源使用规则和菜单导航栏各不相同,会使用户花大量时间去排错.为降低部署过程错误率,本教程使用 ...
- 深度学习入门笔记——Transform的使用
Transfrom是什么? 可以看作是一个图像处理的工具箱,通过查看Transform类可以找到不同的图像处理方法 更准确的说,Transform中有各种类的的定义,我们可以通过继承或者构造这些类,然 ...
- Paimon lookup store 实现
Lookup Store 主要用于 Paimon 中的 Lookup Compaction 以及 Lookup join 的场景. 会将远程的列存文件在本地转化为 KV 查找的格式. Hash htt ...
- [离线计算-Spark|Hive] 数据近实时同步数仓方案设计
背景 最近阅读了大量关于hudi相关文章, 下面结合对Hudi的调研, 设计一套技术方案用于支持 MySQL数据CDC同步至数仓中,避免繁琐的ETL流程,借助Hudi的upsert, delete 能 ...
- unique:数组去重,返回一个新数组
function unique(arr){ if(!isArrayLink(arr)){ //不是类数组对象 return arr } let result = [] let objarr = [] ...
- gal game 杂谈——前言
gal game 杂谈--前言 大年三十凌晨(早上)打算开始写了吧,作为第一篇先写一些前言好了. 第一次接触gal game还是在B站上看到有人玩<我和她的世界末日>当时觉得挺有意思的,加 ...
- vue2-脚手架
Vue 脚手架是 Vue 官方提供的标准化开发工具(开发平台) https://cli.vuejs.org/zh/ 使用脚手架 安装脚手架 npm install -g @vue/cli 使用脚手架创 ...