群里分享的react的收藏一下!今日周末,改了个表单验证然后无所事事了!

今日周末,改了个表单验证然后无所事事了,然后把昨天群里分享的react的收藏一下尽管现在还在研究angular和nodeJs毕竟刚刚开始用有点不熟...没准以后会研究一下react毕竟看着下面这张图还是觉得有点欢乐的

 

现在最热门的前端框架,毫无疑问是 React 。

上周,基于 React 的 React Native 发布,结果一天之内,就获得了 5000 颗星,受瞩目程度可见一斑。

React 起源于 Facebook 的内部项目,因为该公司对市场上所有 JavaScript MVC 框架,都不满意,就决定自己写一套,用来架设 Instagram 的网站。做出来以后,发现这套东西很好用,就在2013年5月开源了。

由于 React 的设计思想极其独特,属于革命性创新,性能出众,代码逻辑却非常简单。所以,越来越多的人开始关注和使用,认为它可能是将来 Web 开发的主流工具。

这个项目本身也越滚越大,从最早的UI引擎变成了一整套前后端通吃的 Web App 解决方案。衍生的 React Native 项目,目标更是宏伟,希望用写 Web App 的方式去写 Native App。如果能够实现,整个互联网行业都会被颠覆,因为同一组人只需要写一次 UI ,就能同时运行在服务器、浏览器和手机(参见《也许,DOM 不是答案》)。

既然 React 这么热门,看上去充满希望,当然应该好好学一下。从技术角度,可以满足好奇心,提高技术水平;从职业角度,有利于求职和晋升,有利于参与潜力大的项目。但 是,好的 React 教程却不容易找到,这一方面因为这项技术太新,刚刚开始走红,大家都没有经验,还在摸索之中;另一方面因为 React 本身还在不断变动,API 一直在调整,至今没发布1.0版。

我学习 React 时,就很苦恼。有的教程讨论一些细节问题,对入门没帮助;有的教程写得不错,但比较短,无助于看清全貌。我断断续续学了几个月,看过二十几篇教程,在这个过程中,将对自己有帮助的 Demo 都收集下来,做成了一个库 React Demos 。

下面,我就根据这个库,写一篇全面又易懂的 React 入门教程。你只需要跟着每一个 Demo 做一遍,就能初步掌握 React 。当然,前提是你必须拥有基本 JavaScript 和 DOM 知识,但是你读完就会发现,React 所要求的预备知识真的很少。

零、安装

React 的安装包,可以到官网下载。不过,React Demos 已经自带 React 源码,不用另外安装,只需把这个库拷贝到你的硬盘就行了。


$ git clone git@github.com:ruanyf/react-demos.git 

如果你没安装 git, 那就直接下载 zip 压缩包。

下面要讲解的10个例子在各个 Demo 子目录,每个目录都有一个 index.html 文件,在浏览器打开这个文件(大多数情况下双击即可),就能立刻看到效果。

需要说明的是,React 可以在浏览器运行,也可以在服务器运行,但是本教程只涉及浏览器。一方面是为了尽量保持简单,另一方面 React 的语法是一致的,服务器的用法与浏览器差别不大。Demo11 是服务器首屏渲染的例子,有兴趣的朋友可以自己去看源码。

一、HTML 模板

使用 React 的网页源码,结构大致如下。


<!DOCTYPE html>
<html> <head> <script src="../build/react.js"></script> <script src="../build/JSXTransformer.js"></script> </head> <body> <div id="example"></div> <script type="text/jsx">  // ** Our code goes here! ** </script> </body> </html> 

上面代码有两个地方需要注意。首先,最后一个 script 标签的 type 属性为 text/jsx 。这是因为 React 独有的 JSX 语法,跟 JavaScript 不兼容。凡是使用 JSX 的地方,都要加上 type="text/jsx" 。

其次,React 提供两个库: react.js 和 JSXTransformer.js ,它们必须首先加载。其中,JSXTransformer.js 的作用是将 JSX 语法转为 JavaScript 语法。这一步很消耗时间,实际上线的时候,应该将它放到服务器完成。


$ jsx src/ build/

上面命令可以将 src 子目录的 js 文件进行语法转换,转码后的文件全部放在 build 子目录。

