ReactJS 教程

ReactJS - 主页 ReactJS - 简介 ReactJS - 路线图 ReactJS - 安装 ReactJS - 功能 ReactJS - 优势和缺点 ReactJS - 架构 ReactJS - 创建 React 应用程序 ReactJS - JSX ReactJS - 组件 ReactJS - 嵌套组件 ReactJS - 使用组件 ReactJS - 集合组件 ReactJS - 样式 ReactJS - 属性 (props) ReactJS - 使用属性创建组件 ReactJS - props 验证 ReactJS - 构造函数 ReactJS - 组件生命周期 ReactJS - 事件管理 ReactJS - 创建事件感知组件 ReactJS - Expense Manager 事件 ReactJS - 状态管理 ReactJS - 状态管理 API ReactJS - 无状态组件 ReactJS - Hooks 进行状态管理 ReactJS - Hooks 的组件生命周期 ReactJS - 布局组件 ReactJS - 分页 ReactJS - Material UI ReactJS - Http 客户端编程 ReactJS - 表单编程 ReactJS - 受控组件 ReactJS - 非受控组件 ReactJS - Formik ReactJS - 条件渲染 ReactJS - 列表 ReactJS - Key 键 ReactJS - 路由 ReactJS - Redux ReactJS - 动画 ReactJS - Bootstrap ReactJS - Map ReactJS - 表格 ReactJS - 使用 Flux 管理状态 ReactJS - 测试 ReactJS - CLI 命令 ReactJS - 构建和部署 ReactJS - 示例

Hooks

ReactJS - Hooks 简介 ReactJS - 使用 useState ReactJS - 使用 useEffect ReactJS - 使用 useContext ReactJS - 使用 useRef ReactJS - 使用 useReducer ReactJS - 使用 useCallback ReactJS - 使用 useMemo ReactJS - 自定义 Hooks

ReactJS 高级

ReactJS - 可访问性 ReactJS - 代码拆分 ReactJS - 上下文 ReactJS - 错误边界 ReactJS - 转发 Refs ReactJS - 片段 ReactJS - 高阶组件 ReactJS - 与其他库集成 ReactJS - 优化性能 ReactJS - Profiler API ReactJS - Portals ReactJS - 不使用 ES6 ECMAScript ReactJS - 不使用 JSX 的 React ReactJS - Reconciliation ReactJS - Refs 和 DOM ReactJS - 渲染道具 ReactJS - 静态类型检查 ReactJS - 严格模式 ReactJS - Web 组件

其他概念

ReactJS - 日期选择器 ReactJS - Helmet ReactJS - 内联样式 ReactJS - PropTypes ReactJS - BrowserRouter ReactJS - DOM ReactJS - 轮播 ReactJS - 图标 ReactJS - 表单组件 ReactJS - 参考 API

ReactJS 有用资源

ReactJS - 快速指南 ReactJS - 备忘录 Axios - 备忘录 ReactJS - 有用资源 ReactJS - 讨论


ReactJS - 不使用 ES6 ECMAScript

根据 Ecma International,ECMAScript 是一种通用、与供应商无关且跨平台的编程语言。Ecma International 定义了 ECMAScript 语言语法、其特性和语言的各个方面,并将其发布为 ECMAScript 规范。JavaScript 是用于浏览器客户端编程的 ECMAScript 的流行实现之一。

ECMAScript 的最新规范是 ECMAScript 2022,最流行的规范是 ECMAScript 2015 语言规范,也称为 ES6。尽管几乎所有现代浏览器都支持 ES6,但旧版浏览器仍然缺乏对 ES6 的支持。现在,在客户端脚本中使用 ES6 功能被认为是安全的。

可以使用 ES6 语言规范开发 React 应用程序。React 库使用的一些核心 ES6 功能是 ES6 类和 ES6 模块。为了支持不允许 ES5 语法的旧版浏览器,React 提供了使用 ES5 创建组件的替代语法。

创建 React 类 (create-react-class)

