二、React初体验之React组件创建
(中间因为应付各种考试,处理其他事情,隔了好时间没更新,现在终于有时间了,续上!)
本文为React初始体验,因此先不考虑文件如何组织,尽量以最简单的方式让大家了解React其中的原理。
在创建组件(component)之前,大家首先需要了解一些基础知识。有ES6、JSX语法等基础知识的同学请跳过下面一段。
ES6是JavaScript的最新标准,里面新增了许多语法方式,甚至出现了“类”的继承方式,我个人暂且把他们理解为新增了许多“语法糖”,这些“语法糖”可能带给老手的是方便,而对于我们这些菜鸟来说就是一种理解负担,但必须要看,因为这就是趋势。JSX语法,大家就姑且认为是一种能将js和html写在一起处理的语法。以上内容不展开讲,有时间会专门开一篇文章,不知道的童鞋可以先自行百度一下。
下面开始今天的正题,One、Two、Three、Action……
React的原理其实非常简单,请看下图:

一句话说上面的关系:动作会影响状态数据的变化,状态数据的变化造成组件变化,组件变了有可能会造成新的动作产生,从而再影响状态数据变化……
组件(component):给大家举个“栗子”,相信大家都刷微博吧,微博中的每一条信息都相当于有一个小面板来展示信息,这个小面板里面有发该条微博人的头像,微博内容,插图,以及“转发”、“评论”、“点赞”, 这个小面板我们就可以理解成是一个总组件,面板中的每个部分又可以认为是小组件,小组件组成了最终的大组件。因为每条微博的组成内容类似,所以我们只需要创建这样一个面板组件,重复使用。组件中都有个props属性,这个属性中存放组件的初始状态的量,通过this.props.<变量名>来调用,通过getDefaultProps()来设置默认初始的prop属性值,通过propTypes来设置props的类型、是否必须有等。
动作(action):这个应该都熟悉,像什么onClick,onChange,onBlur等,这儿有React支持的所有事件,这些动作需要执行的内容如何定义后面会讲到。
状态数据(state):这是React的核心部分,组件的变化就是因为state的变化引起的。state与props类似,区别是props一旦设定一般不去改变它,但是动作(action)的变化会引起状态数据(state)的随时变化,从而重新渲染组件(component)引起变化。通过getInitialState()来设置默认的状态,通过this.setState()来改变状态值。
说了这么多,开始实战吧!!!
1、创建一个文件夹,用于存放这个示例的所有文件,我将他命名为“ReactApp”,然后cd到这个文件夹下npm安装上一篇文章中提到的所有组件。
2、新建名为App.jsx 的文件,这就是我们提到的用于创建组件的地方。下面的大致结构是:一个总的组件MyComponent包含两个子组件Component1和Component2,且name属性由总组件通过props属性由上向下传递到各个子组件。
import React from 'react';//引入react模块,用来创建组件
var MyComponent= React.createClass({//创建总组件,记得组件名一定要大写哦!不然会报错!!!
render: function() {
return (
<div>
<Component1 name={this.props.name}/>//通过props传递name属性
<Component2 name={this.props.name}/>
</div>
);
}
});
var Component1 = React.createClass({//创建子组件Component1
getDefaultProps:function () { //设置初始Props
return {
inputValue:'随便写些啥',
};
},
getInitialState:function () { //设置初始State
return {
content:"Hello World",
};
},
handleClick:function () { //用户自己定义的动作函数
this.setState({content:"就是"+this.refs.myTextInput.value+"!!!"});//用于修改state
},
handleChange:function () { //用户自己定义的动作函数
this.setState({content:this.refs.myTextInput.value});
},
render:function () { //组件渲染函数,最外层只能有一个标签!!!!!
return (
<div>
<h1>{this.props.name}:Component1</h1>
<input type="text" ref="myTextInput" placeholder={this.props.inputValue} onChange={this.handleChange} />
<input type="button" value="点击" onClick={this.handleClick} />
<h3>{this.state.content}</h3>
</div>
);
},
});
var Component2 = React.createClass({//创建子组件Component2
getInitialState:function(){//设置state的默认初始值
return{
counter:0,
};
},
handleAdd:function () {//action函数,state加一
this.state.counter+=1;
this.setState({counter:this.state.counter});//设置当前的state值
},
handleMinus:function () {//action函数,state减一
this.state.counter-=1;
this.setState({counter:this.state.counter});
},
handleBack:function () {//action函数,state归零
this.state.counter=0;
this.setState({counter:this.state.counter});
},
render:function(){//组件渲染
return(
<div>
<h1>{this.props.name}:Component2</h1>
<input type="button" value="Add 1" onClick={this.handleAdd} />
<input type="button" value="Minus 1" onClick={this.handleMinus} />
<input type="button" value="Back 0" onClick={this.handleBack} />
<h2>{this.state.counter}</h2>
</div>
);
},
});
export {MyComponent} ;//组件输出,(这儿插一句题外话,export是ES6制定的模块加载方式,与import配合使用,而exports是CommonJS的标准,与require等配合使用,他们的区别有机会另开文章将)
3、组件虽然建好了,但是浏览器不会认识这种形式的组件,这时候就需要用到react提供的另一个库“react-dom”,它的作用是将组件渲染到真正的dom树上,很简单新建文件名为main.js的文件。
import React from 'react';//引入“react”组件
import ReactDOM from 'react-dom';//引入“react-dom”组件
import {MyComponent} from './App.jsx';//引入我们刚才写好的MyComponent组件
ReactDOM.render(<MyComponent name="chen" />,document.getElementById('app'));//将组件渲染到dom页面的app节点中,并向子组件传输name属性
卡!到此为止,组件的创建的流程基本说完了,下一篇文章主要会讲如何将这个组件在NodeJS下利用Webpack打包并以热加载模式,让他真正跑起来,最后一片文章更完后我会将整个例子放在github上,有兴趣的同学可以去看看,试试。下面是效果图