二、React.render()

React.render 是 React 的最基本方法,用于将模板转为 HTML 语言,并插入指定的 DOM 节点。


React.render(<h1>Hello, world!</h1>, document.getElementById('example') ); 

上面代码将一个 h1 标题,插入 example 节点(查看 demo01),运行结果如下。

三、JSX 语法

上一节的代码, HTML 语言直接写在 JavaScript 语言之中,不加任何引号,这就是 JSX 的语法,它允许 HTML 与 JavaScript 的混写(查看 Demo02 )。


var names = ['Alice', 'Emily', 'Kate']; React.render( <div> { names.map(function (name) { return <div>Hello, {name}!</div> }) } </div>, document.getElementById('example') ); 

上面代码体现了 JSX 的基本语法规则:遇到 HTML 标签(以 < 开头),就用 HTML 规则解析;遇到代码块(以 { 开头),就用 JavaScript 规则解析。上面代码的运行结果如下。

JSX 允许直接在模板插入 JavaScript 变量。如果这个变量是一个数组,则会展开这个数组的所有成员(查看 demo03 )。


var arr = [<h1>Hello world!</h1>, <h2>React is awesome</h2>, ]; React.render( <div>{arr}</div>, document.getElementById('example') ); 

上面代码的arr变量是一个数组,结果 JSX 会把它的所有成员,添加到模板,运行结果如下。

四、组件

React 允许将代码封装成组件(component),然后像插入普通 HTML 标签一样,在网页中插入这个组件。React.createClass 方法就用于生成一个组件类(查看 demo04)。


var HelloMessage = React.createClass({ render: function() { return <h1>Hello {this.props.name}</h1>; } }); React.render( <HelloMessage name="John" />, document.getElementById('example') ); 

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

组件的用法与原生的 HTML 标签完全一致,可以任意加入属性,比如 <HelloMessage name="John" /> ,就是 HelloMessage 组件加入一个 name 属性,值为 John。组件的属性可以在组件类的 this.props 对象上获取,比如 name 属性就可以通过 this.props.name 读取。上面代码的运行结果如下。

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

五、this.props.children

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


var NotesList = React.createClass({ render: function() { return ( <ol> { this.props.children.map(function (child) { return <li>{child}</li> }) } </ol> ); } }); React.render( <NotesList> <span>hello</span> <span>world</span> </NotesList>, document.body ); 

上面代码的 NoteList 组件有两个 span 子节点,它们都可以通过 this.props.children 读取,运行结果如下。

这里需要注意,只有当子节点多余1个时,this.props.children 才是一个数组,否则是不能用 map 方法的, 会报错。

六、React.findDOMNode()

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

但是,有时需要从组件获取真实 DOM 的节点,这时就要用到 React.findDOMNode 方法(查看 demo06 )。


var MyComponent = React.createClass({ handleClick: function() { React.findDOMNode(this.refs.myTextInput).focus(); }, render: function() { return ( <div> <input type="text" ref="myTextInput" /> <input type="button" value="Focus the text input" onClick={this.handleClick} /> </div> ); } }); React.render( <MyComponent />, document.getElementById('example') ); 

上面代码中,组件 MyComponent 的子节点有一个文本输入框,用于获取用户的输入。这时就必须获取真实的 DOM 节点,虚拟 DOM 是拿不到用户输入的。为了做到这一点,文本输入框必须有一个 ref 属性,然后 this.refs.[refName] 就指向这个虚拟 DOM 的子节点,最后通过 React.findDOMNode 方法获取真实 DOM 的节点。

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

React 组件支持很多事件,除了 Click 事件以外,还有 KeyDown 、Copy、Scroll 等,完整的事件清单请查看官方文档。

七、this.state

组件免不了要与用户互动,React 的一大创新,就是将组件看成是一个状态机,一开始有一个初始状态,然后用户互动,导致状态变化,从而触发重新渲染 UI (查看 demo07 )。


var LikeButton = React.createClass({ getInitialState: function() { return {liked: false}; }, handleClick: function(event) { this.setState({liked: !this.state.liked}); }, render: function() { var text = this.state.liked ? 'like' : 'haven\'t liked'; return ( <p onClick={this.handleClick}> You {text} this. Click to toggle. </p> ); } }); React.render( <LikeButton />, document.getElementById('example') ); 

上面代码是一个 LikeButton 组件,它的 getInitialState 方法用于定义初始状态,也就是一个对象,这个对象可以通过 this.state 属性读取。当用户点击组件,导致状态变化,this.setState 方法就修改状态值,每次修改以后,自动调用 this.render 方法,再次渲染组件。

由于 this.props 和 this.state 都用于描述组件的特性,可能会产生混淆。一个简单的区分方法是,this.props 表示那些一旦定义,就不再改变的特性,而 this.state 是会随着用户互动而产生变化的特性。

八、表单

用户在表单填入的内容,属于用户跟组件的互动,所以不能用 this.props 读取(查看 demo08 )。


var Input = React.createClass({ getInitialState: function() { return {value: 'Hello!'}; }, handleChange: function(event) { this.setState({value: event.target.value}); }, render: function () { var value = this.state.value; return ( <div> <input type="text" value={value} onChange={this.handleChange} /> <p>{value}</p> </div> ); } }); React.render(<Input/>, document.body); 

上面代码中,文本输入框的值,不能用 this.props.value 读取,而要定义一个 onChange 事件的回调函数,通过 event.target.value 读取用户输入的值。textarea 元素、select元素、radio元素都属于这种情况,更多介绍请参考官方文档。

九、组件的生命周期

组件的生命周期分成三个状态:

  • 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):组件判断是否重新渲染时调用

