写点什么

React 有什么优势?这里有一份入门指南

  • 2019-10-29
  • 本文字数:2885 字

    阅读完需:约 9 分钟

React 有什么优势?这里有一份入门指南

当 React 刚开始红的时候,一直觉得 JSX 的设计思想极其独特,属于革命性的创新,它性能出众,代码逻辑却非常简单,所以,受到很多开发者的关注和使用,认为它可能是将来 Web 开发的主流工具。


React 最早起源于 Facebook 的一个内部项目,因为公司对现有的 JavaScript MVC 框架都不满意,就决定自己开发一套,用来架设 Instagram 的网站。开发完成后,发现这套东西很好用,就在 2013 年 5 月开源了。

React 优势在哪里呢?


首先:虚拟 DOM,在 DOM 树的状态需要发生变化时,虚拟 DOM 机制会将同一 Event loop 前后的 DOM 树进行对比,如果两个 DOM 树存在不一样的地方,那么 React 仅仅会针对这些不一样的区域来进行响应的 DOM 修改,从而实现最高效的 DOM 操作和渲染。


比如,我们修改了 DOM 树上一些节点或 UI 组件对应绑定的 state,React 会即刻将其标记为“脏状态”,在一个 Event loop 结束时,React 会计算得出 DOM 树上需要修改的地方及其最终的状态,并仅仅针对这些地方进行一次性的重新渲染。


好处显而易见,并非每修改一次组件的 state,就会重新渲染一次,而是在 Event loop 结束后做一次计算,减少冗余的 DOM 操作。另外 React 只针对需要修改的地方来做新的渲染,而非重新渲染整个 DOM 树,自然效率很高。


其次:组件可嵌套,而且,可以模版化 —— 其实在 React 里提及的“组件”,常规是一些可封装起来、复用的 UI 模块,可以理解为“带有细粒度 UI 功能的部分 DOM 区域”。然后我们可以把这些组件层层嵌套起来使用,当然这样组件间会存在依赖关系。


至于模块化,类似于 ejs 那样可以作为独立的模块被引用到页面上来复用,它可以直接把 UI 组件当作脚本模块那样来使用,完全可以配合 CommonJS、AMD、CMD 等规范来 require 需要的组件模块,并处理好它们的依赖关系。


基于上述的两点,React 很自然的就获得一部分开发者的青睐。不过在这之前得先理清两件事情:


  1. React 是一个纯 View 层,不擅长于和动态数据打交道,因此它不同于,也替代不了常规的框架;

  2. React 很擅长于处理组件化的页面,在页面上搭组件的形式有点像搭积木一样,因此用上 React 的项目需求常规为界面组件化。

React 组件特征

简单点说,React 组件应该具有如下特征:



(1)可组合(Composeable):一个组件易于和其它组件一起使用,或者嵌套在另一个组件内部。如果一个组件内部创建了另一个组件,那么说父组件拥有它创建的子组件,通过这个特性,一个复杂的 UI 可以拆分成多个简单的 UI 组件;


(2)可重用(Reusable):每个组件都是具有独立功能的,它可以被使用在多个 UI 场景;


(3)可维护(Maintainable):每个小的组件仅仅包含自身的逻辑,更容易被理解和维护;


组件化一直是网页开发的利器,许多开发者最希望能够最大程度的重复使用过去的开发的组件,避免重复造轮子。在 React 中组件就是一切,前端开发可能需要花点时间转变思维,尤其过去我们往往习惯将 HTML 、CSS 和 JavaScript 分离,现在却要把它们都封装在一起。

React Component 书写的两种方式

以下是一般 React Component 书写的主要两种方式:


1.使用 ES6 的 Class


//  注意组件首字母需要大写class MyComponent extends React.Component {  // render 是 Class based 元件唯一必須的方法(method)  render() {    return (      <div>Hello, World!</div>    );  }}// 將 <MyComponent /> 组件插入 id 為 app 的 DOM 元素中ReactDOM.render(<MyComponent/>, document.getElementById('app'));
复制代码


2.使用 Functional Component 写法


<!DOCTYPE html><html>  <head>    <meta charset="UTF-8" />    <title>Hello React!</title>    <!-- 請先载入 index.html 中引入 react.js, react-dom.js 和 babel-core 的 browser.min.js -->    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.0.1/react.min.js"></script>    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.0.1/react-dom.min.js"></script>    <script src="https://cdnjs.cloudflare.com/ajax/libs/babel-core/5.8.23/browser.min.js"></script>  </head>  <body>    <div id="example"></div>    <script type="text/babel">      // 代码写在这里!      ReactDOM.render(        <h1>Hello, world!</h1>,        document.getElementById('example')      );    </script>  </body></html>
复制代码


前面说到 React 有独有的 JSX 语法,那么到底什么是 JSX 呢?


JSX 在 ECMAScript 的基础上提供了类似于 XML 的扩展。 JSX 和 HTML 有点像,但也有不一样的地方。例如,HTML 中的 class 属性在 JSX 中 为 className。其他不一样的地方,你可以参考 FB 的 HTML Tags vs. React Components 这篇文章。


但是由于浏览器原生并不支持 JSX,因此我们需要将其编译为 JS,有很多方法能够 完成这个任务,后面我们会提到这些方法。此外,Babel 也能够讲 JSX 编译为 JS。


一些参考资料:


  • JSX in depth

  • Online JSX compiler

  • Babel: How to use the react transformer

JSX 两种使用方式

一般而言 JSX 通常有两种使用方式:


1.使用 browserify 或 webpack 等 CommonJS bundler 并整合 babel 预处理


2.在浏览器端做解析


请大家注意 JSX 的语法书写方式:


<!DOCTYPE html><html>  <head>    <meta charset="UTF-8" />    <title>Hello React!</title>    <!-- 請先载入 index.html 中引入 react.js, react-dom.js 和 babel-core 的 browser.min.js -->    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.0.1/react.min.js"></script>    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.0.1/react-dom.min.js"></script>    <script src="https://cdnjs.cloudflare.com/ajax/libs/babel-core/5.8.23/browser.min.js"></script>  </head>  <body>    <div id="example"></div>    <script type="text/babel">      // 代码写在这里!      ReactDOM.render(        <h1>Hello, world!</h1>,        document.getElementById('example')      );    </script>  </body></html>
复制代码


一般载入 JSX 方式有:

內嵌

<script type="text/babel">  ReactDOM.render(    <h1>Hello, world!</h1>,    document.getElementById('example')  );</script>
复制代码

从外部引入

  <script type="text/jsx" src="main.jsx"></script>   
复制代码


总结:以上都是我对 React 简单的了解,包括 React 的优势、组件化的特征、React Component 的方法、以及 React 中为何要使用 JSX,以及 JSX 基本概念和用法。在 React 里,所有的事物都是以 Component 为基础,通常会将同一个 Component 相关的资源放在一起,而在撰写 React Component 时我们常会使用 JSX 的方式来提升书写效率。


JSX 是一种语法类似 XML 的 ECMAScript 语法扩充,可以发挥 JavaScript 的强大能力,放弃蹩脚的模板语言。当然 JSX 并非强制使用,你也可以选择不用,因为最终 JSX 的内容都会转化成 JavaScript。


以上就是对 React 入门的部分理解。


本文转载自公众号云加社区(ID:QcloudCommunity)。


原文链接:


https://mp.weixin.qq.com/s/c1Z_JCGfkZvZK4xLtCMjIQ


2019-10-29 10:491840

评论

发布
暂无评论
发现更多内容

OpenHarmony后代组件双向同步,跨层级传递:@Provide装饰器和@Consume装饰器

OpenHarmony开发者

我在前端写Java SpringBoot项目 | 京东云技术团队

京东科技开发者

MySQL Node Nest.js 企业号10月PK榜 Sequelize

建立可观测性宏观认知-从概念到过去10年的实践发展

刘绍

运维 软件工程 可观测性 基础架构

九章云极DataCanvas公司入选可信开源大模型产业推进方阵首批成员

九章云极DataCanvas

济源钢铁∣数智化转型实现超越周期的增长

用友BIP

智能制造

什么是 API 以及电子商务网站为何使用它们

Noah

电商 数据api API 安全

QCA9880 (WiFi 5) and QCN9074/QCN9024 (WiFi 6) Move towards the future of industrial wireless networking

wifi6-yiyi

QCA9880 QCN9024 WiFi 5 WiFi 6

鞍钢集团财务共享平台部长高歌:与用友共建财务共享领先实践

用友BIP

2023全球商业创新大会

Tongsuo 8.4.0-pre3 发布!

铜锁开源密码库

开源 算法 安全 同态加密 密码学

Apache Kyuubi & Celeborn,助力 Spark 拥抱云原生

阿里云大数据AI技术

云原生

新华网专访樊冠军:让YonGPT成为企业服务领域的高智商、全能型选手

用友BIP

2023全球商业创新大会

Spring扩展-Aware

Infuse for Mac(音视频播放器) 7.6.1完整激活版

mac

苹果mac Windows软件 Infuse 多媒体播放软件

Databend 开源周报第 114 期

Databend

聊聊技术之外的面试问题-下

老张

面试 职场成长

从内核世界透视 mmap 内存映射的本质(源码实现篇)

bin的技术小屋

Linux 操作系统 内存管理 Linux Kenel mmap内存映射

Parallels Desktop 18 for Mac(pd18虚拟机) 18.3.2完美激活版

mac

Parallels Desktop 18 pd 18 苹果mac Windows软件

用友BIP商业网络-银企联助力新钢联集团结算效率高效提升

用友BIP

银企联

全球采购,打造企业韧性供应链

用友BIP

全球采购

软件开发项目管理体系,支撑体系,测试体系文档大全

金陵老街

“套壳”OpenAI,注定消亡!全球首个 20 万字大模型发布丨 RTE 开发者日报 Vol.63

声网

人工智能 RTE 实时互动

HarmonyOS跨进程通信—IPC与RPC通信开发指导

HarmonyOS开发者

CHM文件阅读器 CHM Viewer Star 免激活最新版

mac大玩家j

Mac软件 文件阅读器 文件管理软件

深入理解线段树 | 京东物流技术团队

京东科技开发者

数据结构 数据结构与算法 线段树 企业号10月PK榜

9月《中国数据库行业分析报告》已发布,47页干货带你详览 MySQL 崛起之路!

墨天轮

MySQL 数据库 oceanbase 国产数据库 StoneDB

Mac电脑视频处理软件 VideoProc Converter 4K直装中文版

胖墩儿不胖y

Mac软件 视频处理工具 视频工具

代码理解技术应用实践介绍

百度Geek说

数据库 百度 企业号10月PK榜 代码理解

IDEA工具第一篇:细节使用-习惯设置 | 京东云技术团队

京东科技开发者

Mac windows IDEA 企业号10月PK榜

直播预约丨《实时湖仓实践五讲》第二讲:实时湖仓功能架构设计与落地实战

袋鼠云数栈

大数据 数据中台 湖仓一体 实时湖仓 直播课程

交易履约之结算平台实践 | 京东云技术团队

京东科技开发者

架构 系统设计 企业号10月PK榜 交易履约 系统建设

数据库进阶教程:数据模型、索引与并发控制

百度开发者中心

React 有什么优势?这里有一份入门指南_文化 & 方法_卢文喆_InfoQ精选文章