React 入门实例 参考阮一峰博客

http://www.ruanyifeng.com/blog/2015/03/react.html

React 可以在浏览器运行,也可以在服务器运行。服务器的用法与浏览器差别不大。

1 hello world程序

**开发环境**visual studio code和谷歌浏览器(谷歌浏览器翻墙安装React Developer Tools)。

1.1 使用 React 开发新项目

前提安装npm工具,Node版本 >= 6
在工作空间,执行以下命令:

1.  npm install -g create-react-app
2.  create-react-app my-app
3.  cd my-app
4.  npm start

然后打开http:// localhost:3000 /查看您的应用程序。

创建React App不处理后端逻辑或数据库; 它只是创建一个前端构建管道,所以你可以将它用于任何你想要的后端。

当您准备部署到生产环境时,运行

npm run build

将在build文件夹中创建应用程序的优化版本。将 src 子目录的 js 文件进行语法转换,转码后的文件全部放在 build 子目录。

结果
在当前文件夹内创建一个目录。my-app
在该目录内,它将生成初始项目结构并安装依赖项:

my-app
├── README.md
├── node_modules
├── package.json
├── .gitignore
├── public
│   └── favicon.ico
│   └── index.html
│   └── manifest.json
└── src└── App.css└── App.js└── App.test.js└── index.css└── index.js└── logo.svg└── registerServiceWorker.js

没有配置或复杂的文件夹结构,只有构建应用程序所需的文件。

安装完成后,您可以打开项目文件夹,编辑目录、文件开发自己的项目(如下面: 修改APP.js)。

如果您更改了代码,该页面将自动重新加载。您将在控制台中看到构建错误和lint警告。

1) APP.js文件中编写Hello world程序

APP.js源码:

import React, { Component } from 'react';class App extends Component {render() {return (<div className="App"><h1 className="App-title">Hello World</h1></div>);}
}export default App;

注意:组件类只能包含一个顶层标签,否则也会报错

1.2 运行现有React项目/框架

一般readme文件中有说明,仔细阅读。运行现有源码包的基本步骤
1) 在项目的目录安装依赖

$ npm install

2) 将src子目录中的所有jsx文件转换为js文件。

$ npm run build

3) 启动http server

$ node server.js

2 render()

render()是 React 的最基本方法用于将模板转为 HTML 语言,并插入指定的 DOM 节点
例如:index.js中将App标签,插入 root节点

ReactDOM.render(<App />,
document.getElementById('root')
);

3 JSX 语法

HTML 语言直接写在 JavaScript 语言之中,不加任何引号,这就是 JSX 的语法,它允许 HTML 与 JavaScript 的混写。
demo2
(项目index.js中修改import App from ‘./demo1’即可运行对应示例)

import React, { Component } from 'react';var names = ['Alice', 'Emily', 'Kate'];class App extends Component{render(){return(<div>{names.map(function (name, index) {return <div key={index}>Hello, {name}!</div>})}</div>)};
}export default App;