这些方法的详细说明,可以参考官方文档。下面是一个例子(查看 demo09 )。


var Hello = React.createClass({ getInitialState: function () { return { opacity: 1.0 }; }, componentDidMount: function () { this.timer = setInterval(function () { var opacity = this.state.opacity; opacity -= .05; if (opacity < 0.1) { opacity = 1.0; } this.setState({ opacity: opacity }); }.bind(this), 100); }, render: function () { return ( <div style={{opacity: this.state.opacity}}> Hello {this.props.name} </div> ); } }); React.render( <Hello name="world"/>, document.body ); 

上面代码在hello组件加载以后,通过 componentDidMount 方法设置一个定时器,每隔100毫秒,就重新设置组件的透明度,从而引发重新渲染。

另外,组件的style属性的设置方式也值得注意,不能写成


style="opacity:{this.state.opacity};"

而要写成


style={{opacity: this.state.opacity}} 

这是因为 React 组件样式是一个对象,所以第一重大括号表示这是 JavaScript 语法,第二重大括号表示样式对象。

十、Ajax

组件的数据来源,通常是通过 Ajax 请求从服务器获取,可以使用 componentDidMount 方法设置 Ajax 请求,等到请求成功,再用 this.setState 方法重新渲染 UI (查看 demo10 )。


