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 ...
随机推荐
- 如何关闭每次打开启动软件前的弹窗(用户账户控制)你要允许此应用.WIN11、10、7
1.先点击任务栏内的搜索,输入"控制面板",然后点开 2.然后在右上角输入"更改用户",然后在下方点击"更改用户账户控制设置" 3.然后把& ...
- 仿函数(Functor)是什么?
仿函数(Functor) 仿函数是通过重载()运算符的类或结构体的对象.这样一个对象可以像普通函数一样被调用. 仿函数通常用于需要在对象内部保留状态或多次调用时有特定行为的情况. 特点: 仿函数是一个 ...
- argmax经过sigmoid和不经过sigmoid区别
起因 今天和同组讨论了一下网络输出时,在torch.argmax之前经过torch.sigmoid和不经过sigmoid的区别. 主要起因是实验结果图像不同 图1 不经过sigmoid 图2 经过si ...
- iOSwkwebView 打开 TXT/PDF 文件乱码的问题
最近做资料文件下载下来并查看的时候,用 WKWebView 打开office 类型的文件的时候是没问题的,但是打开测试人员上传的一个 TXT/PDF 文件就出现了乱码问题,经过查看,应该是文件的编码问 ...
- 一次彻底讲清如何处理mysql 的死锁问题
MySQL 死锁 是指两个或多个事务互相等待对方持有的锁,从而导致所有事务都无法继续执行的现象.在 InnoDB 存储引擎中,死锁是通过锁机制产生的,特别是在并发较高.业务逻辑复杂的情况下,更容易发生 ...
- jmeter测试rpc接口-使用dubbo框架调用
1.下载用于测试dubbo的spring boot项目 参考文章: http://t.zoukankan.com/111testing-p-11297038.html https://zhuanlan ...
- 学习JavaScript第四天
文章目录 1 回顾 内置对象 2 内置对象 2.1 Function 2.2 Global 3 DOM 部分知识点介绍 4 BOM 4.1 window ① 弹框 ② 打开关闭窗口 ③ 页面滚动 ④ ...
- Java常见面试真题之中级进阶(HashMap篇)
前言 本来想着给自己放松一下,刷刷博客,突然被几道面试题难倒!说说Hashtable 与 HashMap 的区别?HashMap 中的 key 我们可以使用任何类作为 key 吗?HashMap 的长 ...
- 12万字的java面试题及答案整理(2024新版)
前言 本来想着给自己放松一下,刷刷博客,慕然回首,final有哪些用法?static都有哪些用法?java的精度算法?java运算逻辑?异常处理?似乎有点模糊了,那就大概看一下Java基础面试题吧.好记 ...
- Ubuntu中Conda建立环境和删除环境
网上说的很全面了,这里我把我遇到的一些问题和解决方案罗列出来,以便未来的学习和了解. 博客的好处就体现出来了,下次你再用这个东西,就直接打开你的博客照抄就行了,不用东搜西搜了,及其方便,这种碎片化的东 ...