React的历史与应用
应用场景
- 前端应用开发,如
Netflix网页版- 移动端原生应用,如
Android、IOS的app- 结合
Electron,进行桌面应用开发
发展历史
- 2010年
Facebook在其 php 生态中,引入了xhp框架,首次引入了组合式组件的思想,启发了后来的React的设计。 - 2011年 Jordan Walke 创造了
FaxJS,也就是后来的React原型:
- 2012年在
Facebook收购Instagram后,该FaxJS项目在内部得到使用, Jordan Walke 基于FaxJS的经验开发出了React - 2014年-今天 生态大爆发,各种围绕
React的新工具/新框架开始涌现
React的设计思路
UI编程的痛点
- 状态更新的时候,
UI不会自动更新,需要手动调用DOM接口进行更新- 欠缺基本的代码层面的封装和隔离,代码层面没有组件化
UI之间的数据依赖关系,需要手动维护,如果依赖链路长,则会遇到回调地狱
React的出现,就是为了解决这三大痛点
响应式与转换式
- 转换式系统:给定输入求解输出,比如编译器的实现,数值计算等场景
- 响应式系统:监听事件,由消息驱动,需要有一个监控系统去关注事件,并对事件做出响应,更新
UI界面
响应式编程
- 状态更新,
UI也会进行更新- 前端代码组件化,可复用,可封装
- 状态之间的互相依赖关系,只需声明即可
组件化
用树状结构表示组件之间的关系
- 组件是组件的组合/原子组件
- 组件内拥有自己的状态,外部不可见
- 父组件可将状态传入组件内部
状态归属问题
下面这个图中,右上角的当前价格数据应当归属到那个组件去管理?
答案是属于根节点Root,因为这个属性会被多个子组件共享
这也导致了一个问题,当多个子组件需要共享数据的时候,就得将共享数据提升到父组件中,这其实是不好的
既然现在知道当前价格是由Root结点管理的,那子组件需要修改当前价格时该怎么办呢?
由于在js中,函数是一等公民,所以可以将函数也作为属性传递给子组件,那么就可以在Root组件中定义一个修改当前价格的函数,然后将这个函数传给子组件,当子组件需要修改当前价格时,就调用该函数即可
组件设计
- 组件声明了状态和
UI的映射- 组件有
Props/State两种状态,前者是父组件传入的数据,后者是组件内部维护的数据- 组件可由其他组件拼装而成
总结
学习了响应式系统与 React 后,我深刻认识到了构建灵活、高效的前端应用所需的关键概念和技能。响应式系统和 React 作为现代前端开发的核心,不仅让我理解了数据流管理的重要性,还使我能够更好地构建用户友好的界面。
首先,通过学习响应式系统,我了解了数据驱动开发的理念。学习了响应式编程库(如RxJS)和状态管理工具(如Redux),我能够将应用的状态与用户界面进行关联,实现数据和界面的自动同步。这使得应用的维护变得更加容易,同时也能够更好地处理异步操作。
其次,学习了 React,我深入了解了组件化开发和虚拟DOM的概念。React 的组件化开发模式使我能够将界面划分为多个独立的组件,提高了代码的可维护性和重用性。虚拟DOM的引入减少了对真实DOM的频繁操作,提高了性能,使界面渲染更加高效。
另外,我掌握了在 React 中进行状态管理的技巧。学习了状态提升、Context API、Redux 等,我可以更好地管理组件之间的状态共享和通信,确保应用的数据流畅和一致。
然而,学习响应式系统与 React 也有一些挑战。对于初学者来说,掌握虚拟DOM和响应式编程等概念可能需要一些时间。同时,在使用状态管理工具时,合理地组织状态和处理副作用也需要一定的实践和经验。
总的来说,学习了响应式系统与 React 是我在前端开发中的重要一步。通过理解数据流管理的原理,我能够更好地设计和构建前端应用,提升用户体验和开发效率。将来,我将继续深入研究和应用这些知识,不断提升自己在前端开发领域的能力。