本博客实现React官网首页上展示的demo, 为了方便直接采用单文件的形式, 如果想完整集成

在自己的项目中, 可以参考React官网的安装指南, 安装Create React App.

hello-world

请移步至我写的这篇博客: 单文件快速体验使用react输出hello_world

A Stateful Component

React组件除了通过this.props传入参数, 还在内部维护this.state, 该数据只能在组件

才能访问. 一旦组件的this.state发生改变, React将通过调用render()重新渲染该组件.

下面的实例, 演示了利用React.Component API的事件绑定, 实现一个简单的计数器.

完整代码如下:

<!-- filename: a-stateful-component.html -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>A Stateful Component</title>
<script src="https://unpkg.com/react@15.6.1/dist/react.min.js"></script>
<script src="https://unpkg.com/react-dom@15.6.1/dist/react-dom.min.js"></script>
<script src="https://unpkg.com/babel-standalone@6.26.0/babel.min.js"></script>
</head> <body>
<div id="root"></div>
<script type="text/babel"> class Timer extends React.Component {
constructor(props) {
super(props); // ES特性
this.state = {secondsElapsed: 0}; // elapse 流逝
} tick() {
this.setState(
(prevState) => ({
secondsElapsed: prevState.secondsElapsed + 1
})
);
// 要根据以前的state值, 改变现在的state值, 需要使用函数, 上面函数
// 的参数prevSate不是固定, 可以换成任意其它名称.
// 传入的参数不管叫什么名称, 都将自动成为指向以前state的引用
} componentDidMount() {
// 这个事件将会在React成功渲染Timer组件时, 被触发
// 其为React.Component提供的API, 名称为固定写法
this.interval = setInterval(() => this.tick(), 1000);
// 这里必须使用箭头函数, 直接使用this.tick, 将发生
// 找不到this的情况
} componentWillUnmount() {
// 这个事件将会在Timer组件被从页面移除时被触发
// 其为React.Component提供的API, 名称为固定写法
clearInterval(this.interval);
} render() {
return (
<div>时间流逝: {this.state.secondsElapsed}</div>
);
}
} ReactDOM.render(<Timer />, document.getElementById('root')); </script>
</body>
</html>

运行分析:

  1. 执行Timer组件的render()函数进行页面渲染, 随后执行constructor构造函数.
  2. 页面渲染完毕后执行componentDidMount().

An Application

利用stateprops, 实现一个TodoList的小应用.

完整代码如下:

<!-- filename: an-application.html -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Hello World</title>
<script src="https://unpkg.com/react@15.6.1/dist/react.min.js"></script>
<script src="https://unpkg.com/react-dom@15.6.1/dist/react-dom.min.js"></script>
<script src="https://unpkg.com/babel-standalone@6.26.0/babel.min.js"></script>
</head> <body>
<div id="root"></div>
<script type="text/babel"> class TodoApp extends React.Component {
constructor(props) {
super(props);
this.handleSubmit = this.handleSubmit.bind(this); // this绑定, 标配
this.handleChange = this.handleChange.bind(this); // this绑定, 标配
this.state = {items: [], text: ''};
}
render() {
return (
<div>
<h3>TODO APP</h3>
<TodoList items={this.state.items} />
<form onSubmit={this.handleSubmit}>
<input value={this.state.text} onChange={this.handleChange} />
<button>增加第 {this.state.items.length + 1} 项</button>
<p>单击button, 就意味着表单被提交</p>
</form>
</div>
);
} handleChange(e) {
this.setState({
text: e.target.value
});
} handleSubmit(e) {
e.preventDefault();
var newItem = {
text: this.state.text,
id: Date.now()
// 获取当前时间作为list key
// 这是react推荐用法
};
this.setState(
(prevState) => ({
items: prevState.items.concat(newItem),
text: '' // 单击提交, 就把当前输入框清空
})
);
// console.log(this.state);
}
} class TodoList extends React.Component {
render() {
return (
<ul>
{this.props.items.map(
item =>
<li key={item.id}>{item.text}</li>
)}
</ul>
);
}
} ReactDOM.render(
<TodoApp />,
document.getElementById('root')
); </script>
</body>
</html>

代码运行分析:

  1. 当我们编辑输入框时, 实时的把录入内容, 同步到this.sate.text. 为此我们为输入框,

    绑定onChange事件. 输入框的value始终和this.sate.text保持同步.
  2. 当我们单击提交按钮时, 我们把当前输入框的值, 追加到this.state.items中, 为此,

    我们为提交按钮绑定onSubmit事件.
  3. 我们把用户输入的内容数组, 也就是this.state.items数组, 作为参数, 传给子组件TodoList,

    也就是给TodoListitems={this.state.items}属性, 我们在子组件里this.props.items,

    拿到从父组件里得到的用户输入数组, 使用map循环遍历, 并输出.