create-react-class 是 React 社区提供的一个模块,用于在不使用 ES6 语法的情况下创建新组件。此外,我们应该在当前应用程序中安装 create-react-class 包以使用 ES5 语法。

让我们使用 create-react-app 创建一个 React 应用程序

create-react-app myapp

现在,将 create-react-class 包安装到我们新创建的应用程序中,如下所示 −

npm i create-react-class --save

现在,通过运行以下命令运行应用程序,

cd myapp
npm start

让我们看看如何使用 ES5(myapp/src/components/ES5/HelloWorldES6.js)和 ES6 语法(myapp/src/components/ES5/HelloWorldES6.js)创建一个简单的 hello world 组件,并了解使用时需要做什么ES5 语法。

ES6 语法中的 HelloWorldES6 组件如下 −

import React from 'react'
class HelloWorldES6 extends React.Component {
   render() {
      return <h1>Hello, {this.props.name}</h1>
   }
}
export default HelloWorldES6

可以使用以下代码以 ES5 语法创建相同的组件 (myapp/src/components/ES5/HelloWorldES5.js),如下所示 −

var createReactClass = require('create-react-class');
var HelloWorldES5 = createReactClass({
   render: function() {
      return <h1>Hello, {this.props.name}</h1>;
   }
});
export default HelloWorldES5;

现在,让我们在我们的应用程序(App.js)中使用该组件,如下所示 −

import HelloWorldES5 from "./components/ES5/HelloWorldES5";
import HelloWorldES6 from "./components/ES5/HelloWorldES6";
function App() {
   return (
      <div>
         <HelloWorldES5 name="Peter" />
         <HelloWorldES6 name="John" />
      </div>
   );
}
export default App;

应用程序的输出如下

Create React Class

设置 props 的默认值 (getDefaultProps)

让我们在 ES6 中为 name props 设置一个默认值。

class HelloWorld extends React.Component {
   render() {
      return <h1>Hello, {this.props.name}</h1>;
   }
}
HelloWorld.defaultProps = {
   name: 'John'
}

使用以下语法可以在 ES5 中实现相同的功能

var createReactClass = require('create-react-class');
var HelloWorld = createReactClass({
   render: function() {
      return <h1>Hello, {this.props.name}</h1>;
   },
   getDefaultProps: function() {
      return {
         name: 'John'
      };
   }
});

这里的getDefaultProps是一个特殊的函数,用来设置组件props的默认值。

设置初始状态(getInitialState)

我们知道,this.state可以在组件类的构造函数中使用,来设置状态的初始值。这是ES6类的特性之一。

import React from 'react'
class BookListES6 extends React.Component {
   constructor(props) {
      super(props);
      this.state = {
         list: ['C++ Programming', 'Java Programming']
      };
   }
   render() {
      return <ol>
         {this.state.list && this.state.list.map((item) =>
            <li>{item}</li>
         )}
      </ol>
   }
}
export default BookListES6

可以使用 ES5 语法中的 getInitialState 实现相同的功能,如下所示 −

var createReactClass = require('create-react-class');
var BookListES5 = createReactClass({
   getInitialState: function() {
      return {
         list: ['React Programming', 'Javascript Programming']
      };
   },
   render: function() {
      return <ol>
      {this.state.list && this.state.list.map((item) =>
         <li>{item}</li>
      )}
      </ol>
   }
});
export default BookListES5;

现在,让我们在我们的应用程序(App.js)中使用该组件,如下所示 −

import BookListES6 from "./components/ES5/BookListES6";
import BookListES5 from "./components/ES5/BookListES5";
function App() {
   return (
      <div>
         <BookListES6 />
         <BookListES5 />
      </div>
   );
}
export default App;

应用程序的输出如下

设置初始状态

事件处理程序的自动绑定

我们知道,React 组件类中定义的事件处理程序方法需要在类构造函数中绑定到此对象。伪代码如下

constructor(props) {
   super(props);
   this.state = {message: 'Hello!'};
   // binding of `this` object
   this.handleClick = this.handleClick.bind(this);
}

在 ES5 中,绑定不是必需的,因为函数默认绑定到 this 对象。