- 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 APP中引入事件
- ReactJS - 状态管理
- ReactJS - 状态管理 API
- ReactJS - 无状态组件
- ReactJS - 使用 React Hooks 进行状态管理
- ReactJS - 使用 React 钩子的组件生命周期
- ReactJS - 组件的布局
- ReactJS - 分页
- ReactJS - Material 用户界面
- ReactJS - Http 客户端编程
- ReactJS - 表单编程
- ReactJS - 受控组件
- ReactJS - 不受控制的组件
- ReactJS - Formik
- ReactJS - 条件渲染
- ReactJS - 列表
- ReactJS - 键
- ReactJS - 路由
- ReactJS - 冗余
- ReactJS - 动画
- ReactJS - 引导程序
- ReactJS - 地图
- ReactJS - 表格
- ReactJS - 使用 Flux 管理状态
- ReactJS - 测试
- ReactJS - CLI 命令
- ReactJS - 构建和部署
- ReactJS - 示例
- ReactJS - 钩子简介
- ReactJS - 使用 useState
- ReactJS - 使用 useEffect
- ReactJS - 使用 useContext
- ReactJS - 使用 useRef
- ReactJS - 使用 useReducer
- ReactJS - 使用 useCallback
- ReactJS - 使用 useMemo
- ReactJS - 自定义钩子
- ReactJS - 可访问性
- ReactJS - 代码拆分
- ReactJS - 上下文
- ReactJS - 错误边界
- ReactJS - 转发引用
- ReactJS - 片段
- ReactJS - 高阶组件
- ReactJS - 与其他库集成
- ReactJS - 优化性能
- ReactJS - 分析器 API
- ReactJS - 门户
- ReactJS - 没有 ES6 ECMAScript 的 React
- ReactJS - 没有 JSX 的 React
- ReactJS - 协调
- ReactJS - 引用和 DOM
- ReactJS - 渲染属性
- ReactJS - 静态类型检查
- ReactJS - 严格模式
- ReactJS - Web 组件
- ReactJS - 日期选择器
- ReactJS - Helmet
- ReactJS - 内联样式
- ReactJS - 属性类型
- ReactJS - 浏览器路由器
- ReactJS - DOM
- ReactJS - 旋转木马
- ReactJS - 图标
- ReactJS - 表单组件
- ReactJS - 参考 API
ReactJS - 没有 ES6 ECMAScript 的 React
根据 Ecma International,ECMAScript 是一种通用的、供应商中立的和跨平台的编程语言。Ecma International 定义了 ECMAScript 语言的语法、其特性和语言的各个方面,并将其作为 ECMAScript 规范发布。JavaScript 是 ECMAScript 的流行实现之一,用于浏览器中的客户端编程。
ECMAScript 的最新规范是 ECMAScript 2022,最流行的规范是 ECMAScript 2015 语言规范,也称为 ES6。即使几乎所有现代浏览器都支持 ES6,旧版浏览器仍然缺乏对 ES6 的浏览器支持。现在,在客户端脚本中使用 ES6 特性被认为是安全的。
React 应用程序可以使用 ES6 语言规范进行开发。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-class 包安装到我们新创建的应用程序中,如下所示 -
现在,通过运行以下命令来运行应用程序,
npm start
让我们看看如何使用 ES5 (myapp/src/components/ES5/HelloWorldES6.js) 和 ES6 语法 (myapp/src/components/ES5/HelloWorldES6.js) 创建一个简单的 你好 世界组件,并了解使用 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;
应用程序的输出如下
设置 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 对象。