写在最后的n段话:
1、React的优势在于它首先会创建一个虚拟dom,就像我们上面写的组件,如果组件中的数据有更新,它不会直接去操作浏览器中的真实dom,而是先在自己创建的虚拟组件中利用diff算法,找出不同的地方修改,然后将其渲染到浏览器上。没有对真实dom大量的操作也就意味着浏览器端渲染速度加快,这基本就是React的核心所在。
2、在创建组件(Component)的时候,我们只用到了其中的一少部分函数或者属性,还有没有用到的如:
①propTypes,它是一个Json对象,用于设置组件中props属性的类型,如number,string等,保证属性的安全性;
②组件在渲染的时候会有几个状态,react官方把它叫做Lifecycle Methods,其实就是设置在组件渲染到浏览器前要做什么,渲染后做什么,对应的API如下:
componentWillMount();//组件渲染前
componentDidMount();//组件渲染完成后
componentWillUpdate();//由于Action驱动,组件在更新前
componentDidUpdate();//组件在更新完成后
componentWillReceiveProps();//组件在接受到props之前
。。。还有好多关于组件变化状态的函数,可以点这儿查询。
作者: GeoChen
出处: http://www.cnblogs.com/GeoChen>
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 原文链接 如有问题, 可邮件(giser_xiaochen@163.com)咨询.
二、React初体验之React组件创建的更多相关文章
- Yaf学习(二)----Yaf初体验
1.hello world 1.1 用yaf输出hello world 1.首先配置host,nginx 2.host不用多说,指向虚拟机IP即可 1.2 重点说一下nginx (只说server块) ...
- 一、React初体验之NodeJS环境搭建
一.NodeJS安装 我博客中有相关文章,此处不再赘述. 二.相关模块安装 在使用React的时候需要安装一些相关模块: 1.babel npm install babel -g --save-dev ...
- react初体验
function Guest() { return ( <h1>pls login in</h1> ); } function User() { return ( <h1 ...
- Scrapy 初体验
开发笔记 Scrapy 初体验 scrapy startproject project_name 创建工程 scrapy genspider -t basic spider_name website. ...
- BSP中uboot初体验
一. uboot源码获取 1.1. 从板级厂家获取开发板BSP级uboot(就是由开发板厂家提供的) 1.2. 从SOC厂家获取相同SOC的BSP级uboot 1.3. 从uboot官方下载 1.4. ...
- React 以两种形式去创建组件 类或者函数(二)
08==>创建组件以 1类的形式 或者以 2函数的形式 09==>使用组件 在src下创建components文件夹 是放组件的 CompType.js 组件 组件开头大写(重要) Com ...
- React: React组件创建的三种方式
一.简介 在前面介绍的React组件知识中,对于组件的创建我只是用了其中某一种方式.其实,在2013年React诞生之初,对于React组件的创建,仅仅只有一种方式,也即createClass函数,在 ...
- angular,vue,react的基本语法—动态属性、事件绑定、ref,angular组件创建方式
基本语法: 动态属性: vue: v-bind:attr="msg" :attr="msg" react: attr={msg} angular [attr]= ...
- react功能实现-组件创建
这里主要从两个角度来分析创建一个组件需要怎么做,一个是元素,一个是数据.整理向,大量借鉴,非原创. 1.渲染组件. 我们先明确一点,所有的元素都必须通过render方法来输出渲染.所有,每个组件类最终 ...
随机推荐
- JMeter Nmon Tool V2.0 插件
很早之前宝路已将nmon监控功能集成到了JMeter中,自己在使用旧版本时,也有诸多不满意的地方.趁着五一假期(基本都是晚上,白天要陪孩子),对插件底层代码进行了重构,自己还要反复测试调整,最晚的一次 ...
- 使用Python实现批量ping操作
在日常的工作中,我们通常会有去探测目标主机是否存活的应用场景,单个的服务器主机可以通过计算机自带的DOS命令来执行,但是业务的存在往往不是单个存在的,通常都是需要去探测C段的主机(同一个网段下的存活主 ...
- Java 四种权限修饰符
Java 四种权限修饰符访问权限 public protected (default) private 同一个类(我自己) yes yes yes yes 同一包(我邻居) yes yes yes n ...
- 错误:Several ports (8005, 8080, 8009) required by Tomcat v7.0 Server at localhost are already in use.
Several ports (8005, 8080, 8009) required by Tomcat v7.0 Server at localhost are already in use. The ...
- 一次内核 crash 的排查记录
一次内核 crash 的排查记录 使用的发行版本是 CentOS,内核版本是 3.10.0,在正常运行的情况下内核发生了崩溃,还好有 vmcore 生成. 准备排查环境 crash 内核调试信息rpm ...
- 【Hadoop离线基础总结】MapReduce倒排索引建立
MapReduce倒排索引建立 求某些单词在文章中出现多少次 有三个文档的内容,求hello,tom,jerry三个单词在其中各出现多少次 hello tom hello jerry hello to ...
- Excel+Python:分组名单
各部门的社保.公积金.全勤奖.工衣.工龄奖.罚款等名单,要统计出来,A4纸横向排版.要么发群里通知,要么打印给相应主管.部门放一列,相应部门名单放一个cell里面. 公开透明后,人头不对.人名不对,各 ...
- 在Qsys中创建用户自定义IP
在SOC FPGA的设计中,必须使用Qsys软件才能将ARM和FPGA之间的接口引入到FPGA设计中.为了设计上的方便,客户经常希望将Qsys中的一些接口信号引入到FPGA顶层设计文件中.本文以Ava ...
- [hdu3486]rmq+枚举优化
题意:给n个数,求最小的段数,使得每一段的最大值之和大于给定的k.每一段的长度相等,最后若干个丢掉. 思路:从小到大枚举段数,如果能o(1)时间求出每一段的和,那么总复杂度是O(n(1+1/2+1/3 ...
- Python 简明教程 --- 0,前言
微信公众号:码农充电站pro 个人主页:https://codeshellme.github.io Life is short, you need Python! -- Bruce Eckel 0,关 ...