JSX 的基本语法规则:遇到 HTML 标签(以 < 开头),就用 HTML 规则解析;遇到代码块(以 { 开头),就用 JavaScript 规则解析。
JSX 允许直接在模板插入 JavaScript 变量。如果这个变量是一个数组,则会展开这个数组的所有成员。JSX 会把它的所有成员,添加到模板。
demo03

import React, { Component } from 'react';var arr = [<h1>Hello world!</h1>,<h2>React is awesome</h2>,];class App extends Component{render(){return(<div><div>{arr}</div></div>)};
}export default App;

4 组件

React 允许将代码封装成组件(component),然后像插入普通 HTML 标签一样,在网页中插入这个组件。class关键字用于生成一个组件类。
demo04

import React, { Component } from 'react';class App extends Component{render(){return(<div><HelloMessage name="pengwei" />,</div>)};
}class HelloMessage extends Component{render() {return <h1>Hello {this.props.name}</h1>;}}export default App;

上面代码中,变量 HelloMessage 就是一个组件类。模板插入 时,会自动生成 HelloMessage 的一个实例(下文的”组件”都指组件类的实例)。所有组件类都必须有自己的 render 方法,用于输出组件。

注意,组件类的第一个字母必须大写,否则会报错,比如HelloMessage不能写成helloMessage。另外,组件类只能包含一个顶层标签,否则也会报错。

组件的用法与原生的 HTML 标签完全一致,可以任意加入属性,比如 ,就是 HelloMessage 组件加入一个 name 属性,值为 John。组件的属性可以在组件类的 this.props 对象上获取,比如 name 属性就可以通过 this.props.name 读取。

注意,添加组件属性, class 属性需要写成 className ,for 属性需要写成 htmlFor ,这是因为 class 和 for 是 JavaScript 的保留字。

5 this.props.children

this.props 对象的属性与组件的属性一一对应,但是有一个例外,就是 this.props.children 属性,它表示组件的所有子节点
demo05

import React, { Component } from 'react';class App extends Component{render(){return(<div><Parent><span>hello</span><span>world</span></Parent></div>)};
}class Parent extends Component{render(){return(<ol>{React.Children.map(this.props.children,function(child){return <li>{child}</li>;})}</ol>)};
}export default App;

注意, this.props.children 的值有三种可能:如果当前组件没有子节点,它就是 undefined ;如果有一个子节点,数据类型是 object ;如果有多个子节点,数据类型就是 array 。所以,处理 this.props.children 的时候要小心。
React 提供一个工具方法 React.Children 来处理 this.props.children 。我们可以用 React.Children.map 来遍历子节点,而不用担心 this.props.children 的数据类型

6 PropTypes和DefaultProps

组件的属性可以接受任意值,字符串、对象、函数等等都可以。有时,我们需要一种机制,验证别人使用组件时,提供的参数是否符合要求。
- PropTypes属性,就是用来验证组件实例的属性是否符合要求
- DefaultProps 方法可以用来设置组件属性的默认值
demo06

import React, { Component } from 'react';
import PropTypes from 'prop-types';class App extends Component{render(){return(<div><DefaultMessage /></div>);};
}class DefaultMessage extends Component{render() {return (<h1>Hello {this.props.name}</h1>);}}DefaultMessage.propTypes = {name: PropTypes.string
};DefaultMessage.defaultProps ={name : 'World'}export default App;

7 获取真实的DOM节点

组件并不是真实的 DOM 节点,而是存在于内存之中的一种数据结构,叫做虚拟 DOM (virtual DOM)。只有当它插入文档以后,才会变成真实的 DOM 。根据 React 的设计,所有的 DOM 变动,都先在虚拟 DOM 上发生,然后再将实际发生变动的部分,反映在真实 DOM上,这种算法叫做 DOM diff ,它可以极大提高网页的性能表现
但是,有时需要从组件获取真实 DOM 的节点,这时就要用到 ref 属性
demo07

import React, { Component } from 'react';class App extends Component{render(){return(<div><TrueDom /></div>);};
}class TrueDom extends Component{constructor(props) {super(props);// This binding is necessary to make `this` work in the callbackthis.handleClick = this.handleClick.bind(this);}handleClick() {this.refs.myTextInput.focus();};render() {return(<div><input type="text" ref="myTextInput" /><input type="button" value="Focus the text input" onClick={this.handleClick} /></div>);};}export default App;

需要注意的是,由于 this.refs.[refName] 属性获取的是真实 DOM ,所以必须等到虚拟 DOM 插入文档以后,才能使用这个属性,否则会报错。上面代码中,通过为组件指定 Click 事件的回调函数,确保了只有等到真实 DOM 发生 Click 事件之后,才会读取 this.refs.[refName] 属性。

8 this.state

react将组件看成是一个状态机,一开始有一个初始状态,然后用户互动,导致状态变化,从而触发重新渲染 UI。
由于 this.props 和 this.state 都用于描述组件的特性,可能会产生混淆。一个简单的区分方法是,this.props 表示那些一旦定义,就不再改变的特性,而 this.state 是会随着用户互动而产生变化的特性
demo08

import React, { Component } from 'react';class App extends Component{render(){return(<div><LikeButton/></div>)};
}class LikeButton extends Component{constructor(props) {super(props);this.state = {liked: false};// This binding is necessary to make `this` work in the callbackthis.handleClick = this.handleClick.bind(this);}  handleClick(event) {this.setState({liked: !this.state.liked});};render() {var text = this.state.liked ? 'like' : 'don\'t liked';return (<p onClick={this.handleClick}>You {text} this. Click to toggle.</p>);};}export default App;

9 表单

用户在表单填入的内容,属于用户跟组件的互动,所以不能用 this.props 读取
demo9

import React, { Component } from 'react';class App extends Component{render(){return(<div><Input/></div>)};
}class Input extends Component{constructor(props) {super(props);this.state = {value: 'Hello!'};// This binding is necessary to make `this` work in the callbackthis.handleChange = this.handleChange.bind(this);};handleChange(event) {this.setState({value: event.target.value});};render() {var value = this.state.value;return (<div><input type="text" value={value} onChange={this.handleChange} /><p>{value}</p></div>);};}export default App;

上面代码中,文本输入框的值,不能用 this.props.value 读取,而要定义一个 onChange 事件的回调函数,通过 event.target.value 读取用户输入的值。

10 组件的生命周期

组件的生命周期分成三个状态:
- Mounting:已插入真实 DOM
- Updating:正在被重新渲染
- Unmounting:已移出真实 DOM

React 为每个状态都提供了两种处理函数,will 函数在进入状态之前调用,did 函数在进入状态之后调用,三种状态共计五种处理函数
- componentWillMount()
- componentDidMount()
- componentWillUpdate(object nextProps, object nextState)
- componentDidUpdate(object prevProps, object prevState)
- componentWillUnmount()

此外,React 还提供两种特殊状态的处理函数:
- componentWillReceiveProps(object nextProps):已加载组件收到新的参数时调用
- shouldComponentUpdate(object nextProps, object nextState):组件判断是否重新渲染时调用
demo10

import React, { Component } from 'react';class App extends Component{render(){return(<div><ComponentLifestyle name = "pengwei"/></div>)};
}class ComponentLifestyle extends Component{constructor(props) {super(props);this.state = {opacity: 1.0};};componentWillMount() {this.timer = setInterval(function () {var opacity = this.state.opacity;var flag = this.state.flag;if(opacity >= 1||opacity<=0){flag = !flag;}if (flag){opacity -= 0.02;}else{opacity += 0.02;}this.setState({opacity: opacity,flag: flag});}.bind(this), 100);};render() {return (<div style={{opacity: this.state.opacity}} flag = {true}>Hello {this.props.name}</div>);};
}export default App;

本文只是很浅显的示例,学习React请继续前行—>

React 入门实例 参考阮一峰博客相关推荐

  1. react入门实例教程-阮一峰01

    一.HTML模板 <!DOCTYPE html> <html><head><script src="../build/react.js"& ...

  2. HTTPS阮一峰博客总结

    HTTPS 为什么需要HTTPS?? 窃听风险:第三方获知通信内容 篡改风险:第三方可以修改通信内容 冒充风险:第三方可以冒充他人身份参与通信 SSL/TLS协议作用 所有信息加密传播 校验机制,一旦 ...

  3. 借鉴--阮一峰博客之Jquery设计思想

    jquery常用方法--阮一峰博客借鉴 由于自身以前一直只是止步于看别人的博客,这是我的第一篇博客(感觉好高大上),这次博客我是借鉴于阮一峰网络日志关于Jquery设计思想的部分. 首先关于此篇博客我 ...

  4. xargs命令学习,转载于阮一峰博客

    一.标准输入与管道命令 Unix 命令都带有参数,有些命令可以接受"标准输入"(stdin)作为参数. $ cat /etc/passwd | grep root 上面的代码使用了 ...

  5. 前端知乎:关于阮一峰博客《学习Javascript闭包》章节中最后两个思考题

    阮一峰博客:<学习Javascript闭包>章节中最后有个思考题: 如果你能理解下面两段代码的运行结果,应该就算理解闭包的运行机制了. 代码片段一 var name = "The ...

  6. Javascript 面向对象编程(一):封装 ——转自阮一峰博客

    Javascript 面向对象编程(一):封装 作者: 阮一峰 日期: 2010年5月17日 学习Javascript,最难的地方是什么? 我觉得,Object(对象)最难.因为Javascript的 ...

  7. css实现阮一峰博客的进度条

    原理:利用css渐变 代码参考: <!DOCTYPE html> <html lang="en"><head><meta charset= ...

  8. websocket阮一峰博客地址教学

    http://www.ruanyifeng.com/blog/2017/05/websocket.html WebSocket 教程

  9. 【阮一峰博客学习记录1】追踪用户点击

    使用普通异步的方式发送用户点击日志会不成功,使用同步的方式发送会导致网页延迟.所以有了这个API--navigator.sendBeacon() 作用与优势 就算是关闭浏览器的操作,都可以腾出时间进行 ...

最新文章

  1. Exchange 2013学习(二),关于约会、会议和事件
  2. Idea terminal:不是内部或外部命令,也不是可行的程序或批处理文件
  3. VLAN划分,GVRP还是VTP (此文来自网管员世界)
  4. BeanFactory和ApplicationContext有什么区别
  5. Leetcode每日一题:101.symmetric-tree(对称二叉树)
  6. 今天讲座的感悟--java
  7. java color数组_java数组的学习
  8. C#断点续传HTTP下载远程文件的方法
  9. 基于spring boot的Java开源商城系统(附完整版源码)
  10. JAVA程序练习---小车行走距离
  11. 2017物联网蓬勃发展,看各领域巨头如何抢先机占山头
  12. 在CentOS下安装clickhouse
  13. 百度站长平台使用教程:死链提交
  14. Git 命令之Git clean
  15. 浅谈云时代如何解决身份管理
  16. 防火墙——iptables防火墙
  17. 如何制订一个有效的内部规范
  18. vue全局注册一个文件夹下所有的组件
  19. 使用phpstudy本地搭建织梦网站教程
  20. 中医基础理论——气一元论

热门文章

  1. 2022年制冷与空调设备运行操作理论题库模拟考试平台操作
  2. linux 程序如何设置奇偶校验,校验码辅导之奇偶校验
  3. AcrelEMS-HIW高速公路电力监控系统解决方案
  4. ACDC:开箱即用的多租户数据集成平台
  5. eclipse调试断点报错:Unable to install breakpoint in...
  6. 蔷薇框架软件_蔷薇花园软件下载-蔷薇花园app下载v1.55 安卓版-2265安卓网
  7. java从入门到精通二(Java基本语法,关键字,数据类型)
  8. 海外网红营销怎么避免假网红?
  9. Java计算请假时长(根据规则设置去除节假日、休息日、特殊日期)
  10. (小笔记)(sql)(NVL、Round)导入新课程