var UserGist = React.createClass({ getInitialState: function() { return { username: '', lastGistUrl: '' }; }, componentDidMount: function() { $.get(this.props.source, function(result) { var lastGist = result[0]; if (this.isMounted()) { this.setState({ username: lastGist.owner.login, lastGistUrl: lastGist.html_url }); } }.bind(this)); }, render: function() { return ( <div> {this.state.username}'s last gist is <a href={this.state.lastGistUrl}>here</a>. </div> ); } }); React.render( <UserGist source="https://api.github.com/users/octocat/gists" />, document.body ); 

上面代码使用 jQuery 完成 Ajax 请求,这是为了便于说明。React 没有任何依赖,完全可以使用其他库。

十一、参考链接

  1. React's official site
  2. React's official examples
  3. React (Virtual) DOM Terminology, by Sebastian Markbåge
  4. The React Quick Start Guide, by Jack Callister
  5. Learning React.js: Getting Started and Concepts, by Ken Wheeler
  6. Getting started with React, by Ryan Clark
  7. React JS Tutorial and Guide to the Gotchas, by Justin Deal
  8. React Primer, by Binary Muse
  9. jQuery versus React.js thinking, by zigomir

 

 

原文地址:http://www.ruanyifeng.com/blog/2015/03/react.html

转载于:https://www.cnblogs.com/LoveOrHate/p/4491413.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/358870.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java的设计模式用的什么软件_《图解Java多线程设计模式》UML用什么软件画?

eclipse插件 AmaterasUML (下载地址&#xff1a;https://zh.osdn.net/projects/amateras/releases/#21568)解压放到plugins文件夹下在安装AmaterasUML之前要先安装GEF(eclipse在线安装&#xff0c;参考&#xff1a;http://www.cnblogs.com/xiluhua/p/6667935.html)eclipse-File…

spring bean配置_在运行时交换出Spring Bean配置

spring bean配置如今&#xff0c;大多数Java开发人员都定期与Spring打交道&#xff0c;而我们当中的许多人都已经熟悉了它的功能和局限性。 最近&#xff0c;我遇到了一个我从未遇到过的问题&#xff1a;引入了基于运行时引入的配置来重新连接Bean内部的功能。 这对于简单的配置…

HTML教程(看完这篇就够了)

目录结构 HTML教程 HTML 简介HTML 编辑器HTML基础 HTML 元素HTML 属性HTML 标题HTML 段落HTML 文本格式化HTML 链接HTML headHTML CSSHTML 图像HTML 表格HTML 列表HTML 块级元素HTML 布局HTML 表单

Metasploit入门用法(主动攻击)

–作者&#xff1a;CV 本文主要讲metasploit的入门用法&#xff0c;还有一些渗透细节和思路&#xff0c;有不足的&#xff0c;欢迎互相学习研究。本人区别于书籍的特点是&#xff1a;书籍以模块为划分&#xff0c;我是以连续的步骤进行书写&#xff0c;更突出一次渗透的思路&a…

java 计时器_Java多线程并发容器之并发倒计时器

从火箭发场景来学习Java多线程并发闭锁对象倒计时器场景在我们开发过程中&#xff0c;有时候会使用到倒计时计数器。最简单的是&#xff1a;int size 5; 执行后&#xff0c;size—这种方式来实现。但是在多线程并发的情况下&#xff0c;这种操作会不安全的。举个现实中最典型的…

jQuery 图片轮流展示效果

1. siblings()这个方法&#xff0c;就是要取得调用该方法的节点对象的兄弟节点&#xff08;查找同级对象&#xff09;比如&#xff1a; <div id"aaa"><p>1</p><p>2</p><h1>2</h1><h2>22</h2><div>abcd…

通过Spring将AWS SQS用作JMS提供程序

最近AWS公布了新的客户端库&#xff0c;它实现了JMS 1.1规范 &#xff0c;并使用他们的简单队列服务 &#xff08;SQS&#xff09;作为JMS提供者 &#xff08;见杰夫巴尔的帖子在这里 &#xff09;。 在我的文章中&#xff0c;我将向您展示如何设置Maven项目以使用Spring Frame…

【APICloud系列|15】上架ios应用到苹果应用市场总结

今年4月初从公司离职啦,这几天学习了很多大前端知识体系,今天收到老板委托把这个遗留的问题处理一下。安卓几个应用商店已经更新了所有的程序,比较简单,一般人都可以很容易上架,对上架到苹果应用市场第一次搞或者老手也会遇到很多坑,这里面主要会涉及到邓白氏编码,苹果开…

常见网络协议端口号

一、端口的分类 1&#xff09;按端口性质来分 公认端口&#xff08;常用端口&#xff09;&#xff1a;0-1024 通常这些端口的通信明确表明了某种服务的协议。这些端口是不可以重新定义它的作用对象。 如80端口实际上总是HTTP通信所使用的&#xff0c;而23号端口是Teln…

java foxmail 附件_foxmail 本程序使用JavaMail进行收取和发送带附件的邮件 - 下载 - 搜珍网...

邮件客户端/foxmail/.classpath邮件客户端/foxmail/.project邮件客户端/foxmail/bin/org/crazyit/foxmail/box/AbstractBox.class邮件客户端/foxmail/bin/org/crazyit/foxmail/box/DeletedBox.class邮件客户端/foxmail/bin/org/crazyit/foxmail/box/DraftBox.class邮件客户端/f…

netbeans7.4_带有NetBeans 7.1 RC 2的快速入门WebLogic 12c

netbeans7.4WebLogic服务器12c停运了几天。 它适用于“裸”的Java开发人员-精美的Fusion Middleware东西将继续沿线升至12c。 因此&#xff0c;这基本上是我要运行的版本。 今天&#xff0c;我为您提供一个最新的NetBeans 7.1&#xff08;RC 2&#xff09;和WebLogic的快速入门…

ORACLE SEQUENCE 介绍

在oracle中sequence就是所谓的序列号&#xff0c;每次取的时候它会自己主动添加&#xff0c;一般用在须要按序列号排序的地方。 1、Create Sequence 你首先要有CREATE SEQUENCE或者CREATE ANY SEQUENCE权限&#xff0c; CREATE SEQUENCE emp_sequence INCREMENT BY 1 …

burpsuite全套使用教程

burpsuite 实验环境安装教程浏览器配置篇使用方法Target模块(目标模块)Proxy模块(代理模块)Spider模块(蜘蛛爬行)Scanner模块(漏洞扫描)Intruder模块decoder模块(编码模块)Comparer模块(比较器)RepeaterSequencer 实验环境 burpsuite1.733 win10 dvwa firefox 安装教程 第…

致我们曾经白嫖的网站

十分好用的在线工具网站,珍藏版,分享给你们 1.奶牛快传:用户体验更好的网盘工具。 最近开始使用的一款网盘工具,和百度网盘类似,不过没有下载速度的限制,并且可以支持自定义分享文件的下载次数(需要开会员)。 还有一点让我觉得比较舒服的是,你给别人分享文件,别人无…

java word模版填充_[转载]java向word模板中填充数据(总结)

使用过PageOffice动态生成word文档的人都知道,PageOffice可以给word文档的指定位置进行填充,这里我们所说的指定位置在PageOffice的专业术语里面有两个概念&#xff0c;一个叫做数据区域(DataRegion)&#xff0c;另一个叫做数据标签(DataTag)。一、 概念数据区域&#xff1a;是…

网站访问优化,未完待续

下午&#xff0c;网站被吐槽了&#xff0c;访问太慢。最初&#xff0c;我以为是首页的banner图片&#xff0c;太大导致的&#xff0c;之前是500kb的高清图。立即去看了下&#xff0c;banner大图已经压缩到50kb了。so&#xff0c;不是图片的问题。 用Chrome打开网站&#xff0…

Linux中重要文件

用户文件 /etc/passwd------用户名和UID等信息 /etc/shadow------用户密码 组账号 /etc/group-------组名和GID等信息 /etc/gshadow----组密码 1、用户名和UID等信息存放在/etc/passwd中&#xff08;7列&#xff09; 每一行都表示的是一个用户的信息&#xff1b;一行有…

HTML5教程(学完html的,这个可以快速过一遍)

目录 HTML5 教程HTML5 浏览器支持HTML5 新元素HTML5 语义元素HTML5 代码规范HTML5 MathMLHTML5 Web SQL数据库HTML5 迁移HTML5 CanvasHTML5 内联 SVGHTML5 Canvas VS svgHTML5 多媒体HTML5 Object元素HTML5 Audio音频HTML5 Video视频HTML5 新的input类型HTML5 表单元素

是时候抛弃Java 7 – JBoss EAP 6.4了!

这一周真是太棒了。 JBoss EAP 6.4已发布&#xff0c;并且在大量技术增强和新功能中 &#xff0c;最大的是&#xff1a;Java 8已添加到受支持的配置列表中。 其中包括Oracle JDK和IBM JDK。 Java SE 7公开更新结束通知 2015年4月之后&#xff0c;Oracle将不再将Java SE 7的更新…

java 时间戳 星期几_java自定义获取星期几、几点、几分。

/*** author 9082046**qq.com**/public void out_week_hour_minute(){long eight_hour_ms 8*60*60*1000;//8小时*分*秒*毫秒,时区影响&#xff0c;北京时区:东八区。long per_week_ms 7*24*60*60*1000;//7天*时*分*秒*毫秒,一周。long four_day_ms 4*24*60*60*1000;//4天*时…