React 作为一个 UI 运行时(一、宿主环境和渲染器)

news/2024/7/8 3:14:16
很多教程把React介绍为一个UI框架。这很合理因为它就是一个UI库,这就是react标语的意思。
这篇文章不会叫你任何关于建立用户界面的知识,但是会帮助你更生层次的理解React编程模型。
这是一篇深入解析的文章,对初学者不太适合。在这篇文章我将通过第一准则描述大部分的React编程,我将解释react是如何工作的。

1 Host Tree

一些程序输出数字,另一些程序输出诗歌。不同的语言和他们的运行时通常会对特定的实例进行优化,React也不例外。

React会生成一颗不断变化的树结构。它可能是Dom树,ios层级,关于PDF的原语树,或者是JSON的对象。通常我们希望用它们来生成UI界面。
我们称这些结构为“host tree”, 因为通常他们是React之外宿主环境的一部份——就像Dom和iOS。host tree 通常拥有自己的命令式的API。React就是它上面的一层。
所以React的作用是什么呢?抽象的说,它能帮助你在编写程序时可预测的操作复杂的Host tree,并且对像交互,网络响应,定时器等等这样的外部事件作出反应。

当专门的工具通过特定的约束获取收益,他就比一般的工作优秀。React通过下面的两项原则实现:
  • 稳定:host tree相对来说比较稳定,大部分的更新不会改变整个结构。。如果一款app经常用完全不同的组合改变交互元素,它会比较难用的。按钮去哪了呢?为什么我的屏幕会跳动?
  • 有规律的: Host tree 可以将拆分成不同的UI组件但表现一致,而不是不同的形状。

这些原则恰好适用于大多数 UI 。 然而,当输出没有稳定的“模式”时 React 并不适用。例如,React 也许可以帮助你编写一个 Twitter 客户端,但对于一个 3D 管道屏幕保护程序 并不会起太大作用。

2.Host Instances(宿主实例)

由节点构成的host tree 我们称为Host Instances。
在Dom环境中,宿主实例就是一般的DOM节点——就像你使用document.createElement('div')方法时所得到的对象。在 iOS 中,宿主实例可以是从 JavaScript 到原生视图唯一标识的值。
宿主实例有它们的属性,他们也有可能将其他的宿主实例作为子项。
一般会有API操作宿主的实例。。比如Dom提供了像appendChildremoveChildsetAttribute等等的API。在React中一般都不使用这些API,因为都有React来做。

3.render

渲染器(render)教会 React 如何与特定的宿主环境通信以及如何管理它的宿主实例。React DOM、React Native 甚至 Ink 都可以称作 React 渲染器。你也可以创建自己的 React 渲染器 。

React 渲染器能以下面两种模式之一进行工作。

绝大多数渲染器都被用作“可变”模式。这种模式正是 DOM 的工作方式:我们可以创建一个节点,设置它的属性,在之后往里面增加或者删除子节点。宿主实例是完全可变的。

但 React 也能以”不变“模式工作。这种模式适用于那些并不提供像 appendChild 的 API 而是克隆双亲树并始终替换掉顶级子树的宿主环境。在宿主树级别上的不可变性使得多线程变得更加容易。React Fabric 就利用了这一模式。

作为 React 的使用者,你永远不需要考虑这些模式。我只想强调 React 不仅仅只是从一种模式转换到另一种模式的适配器。它的用处在于以一种更好的方式操控宿主实例而不用在意那些低级视图 API 范例。


http://www.niftyadmin.cn/n/2815552.html

相关文章

Java并发51:并发集合系列-基于独占锁+数组实现的单向阻塞有界队列ArrayBlockingQueue

[超级链接:Java并发学习系列-绪论] [系列序章:Java并发43:并发集合系列-序章] 原文地址:http://www.importnew.com/25566.html 一、 前言 上节介绍了无界链表方式的阻塞队列LinkedBlockingQueue,本节来研究下有界使用数组方式实…

lingo错误代码对照大全

需要lingo11破解版,请留下邮箱。 0 LINGO模型生成器的内存已经用尽(可用“LINGO|Options"命令对General Solver 选项卡中的“Generator Memory Limit"选项进行内存大小的修改) 1 模型中的行数太多(对于有实际意义的模型,这个错…

Java并发52:并发集合系列-基于独占锁+二叉树最小堆实现的单向阻塞无界优先级队列PriorityBlockingQueue

[超级链接:Java并发学习系列-绪论] [系列序章:Java并发43:并发集合系列-序章] 原文地址:http://www.importnew.com/25541.html 一、 前言 PriorityBlockingQueue是带优先级的无界阻塞队列,每次出队都返回优先级最高的元素&…

Mysql之Centos6.5+Mysql5.6搭建配置

下载mysql-xxx.tar.gz文件 将下载的文件通过ftp软件传到linux下/usr/local 解压并重命名 cd /usr/local tar -zxvf mysql-xxx.tar.gz mv mysql-xxx mysql 检测是否安装过mysql rpm -qa |grep mysql 删除旧版本mysql rpm -e mysql-server rpm -e mysql -nodeps 强制性 添加组和用…

oraclenbsp;表复制

1. 复制表结构及其数据:create table table_name_new as select * from table_name_old ;2. 只复制表结构:create table table_name_new as select * from table_name_old where 12;ORcreate table table_name_new like table_name_old ;3. 只复制表数据…

SparkSQL:使用反射、编程方式将RDD转换为DataFrame

为什么要将RDD转换为DataFrame?因为这样的话,我们就可以直接针对HDFS等任何可以构建为RDD的数据,使用Spark SQL进行SQL查询了。这个功能是无比强大的。想象一下,针对HDFS中的数据,直接就可以使用SQL进行查询。 一、Spa…

Java并发53:并发集合系列-基于独占锁+PriorityBlockingQueue实现的单向阻塞无界延时队列DelayQueue

[超级链接:Java并发学习系列-绪论] [系列序章:Java并发43:并发集合系列-序章] 原文地址:http://cmsblogs.com/?p2413 DelayQueue是一个支持延时获取元素的无界阻塞队列。 里面的元素全部都是“可延期”的元素,列头的元素是最先…

批处理删除指定盘符下的某种文件

echo offecho 正在清除以lng后缀的文件,请稍后。。。 del /a /q e:\*.lng