(中间因为应付各种考试,处理其他事情,隔了好时间没更新,现在终于有时间了,续上!)

本文为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组件创建的更多相关文章

  1. Yaf学习(二)----Yaf初体验

    1.hello world 1.1 用yaf输出hello world 1.首先配置host,nginx 2.host不用多说,指向虚拟机IP即可 1.2 重点说一下nginx (只说server块) ...

  2. 一、React初体验之NodeJS环境搭建

    一.NodeJS安装 我博客中有相关文章,此处不再赘述. 二.相关模块安装 在使用React的时候需要安装一些相关模块: 1.babel npm install babel -g --save-dev ...

  3. react初体验

    function Guest() { return ( <h1>pls login in</h1> ); } function User() { return ( <h1 ...

  4. Scrapy 初体验

    开发笔记 Scrapy 初体验 scrapy startproject project_name 创建工程 scrapy genspider -t basic spider_name website. ...

  5. BSP中uboot初体验

    一. uboot源码获取 1.1. 从板级厂家获取开发板BSP级uboot(就是由开发板厂家提供的) 1.2. 从SOC厂家获取相同SOC的BSP级uboot 1.3. 从uboot官方下载 1.4. ...

  6. React 以两种形式去创建组件 类或者函数(二)

    08==>创建组件以 1类的形式 或者以 2函数的形式 09==>使用组件 在src下创建components文件夹 是放组件的 CompType.js 组件 组件开头大写(重要) Com ...

  7. React: React组件创建的三种方式

    一.简介 在前面介绍的React组件知识中,对于组件的创建我只是用了其中某一种方式.其实,在2013年React诞生之初,对于React组件的创建,仅仅只有一种方式,也即createClass函数,在 ...

  8. angular,vue,react的基本语法—动态属性、事件绑定、ref,angular组件创建方式

    基本语法: 动态属性: vue: v-bind:attr="msg" :attr="msg" react: attr={msg} angular [attr]= ...

  9. react功能实现-组件创建

    这里主要从两个角度来分析创建一个组件需要怎么做,一个是元素,一个是数据.整理向,大量借鉴,非原创. 1.渲染组件. 我们先明确一点,所有的元素都必须通过render方法来输出渲染.所有,每个组件类最终 ...

随机推荐

  1. 支付宝小程序serverless---获取用户信息(头像)并保存到云数据库

    支付宝小程序serverless---获取用户信息(头像)并保存到云数据库 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 我又 ...

  2. G - Queue HDU - 5493 线段树+二分

    G - Queue HDU - 5493 题目大意:给你n个人的身高和这个人前面或者后面有多少个比他高的人,让你还原这个序列,按字典序输出. 题解: 首先按高度排序. 设每个人在其前面有k个人,设比这 ...

  3. java反编译软件

    1.Java反编译插件 —— Jadclipse JadClipse是Jad的Eclipse插件,是一款非常实用而且方便地Java反编译插件,我们只需将下载的插件包复制到eclipse的plugins ...

  4. 在使用SSH+Spring开发webservice ,报的一些异常及处理方法

    1.No bean named 'cxf' is defined 配置文件被我分成了三份,启动时忘记将webService配置导入到主文件,修改后如下: 2.bad request 400 访问路径写 ...

  5. python 读hdf4文件,再转写成一个tif文件

    1.安装pyhdf包 (1)通过此链接查找并下载pyhdf包:https://www.lfd.uci.edu/~gohlke/pythonlibs/#pygame(根据自己的系统及python版本选择 ...

  6. Java常用关键字总结

    1.abstract abstract修饰类,表示抽象的意思,抽象类可以含有非抽象变量和成员变量,也可以有普通方法和构造方法,但是不能被实例化(接口),但是可以被子类继承. public abstra ...

  7. OpenWrt R2020.3.11 去广告 抗污染 加速 PSW 无缝集成 UnPnP NAS

    近期更新:OpenWrt R2020.3.11版本2020.03.16编译. 按大家要求,新发布固件携带了编译时用到的全部软件包 加入了国内域名加速解析脚本 解决了原去广告,DNS优化方案与PSW冲突 ...

  8. JDBC02 加载JDBC驱动 建立连接

    JDBC(Java Database Connection)为Java开发者使用数据库提供了统一的编程接口 sun公司由于不知道各个主流商用数据库的程序代码,因此无法自己写代码连接各个数据库,因此su ...

  9. [hdu5593 ZYB's Tree] 树上统计

    题意:给1棵N(≤500,000)个节点的树,每条边边权为1,求距离每个点距离不超过K(K≤10)的点的个数的xor和. 思路:由于K很小,可以考虑把距离作为状态的一部分,然后研究父子之间状态的联系. ...

  10. Java元注解@Retention规则

    @Retention是java当中的一个元注解,该元注解通常都是用于对软件的测试 1.适用方式:     @Retention(RetentionPolicy.RUNTIME)     @interf ...