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 的界面与数据分离问题的更多相关文章

  1. wxWidgets一个界面与数据分离的简单例子

    /*************************************************************** * Name: MyApp.h * Purpose: Defines ...

  2. 解析大型.NET ERP系统 界面与逻辑分离

    Windows Forms程序实现界面与逻辑分离的关键是数据绑定技术(Data Binding),这与微软推出的ASP.NET MVC的原理相同,分离业务代码与界面层,提高系统的可维护性. 数据绑定 ...

  3. jQuery MiniUI开发系列之:UI和数据分离

    使用MiniUI需要注意:UI和数据是分离的. 传统的WEB开发,开发者经常将数据库操作.服务端业务.HTML标签写在一个页面内. 这样会造成开发的混乱,并且难以维护和升级. 使用MiniUI开发的时 ...

  4. WPF MVVM UI分离之《交互与数据分离》

    在我们使用WPF过程中,不可避免并且超级喜欢使用MVVM框架. 那么,使用MVVM的出发点是视觉与业务逻辑分离,即UI与数据分离 诸如下面的问题: 删除操作,假如需要先执行一部分数据的处理,然后删除界 ...

  5. tkinter的GUI设计:界面与逻辑分离(四)-- 与 matplotlib 结合

    有些场合,我们需要对数据可视化.单是靠 tkinter 难度太大,而且做出来的效果不一定理想. 此时,将 tkinter 与 matplotlib 结合,是最好的选择. 知识点: 将 tkinter ...

  6. WPF MVVM UI分离之《交互与数据分离》 基础才是重中之重~delegate里的Invoke和BeginInvoke 将不确定变为确定系列~目录(“机器最能证明一切”) 爱上MVC3系列~全局异常处理与异常日志 基础才是重中之重~lock和monitor的区别 将不确定变成确定~我想监视我的对象,如果是某个值,就叫另一些方法自动运行 将不确定变成确定~LINQ DBML模型可以对

    WPF MVVM UI分离之<交互与数据分离>   在我们使用WPF过程中,不可避免并且超级喜欢使用MVVM框架. 那么,使用MVVM的出发点是视觉与业务逻辑分离,即UI与数据分离 诸如下 ...

  7. react中界面跳转 A界面跳B界面,返回A界面,A界面状态保持不变 redux的state方法

    在上一篇文章中说过了react中界面A跳到B,返回A,A界面状态保持不变,上篇中使用的是传统的localStorage方法,现在来使用第二种redux的state方法来实现这个功能 现在我刚接触red ...

  8. 【web前端面试题整理07】我不理解表现与数据分离。。。

    拜师传说 今天老夫拜师了,老夫有幸认识一个JS高手,在此推荐其博客,悄悄告诉你,我拜他为师了,他承诺我只收我一个男弟子..... 师尊刚注册的账号,现在博客数量还不多,但是后面点会有干货哦,值得期待. ...

  9. Robot Framework--05 案例设计之流程与数据分离

    转自:http://blog.csdn.net/tulituqi/article/details/7651049 这一讲主要说一下案例设计了.还记得我们前面做的case么?先打开浏览器访问百度,输入关 ...

  10. 3.SpringMVC修改配置文件路径和给界面传递数据

    1.修改配置文件路径  达到  配置多文件的目的 web.xml文件中基础配置有springMVC配置的servlet路径 <servlet-name>SpringMVC</serv ...

随机推荐

  1. USB总线-Linux内核USB3.0设备控制器中断处理程序分析(九)

    1.概述 USB设备枚举.请求处理.数据交互都涉及USB设备控制器中断.当有事件发生时,USB设备控制器首先将事件信息通过DMA写入到事件缓冲区中,然后向CPU发出中断,随后CPU调用中断处理函数开始 ...

  2. USB总线-Linux内核USB设备驱动之UAC2驱动分析(十)

    1.概述 UVC(USB Audio Class)定义了使用USB协议播放或采集音频数据的设备应当遵循的规范.目前,UAC协议有UAC1.0和UAC2.0. UAC2.0协议相比UAC1.0协议,提供 ...

  3. 什么是WebRTC

    背景:webrtc web real-time communication 实时通信标准,提供了音视频通话系统的能力. 应用场景: 点对点视频聊天,如 微信视频,等实时视频通话应用. 多人视频会议,企 ...

  4. 06 Word2Vec模型(第一个专门做词向量的模型,CBOW和Skip-gram)

    博客配套视频链接: https://space.bilibili.com/383551518?spm_id_from=333.1007.0.0 b 站直接看 配套 github 链接:https:// ...

  5. 1553B总线测试仪

    1553B总线测试仪-天津光达航电科技有限公司在测试模拟1553B总线的标准化测试仪器,该仪器是通过简单直观的管理工具实现复杂的MIL-STD-1553的测试及模拟功能,主要包括对MIL-STD-15 ...

  6. css常用布局之flex布局

    Flexbox 是一个一维的布局模式,它可以轻松地在不同的方向上排列子元素(称为 flex 项),即使它们的大小是未知或者是动态变化的.以下是 Flexbox 的一些关键概念: 容器和项: 启用 Fl ...

  7. AI赋能-《用ChatGPT做软件测试》新书上市

    图书链接京东: https://item.jd.com/10121763192532.html当当: http://product.dangdang.com/29797547.html内容简介本书以目 ...

  8. Linux 日志管理基础

    目录 基本介绍 日志的存放 存放目录与存放内容 举例说明 日志管理服务: rsyslogd 功能与配置 检查自启动 配置文件 /etc/rsyslog.conf 修改配置文件 基本介绍 日志文件是重要 ...

  9. Air780E之TCP应用,你了解吗?

    ​ 一.TCP简介 TCP(TransmissionControlProtocol,传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议.它主要用于在不可靠的网络环境中提供稳定的数据传输 ...

  10. 在Keil中使用ST-LINK烧录STM32程序指南

    前言 之前玩STM32都是用J-LINK烧录程序,不仅便捷,而且烧录的速度比用串口快好多. 最近我接了几个32单片机的毕设单子,便买了几块C8T6的最小系统板用来开发.最初我还是用J-LINK烧录C8 ...