书中提到的代码下载来源
https://github.com/mocheng/react-and-redux
React是一个JavaScript语言的工具库
React的创建者Facebook提供了一个快速开发React应用的工具,名叫create-react-app。create-react-app是一个通过npm发布的安装包。通过创建一个已经完成基本配置的应用,让开发者快速开始React应用的开发。
在确认Node.js和npm安装好之后,命令行中执行下面的命令安装
create-react-app
npm install –-global create-react-app
注意: 安装后会得到一个警告。表示安装的tar版本不再维护,你可以使用 npm i tar 命令安装最新的版本
npm WARN deprecated tar@2.2.2:
This version of tar is no longer supported, and will not receive security updates.
Please upgrade asap.
安装过程结束之后,你的电脑中就会有 create-react-app 这样一个可以执行的命令,这个命令会在当前目录下创建指定参数名的应用目录。
我们在命令行中执行下面的命令:
create-react-app first_react_app
这个命令会在当前目录下创建一个名为 first_react_app 的目录,在这个目录中会自动添加一个应用的框架,随后我们只需要在这个框架的基础上修改文件就可以开发React应用
在执行以上命令后,根据提示,输入下面的命令:
cd first_react_app
npm start
这个命令会启动一个开发模式的服务器,同时也会让你的浏览器自动打开了一个网页
增加一个新的React组件
一个基本的点击计数组件
import React, { Component } from 'react';
//import是ES6(EcmaScript6)语法中导入文件模块的方式
//不导入react将会报错,在使用JSX的代码文件中,即使代码中并没有直接使用React,
//也一定要导入这个React,这是因为JSX最终会被转译成依赖于React的表达式。
class ClickCounter extends Component {
//用的是ES6语法来创建一个叫ClickCounter的组件类,
//ClickCounter的父类就是Component
constructor(props) {
super(props);
this.onClickButton = this.onClickButton.bind(this);
this.state = {count: 0};
}
onClickButton() {
this.setState({count: this.state.count + 1});
}
render() {
return (
<div>
<button onClick={this.onClickButton}>Click Me</button>
<div>
Click Count: {this.state.count}
</div>
</div>
);
}
}
//导出组件
export default ClickCounter;
导入组件的方式
import ClickCounter from './ClickCounter'
//使用组件
ReactDOM.render(
<React.StrictMode>
<ClickCounter />
</React.StrictMode>,
document.getElementById('root')
);
除了在组件中定义交互行为,我们还可以在React组件中定义样式,我们可以修改ClickCounter.js中的render函数,代码如下:
render() {
const counterStyle = {
margin: '16px'
}
return (
<div style={counterStyle}> //这里插入样式
<button onClick={this.onClickButton}>Click Me</button>
<div>
Click Count:
<span id=”clickCount”>{this.state.count}</span>
</div>
</div>
);}
JSX
所谓JSX,是JavaScript的语法扩展(eXtension),让我们在JavaScript中可以编写像HTML一样的代码。在ClickCounter.js的render函数中,就出现了类似这样的HTML代码,在index.js中,ReactDOM.render的第一个参数也是一段JSX代码。
在JSX中使用的“元素”不局限于HTML中的元素,可以是任何一个React组件
React判断一个元素是HTML元素还是React组件的原则就是看第一个字母是否大写,react中组件首字母为大写。
根据做同一件事的代码应该有高耦合性的设计原则,既然我们要实现一个ClickCounter,那为什么不把实现这个功能的所有代码集中在一个文件里呢?
看一看package.json中对start脚本的定义,如下所示:
scripts": {
"start": "react-scripts start", 启动react应用
"build": "react-scripts build", 创建生产环境优化代码
"test": "react-scripts test --env=jsdom", 单元测试
"eject": "react-scripts eject"
//eject(弹射)命令把潜藏在react-scripts中的一系列技术栈配置都“弹射”到应用的顶层,
//然后我们就可以研究这些配置细节了,
//而且可以更灵活地定制应用的配置。eject命令是不可逆的npm run eject
}
React的理念,归结为一个公式,就像下面这样:
UI=render(data)
React工作方式的优点
React利用函数式编程的思维来解决用户界面渲染的问题,最大的优势是开发者的效率会大大提高,开发出来的代码可维护性和可阅读性也大大增强。React等于强制所有组件都按照这种由数据驱动渲染的模式来工作,无论应用的规模多大,都能让程序处于可控范围内。
小结
React利用声明式的语法,让开发者专注于描述用户界面“显示成什么样子”,而不是重复思考“如何去显示”,这样可以大大提高开发效率,也让代码更加容易管理。
虽然React是通过重复渲染来实现动态更新效果,但是借助Virtual DOM技术,实际上这个过程并不牵涉太多的DOM操作,所以渲染效率很高。
[1]程墨.深入浅出React和Redux[M].北京:机械工业出版社·华章图文,2017.