# react-redux-course-lecture-1
**Repository Path**: reactor/react-redux-course-lecture-1
## Basic Information
- **Project Name**: react-redux-course-lecture-1
- **Description**: 从零开始学习 React & Redux 系列第一讲
- **Primary Language**: JavaScript
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 2
- **Forks**: 0
- **Created**: 2016-12-01
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 从 0 开始学 React
## 开始本课程
```bash
cd ~
mkdir -p worksapce/playground/react-redux-course
cd ~/workspace/playground/react-redux-course
git clone git@git.oschina.net:reactor/react-redux-course-lecture-1.git
cd react-redux-course-lecture-1
npm i --registry=https://registry.npm.taobao.org
npm start
```
## 需求
1. 用户打开网页,可以看到有一个导航条;
2. 在导航条的下面,是一个从上往下排列的资产列表;
3. 用户可以选择某一个资产,查看该资产的详细信息;
4. 用户可以选择并申请使用某一个资产;
5. 用户可以查看自己使用过、申请过以及使用中的所有资产列表。
这样的页面,我们可以打开 [`design.html`](./design.html) 文件,
## 官方示例 create-react-app
```bash
npm install -g create-react-app
create-react-app hello-world
cd hello-world
npm start
```
在接下来的代码示例中,我们可以打开 [Babeljs.io](http://babeljs.io/repl/) 实时的查看自己
编码的代码将被如何运行。
## Hello World - JSX
```es6
import React from 'react';
import ReactDOM from 'react-dom';
ReactDOM.render(
Hello, world!
,
document.getElementById('root')
);
```
在上面代码中,ReactDOM 将 `` 这个组件渲染至 `id` 为 `root` 的 `dom` 元素中。通过
`Babel` 编译后,上面的代码最终看起来会是下面这样的:
```javascript
'use strict';
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _reactDom = require('react-dom');
var _reactDom2 = _interopRequireDefault(_reactDom);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : {
default: obj }; }
_reactDom2.default.render(_react2.default.createElement(
'h1',
null,
'Hello, world!'
), document.getElementById('root'));
```
### 我们知道了什么?
1. 推荐使用 ES6 来写 React 程序;
2. 在浏览器对 ES6 的支持还不完善的情况下,我们需要使用 Babel 工具将 ES6 代码编译成 ES5;
3. Webpack 会帮我们把 ES6 写的代码,通过 Babel 编译后再打包到一个文件里面去;
4. JSX 是好是坏暂且不说,但至少,我不再需要在 HTML 与 JavaScript 里面来回切换了;
5. 一个组件,最终的 `html` 代码只是用来在浏览器展示界面用而已,而它本质上,只是 React 中
一个对象而已。
## 组件化
将 `` 标签提取出来,作成一个组件:
```jsx
import React from 'react';
import ReactDOM from 'react-dom';
function component() {
return Hello, world!
;
}
ReactDOM.render(
component,
document.getElementById('root')
);
```
Babel 编译后的代码如下:
```javascript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _reactDom = require('react-dom');
var _reactDom2 = _interopRequireDefault(_reactDom);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : {
default: obj }; }
function component() {
return _react2.default.createElement(
'h1',
null,
'Hello, world!'
);
}
exports.default = function () {
_reactDom2.default.render(component, document.getElementById('root'));
};
```
但是,上面的代码并不会有任何展示。
### 为什么?
1. 你需要传给 `ReactDOM.render` 的,不是组件本身,而是组件的实例(Instance);
2. 为了与原生的 `html` 标签进行区分,任何一个 `React` 组件,都必须首字母大写;
## 把 `html` 模板转成 JSX 代码
这很简单,有了 JSX,我们可以直接在 `javascript` 中写 `HTML`,所以,直接复制`design.html`
中 `body` 元素以内的内容至 `js` 文件即可,点击 [src/design-jsx.js](src/design-jsx.js)
文件,可以看到我们转换后在JSX代码,然后到浏览器中查看。
这个时候, `terminal` 中应该报错了:
```bash
ERROR in ./src/design-jsx.js
Module build failed: SyntaxError: Adjacent JSX elements must be wrapped in an
enclosing tag
```
为什么?
1. 任何一个组件,最终都只允许被包裹在一个元素中,不允许由多个并行的元素展示一个组件;
2. `class` 是 `ES6` 中的关键字,它和 `es6` 中 **类** `class` 冲突,我们需要换成
`className` 代替,同样的,在写表单的时候,还有一个 `