React官网首页demo(单文件实现版)的更多相关文章

  1. React.js 官网入门教程 分离文件 操作无法正常显示HelloWord

    对着React官网的教程练习操作,在做到分离文件练习时,按照官网步骤来却怎么也无法正常显示HelloWord. 经测试,html文件中内容改为: <!DOCTYPE html><ht ...

  2. 一款仿PBA官网首页jQuery焦点图的切换特效

    一款仿PBA官网首页jQuery焦点图的切换特效,非常的简单大方, 在对浏览器兼容性的方面做了不少的功夫.IE6也勉强能过去. 还是一款全屏的焦点图切换特效.大气而清新.很适合简介大方的网站. 下图还 ...

  3. 针对石家庄铁道大学官网首页的UI分析

    身为一名光荣的铁大铮铮学子,我对铁大的网站首页非常的情有独钟,下面我就石家庄铁道大学的官网首页进行UI分析: 1.在首页最醒目的地方赫然写着石家庄铁道大学七个大字,让人一眼就豁然开朗. 2.网站有EN ...

  4. 我照着NancyFx官网的demo来做为什么会有错误呢????

    我照着NancyFx官网的demo来做为什么会有错误呢???? >> csharp这个答案描述的挺清楚的:http://www.goodpm.net/postreply/csharp/10 ...

  5. Axure实现vcg官网首页原型图

    W240第二天第三天 Axure的简单使用: 作业实现:vcg官网首页原型图 帮助文档基础篇:原型图基础之axure线框图设计 导航栏设计: 添加通用母版header 导航栏设计注意: 鼠标移动到下面 ...

  6. 360随身WIFI程序单文件绿色版及网卡驱动(附使用感受)

    大家好,我是Colin,今天刚收到传说中的360WIFI,拿到手后马上就进行了测试.就做工而言,19.9的价格算是比较公道的,网卡很小,做工还可以,带磨砂质感,而且还提供了一个耳机插头,可以当挂件一样 ...

  7. IE6 单文件绿色版

    IE6单文件绿色版,可以直接运行,无需安装,完美兼容Win10(自带2016年1月更新). https://www.lanzous.com/i3w7dej

  8. 开源作品-PHP写的Redis管理工具(单文件绿色版)-SuRedisAdmin_PHP_1_0

    前言:项目开发用到了Redis,但是在调试Redis数据的时候,没有一款通用的可视化管理工具.在网络找了一些,但是感觉功能上都不尽人意,于是决定抽出一点时间,开发一个用起来顺手的Redis管理工具.秉 ...

  9. 开源作品-PHP写的JS和CSS文件压缩利器(单文件绿色版)-SuMinify_PHP_1_5

    前言: 网站项目需要引用外部文件以减小加载流量,而且第一次加载外部资源文件后,其他同域名的页面如果引用相同的地址,可以利用浏览器缓存直接读取本地缓存资源文件,而不需要每个页面都下载相同的外部资源文件. ...

随机推荐

  1. jQuery 实战读书笔记之第三章:操作 jQuery 集合

    创建新 HTML 元素 $('<div>Hello</div>'); /* 创建等价的空 div 元素 */ $('<div>'); $('<div /> ...

  2. mongdb复制集搭建

    可参考官网教程 复制集增加了数据的冗余同时也提高了mongodb的可靠性,相比传统的主从架构,mongodb具有自动容灾的特性,即主库挂掉后会自动从剩下的从库中选举出一个节点做为主库(不需要人工干预) ...

  3. MapReduce实战(二)自定义类型排序

    需求: 基于上一道题,我想将结果按照总流量的大小由大到小输出. 思考: 默认mapreduce是对key字符串按照字母进行排序的,而我们想任意排序,只需要把key设成一个类,再对该类写一个compar ...

  4. spring boot +mybatis分页查询

    这是spring boot集合mybatis的分页查询. pom依赖: <!-- 分页插件 --> <dependency> <groupId>com.github ...

  5. java.lang.IllegalArgumentException: SessionContext must be an HTTP compatible implementation.:模块化本地测试shiro的一些总结

    项目由于是多模块的,所以,测试的时候我想现将shiro框架进行本地测试,然后再放入框架里面,但是这个困扰我了两天了都,其实我应该想到的,只是想多试试,最后还不如多想想 先说一下系统的基本情况,项目是多 ...

  6. PAT005 Path in a Heap

    题目: Insert a sequence of given numbers into an initially empty min-heap H. Then for any given index ...

  7. abp项目如何按业务功能模块横向分割?

    1.为什么要做分层? 请先看项目分层的最后结构: 2.设计的初衷 项目较大,且主题鲜明,分为:BI模块.DM-用户洞察模块.Manage-应用管理模块.Report应用分析报表模块,大模块之间并无依赖 ...

  8. js json 单双引号互换

    var _adrobj = JSON.stringify(address).replace(/\"/g,"'"); var _nstr = _adrdata.replac ...

  9. 笔记:C语言图形基本函数及实例五子棋游戏

    初始化图形界面 int gdriver; int gmode; gdriver = DETECT; initgraph(&gdriver,&gmode,"" ); ...

  10. 【BZOJ4688】One-Dimensional 矩阵乘法

    [BZOJ4688]One-Dimensional Description 考虑一个含有 N 个细胞的一维细胞自动机.细胞从 0 到 N-1 标号.每个细胞有一个被表示成一个小于 M 的非负整数的状态 ...