Skip to content

React 简介

React 是一个用于构建用户界面的 JavaScript 库,特别是为单页应用(SPA)设计的数据渲染。它由 Facebook 开发和维护,并且已经成为最流行的前端库之一。以下是关于 React 框架的一些关键概念:

组件

React 应用程序是由多个组件构成的,每个组件都有自己的逻辑和控制。组件可以被嵌套和组合以创建复杂的 UI。它们是可重用的,意味着相同的组件可以在不同的地方使用多次。

JSX

JSX 是 JavaScript XML 的缩写,它是一种语法扩展,允许你在 JavaScript 中编写看起来像 HTML 的代码。JSX 不是必需的,但它是与 React 一起使用的常见实践,因为它使得模板更易于阅读和编写。

虚拟 DOM

React 使用虚拟 DOM 来提高性能。当状态改变时,React 会首先在虚拟 DOM 中更新这些变化,然后计算出最小的一组必要的真实 DOM 操作,最后将这些变更应用到浏览器的 DOM 中。

单向数据流

React 实现了单向数据绑定,这意味着数据总是从父元素流向子元素。这种模式简化了调试,因为你不需要追踪双向绑定可能引发的状态不一致问题。

状态管理和生命周期

React 组件可以有状态(state),状态是一个对象,它保存了一些信息,这些信息可能会随时间而改变。React 还定义了一系列的生命周期方法,允许开发者在特定的时间点执行代码,例如组件加载、更新或卸载时。

钩子 (Hooks)

自 React 16.8 起引入的 Hooks 让函数组件也可以拥有状态和其他特性,而无需转换成类组件。常见的钩子包括 useStateuseEffect,它们分别用来添加状态和处理副作用。

生态系统

React 有一个庞大的生态系统,包含了许多第三方库和工具,如用于路由的 React Router,用于状态管理的 Redux 或 MobX,以及样式解决方案如 styled-components。

性能优化

React 提供了一些内置的方法来优化性能,比如应该组件通过 React.memo 来避免不必要的重新渲染,或者使用 useCallbackuseMemo 来缓存昂贵的计算结果。

对比 Vue

React 和 Vue 都是流行的前端框架/库,用于构建用户界面。它们有一些相似之处,但也存在关键差异。以下是 React 与 Vue 的一些对比:

学习曲线

  • Vue:通常被认为有更平缓的学习曲线,尤其对于那些已经熟悉 HTML、CSS 和 JavaScript 的开发者来说。它的文档清晰且详尽,容易上手。
  • React:由于其独特的概念如 JSX 和单向数据流,初学者可能需要更多时间来适应。此外,React 生态系统的广度也可能增加学习难度。

模板语法

  • Vue:使用基于 HTML 的模板语法,允许直接在 DOM 元素中绑定指令(例如 v-bindv-on)。这使得 Vue 对传统的 Web 开发人员来说非常直观。
  • React:采用 JSX,这是一种类似于 HTML 的 JavaScript 语法扩展,它允许你将标记写入 JavaScript 逻辑中。虽然这不是必需的,但大多数情况下 JSX 是首选。

组件化

两者都强调组件化开发,但是实现方式有所不同:

  • Vue:提供了单文件组件(SFC),每个.vue文件可以包含模板、脚本和样式,所有这些都在一个地方定义,便于组织代码。
  • React:通常将模板(通过 JSX)、逻辑和样式分开在不同的文件中,尽管也可以使用 CSS-in-JS 解决方案将它们合并在一起。

数据绑定

  • Vue:支持双向数据绑定,这意味着你可以轻松地创建输入控件,使模型自动更新视图,并让视图的变化反映回模型。
  • React:主要遵循单向数据流模式,要求显式地管理状态和事件处理程序来同步 UI 和数据源。

生态系统

  • Vue:拥有官方支持的工具链,如 Vue CLI、Vuex(状态管理)和 Vue Router(路由管理),以及丰富的第三方插件。
  • React:生态系统更为分散,社区提供了大量的库和工具,如 Create React App、Redux(状态管理)、React Router 等。选择合适的库组合可能会增加项目配置的复杂性。

性能

两者都有高效的虚拟 DOM 实现,并且性能差异通常取决于具体的应用场景和优化程度。一般来说,两者的性能都非常好,在实际应用中很难分出高下。

社区和支持

  • Vue:有一个活跃的社区和来自 Evan You 及其团队的良好官方支持。
  • React:由 Facebook 维护,背后有着庞大的社区和企业级的支持,包括 Airbnb、Netflix 等大公司广泛采用。

发展趋势

  • Vue:持续更新,不断推出新功能和改进。
  • React:作为先行者之一,React 也在不断创新,引入了像 Hooks 这样的特性以保持竞争力。

总的来说,选择 React 还是 Vue 往往取决于个人或团队的偏好、项目的特定需求以及现有技术栈等因素。如果你正在寻找一个易于上手且具有强大官方工具链的选择,Vue 可能是不错的选择;而如果你喜欢更大的灵活性并且不介意花时间去探索和配置最佳实践,那么 React 可能更适合你。

Hello React

以下是一个简单的 Hello React 的例子,它使用 React 的核心库和 DOM 库 ReactDOM 来创建一个简单的页面。

html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>React CDN Example</title>
    <!-- React 核心库,与宿主环境无关 -->
    <script src="https://unpkg.com/react@16/umd/react.development.js"></script>
    <!-- 依赖核心库,将核心功能与页面结合 -->
    <script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
  </head>
  <body>
    <div id="root"></div>
    <script>
      // 创建元素
      var h1 = React.createElement("h1", { title: "h1 tag" }, "Hello React!");
      ReactDOM.render(h1, document.getElementById("root"));
    </script>
  </body>
</html>

React.createElement

React.createElement 是 React 的核心函数,用于创建 React 元素。它接受三个参数:

  • type:元素的类型,可以是标签名、组件类、函数等。
  • props:元素的属性,如 class、id、style、事件等。
  • children:元素的子元素,可以是字符串、数字、React 元素、数组等。

它返回一个 React 元素,该元素描述了要渲染的组件。

ReactDOM.render

ReactDOM.render 是 ReactDOM 的核心函数,用于将 React 元素渲染到 DOM 中。它接受两个参数:

  • element:要渲染的 React 元素。
  • container:要渲染的 DOM 元素。

ReactDOM.render 将 React 元素渲染到指定的 DOM 元素中。它将 React 元素转换为 HTML,并插入到指定的 DOM 元素中。

JSX 语法

JSX 是 JavaScript XML 的缩写,它是一种语法扩展,允许你在 JavaScript 中编写看起来像 HTML 的代码。JSX 不是必需的,但它是在 React 中使用的常见实践,因为它使得模板更易于阅读和编写。需要注意的是,JSX 需要通过 Babel 转换为 JavaScript 代码才能运行。

以下是一个简单的示例,展示了如何使用 JSX 创建一个 React 元素并渲染到 DOM 中:

html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>React CDN Example</title>
    <!-- React 核心库,与宿主环境无关 -->
    <script src="https://unpkg.com/react@16/umd/react.development.js"></script>
    <!-- 依赖核心库,将核心功能与页面结合 -->
    <script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
    <!-- 编译JSX -->
    <script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>
  </head>
  <body>
    <div id="root"></div>
    <!-- 编译JSX -->
    <script type="text/babel">
      // 创建元素
      var h1 = <h1 title="h1 tag">Hello React!</h1>;
      ReactDOM.render(h1, document.getElementById("root"));
    </script>
  </body>
</html>

Released under the MIT License.