1、简介javascript
React-Native是Facebook开源的跨平台框架,用于实现前端和原生进行混合开发。React-Native开发能够很好的使用原生UI构建用户界面,与传统的使用WebView相比,不只保留了原生的用户体验和流畅度,还提升了开发效率,React-Native的构建思路图以下。而React-Native是基于React设计的,因而可知React在RN开发中是极其重要的。React的地址是Github地址:https://github.com/facebook/react、官网地址:https://facebook.github.io/react/。接下来开始认识React。css
2、基础html
须要了解React的几个基本的特色,以下:前端
学习React须要掌握一些基本知识,以下:
java
通常的React开发须要的文件工具,以下:react
3、JSXgit
一、概念github
<script type="text/babel"></script>中type规定的是MIME类型,现代浏览器默认的是text/javascript,因此不用像之前那样手动添加jsxTransformer.js专门用来解析js/jsx文件中的jsx语法,而babel不光能干这些还能编译ES6语法等等。只要将代码放在script标签对中就能正确解析,那么JSX究竟是什么?npm
一、相似于XML的语法糖
JSX是JavaScript的扩展,React为了代码的可读性更方便地建立虚拟DOM等缘由,加入了一些相似XML的语法的扩展。其实它就是HTML标签,只不过在JS中写这些标签时,再也不像之前那样做为字符串用引号引发来,而是像在XML文件中书写同样,直接写便可。
二、第一代编译器——jsxTransformer
JSX代码并不能直接运行,须要将它编译成正常的JavaScript表达式才能运行,jsxTransformer.js就是这一编译器的角色。
三、第二代编译器——babel
React官方博客发布了一篇文章,声明其自身用于JSX语法解析的编译器JSTransform已通过期,再也不维护,React JS和React Native已经所有采用第三方Babel的JSX编 译器实现。缘由是二者在功能上已经彻底重复,而Babel做为专门的JavaScript语法编译工具,提供了更为强大的功能。而browser.js是babel编译器的浏览器版本。
二、书写数组
//这就是一个JSX对象 <h1>I am XYQ</h1> //这也是一个JSX对象,JSX执行的是JavaScript表达式 var obj = "I am XYQ"; <h1>{obj}</h1> 或者 <h1>obj</h1> //这仍然是一个JSX对象,显示HTML,_html为属性 <div>{{_html:'<h1>I am XYQ</h1>'}}</div>
三、载入
//方式1:内联方式载入 <script type="text/babel"> ReactDOM.render( //这里面书写JSX代码 ); </script> //方式2:外联方式载入 //test.js文件 ReactDOM.render( //这里面书写JSX代码 ); //开始引入 <script type="text/babel" src="test.js"></script>
四、转换
这个<script type="text/babel">...</script>解析器会把JSX对象解析成JavaScript对象,转换格式为: React.createElement( string/ReactClass type, [object props], [children ...] ) 第一个参数:能够是一个字符串,也能够是一个HTML标签的元素,或者是ReactClass类型的对象 第二个参数:是一个对象或者字段,表示组件的全部属性 第三参数:元素的子元素 JSX对象转换为: //不带属性 <h1>I am XYQ</h1> <===> React.createElement("h1", null, "I am XYQ"); //若带属性 <h1 width:"20px">I am XYQ</h1> <===> React.createElement("h1", {width:"20px"}, "I am XYQ"); //带样式的 <h1 style={{color:'#ff0000', fontSize:'14px'}}>I am XYQ</h1> <===> React.createElement("h1",{style:{color:'#ff0000',fontSize:'14px'}}, "I am XYQ")
4、动手
IDE:WebStorm或Sublime
文件结构的组成:
HTML中建立组件:
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>Hello React</title> <script src="react.js"></script> <script src="react-dom.js"></script> <script src="browser.min.js"></script> </head> <body> <script type="text/babel"> ReactDOM.render( <h1>I am XYQ</h1>, document.body ); </script> </body> </html>
5、分析
一、在head中,经过<script src=""></script>引入了React的3个核心js框架,做用上面已经有过解释;
二、在body中,经过<script type="text/babel"></script>引入JSX编译器对建立的JSX对象进行解析;
三、内部解析的标准形式为:React.createElement(string/ReactClass type, [object props], [childre...] );
四、ReactDOM.render()是将JSX对象转化后挂载到父节点上,最后并渲染到DOM模型上进行展现;
五、ReactDOM.render()两个参数分别是JSX对象、挂载的父节点,本示例挂载到body显然实现了,可是是有问题的,不规范,应该在body内再建立新的节点,做为挂载的父节点使用,检查元素,警告日志以下:
6、规范
进行分析后,从新修改文件后,渲染结果是同样的,不过能够查看控制台警告发现已经去除了,修改以下:
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>Hello React</title> <script src="react.js"></script> <script src="react-dom.js"></script> <script src="browser.min.js"></script> </head> <body> <div id="example"></div> <script type="text/babel"> ReactDOM.render( <h1>I am XYQ</h1>, document.getElementById('example') ); </script> </body> </html>
7、组件
上面的代码是常规的方式,建立jsx对象,而后转换解析成DOM,最后进行渲染出来。React之因此能如此流行,主要是它采用了组件化的思想来构建界面。React提供了createClass方法来专门建立自定义的组件,组件内部经过render方法返回一个jsx对象,而后再经过ReactDOM.render方法将建立的组件渲染出来。ReactJS中约定自定义的组件标签首字母必定要大写,这样便于区分是组件标签仍是HTML标签。
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>Hello React</title> <script src="react.js"></script> <script src="react-dom.js"></script> <script src="browser.min.js"></script> </head> <body> <div id="example"></div> <script type="text/babel"> <!-- 建立一个HelloMessage组件 --> var HelloMessage = React.createClass({ render: function(){ <!-- 建立一个jsx对象 --> return <h1>welcome XYQ!</h1> } }); <!-- 将HelloMessage组件挂载到父节点div上,并渲染出来 --> ReactDOM.render(<HelloMessage/>, document.getElementById('example')); </script> </body> </html>
8、属性
上面的例子中,数据都固定的,那么若是想要经过传入数据的形式进行更新,该如何作呢?React中对数据的绑定也作了处理,React中默认了组件身份为this对象,this对象都含有一个隐藏的props字段,它是从父组件传递给子组件的,经过这个字段开发者就能够经过this.props获取属性对象。react官方认为,props应该是只读的,不该该被修改。以下:
一、普通属性: this.props.varName
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>Hello React</title> <script src="react.js"></script> <script src="react-dom.js"></script> <script src="browser.min.js"></script> </head> <body> <div id="example"></div> <script type="text/babel"> <!-- 建立HelloMessage组件 --> var HelloMessage = React.createClass({ render: function(){ <!-- 建立jsx对象 --> <!-- this.props.name获取到了HelloMessage组件的name属性 --> return <h1>welcome {this.props.name}!</h1> } }); <!-- 渲染组件 --> <!-- 给HelloMessage组件的name属性赋值 --> ReactDOM.render(<HelloMessage name="HelloMessage" />, document.getElementById('example')); </script> </body> </html>
二、数组属性: this.props.children
注意:this.props.children的值有三种可能:若是当前组件没有子节点,它是undefine; 若是有一个子节点,数据类型是Object; 若是有多个子节点,数据类型是Array。
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>Hello React</title> <script src="react.js"></script> <script src="react-dom.js"></script> <script src="browser.min.js"></script> </head> <body> <div id="example"></div> <script type="text/babel"> var HelloMessage = React.createClass({ render: function(){ return ( <div> <ol> { <!-- {this.props.children} --> <!-- React.Children.map()是React提供的对children的遍历 --> React.Children.map(this.props.children,function(child){ return <li>{child}</li>; }) } </ol> </div> ); } }); ReactDOM.render( <div> <HelloMessage>HelloMessage1</HelloMessage> <HelloMessage>HelloMessage2</HelloMessage> <HelloMessage>HelloMessage3</HelloMessage> </div>, document.querySelector('#example') ); </script> </body> </html>
9、样式
在作Web开发中,元素的样式是必不可少的,由于没有CSS布局,渲染的界面会是很丑的,那么在JSX中是如何使用样式的呢?有两种方式,分别以下所示:
一、引用CSS布局
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>Hello React</title> <script src="react.js"></script> <script src="react-dom.js"></script> <script src="browser.min.js"></script> <style type="text/css"> #container { padding: 50px; background-color: red; } /*
这种方式不以下面采用类名的方式设置CSS布局更直接 div div div { padding: 10px; margin: 10px; display: inline-block; background-color: #ffde00; color: #333; font-family: monospace; text-align: center; } */ .helloMessage { padding: 10px; margin: 10px; display: inline-block; background-color: #ffde00; color: #333; font-family: monospace; text-align: center; } </style> </head> <body> <div id="container"></div> <script type="text/babel"> var HelloMessage = React.createClass({ render: function(){ return ( <div className="helloMessage"> //添加类名,只能是className,不能写成class {this.props.children} </div> ); } }); ReactDOM.render( <div> <HelloMessage>I</HelloMessage> <HelloMessage>A</HelloMessage> <HelloMessage>M</HelloMessage> <HelloMessage>X</HelloMessage> <HelloMessage>Y</HelloMessage> <HelloMessage>Q</HelloMessage> </div>, document.querySelector('#container') ); </script> </body> </html>
二、嵌入JSX布局
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>Hello React</title> <script src="react.js"></script> <script src="react-dom.js"></script> <script src="browser.min.js"></script> <style type="text/css"> #container { padding: 50px; background-color: red; } </style> </head> <body> <div id="container"></div> <script type="text/babel"> var HelloMessage = React.createClass({ render: function(){ //将CSS的样式生成一个JS对象 var helloMessageStyle = { padding: 10, margin: 10, backgroundColor: this.props.bgcolor, //获取组件属性bgcolor color: "#333", display: "inline-block", fontFamily: "monospace", fontSize: 32, textAlign: "center" }; return ( <div style={helloMessageStyle}> //将上面的CSS的JS对象嵌入到JSX中 {this.props.children} </div> ); } }); ReactDOM.render( <div> <HelloMessage bgcolor="#58B3FF">I</HelloMessage> //设置组件属性bgcolor <HelloMessage bgcolor="#FF605F">A</HelloMessage> <HelloMessage bgcolor="#FFD52E">M</HelloMessage> <HelloMessage bgcolor="#49DD8E">X</HelloMessage> <HelloMessage bgcolor="#AE99FF">Y</HelloMessage> <HelloMessage bgcolor="#EF4d6F">Q</HelloMessage> </div>, document.querySelector('#container') ); </script> </body> </html>
10、事件
俗话说代码之间没有交互,就至关于没有灵魂。了解了React中JSX的定义和样式后,再来看看JSX中如何完成事件绑定的。其实,JSX中事件的绑定和HTML使用的绑定事件几乎是同样的,JSX支持全部的HTML元素的事件。不过,须要注意的是,JSX中的事件名称必须采用驼峰式写法。例如点击事件,须要写成onClick,不能写成onclick,不然不会生效。无参数时:onClick = {function.bind(this)}、有参数时: onClick = {function.bind(this, 'argName')}。以下所示
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>Hello React</title> <script src="react.js"></script> <script src="react-dom.js"></script> <script src="browser.min.js"></script> <style type="text/css"> #container { padding: 50px; background-color: red; } </style> </head> <body> <div id="container"></div> <script type="text/babel"> var HelloMessage = React.createClass({ render: function(){ //定义一个点击函数的js事件对象并接收一个参数 function testClick(message){ alert(message); } var helloMessageStyle = { padding: 10, margin: 10, backgroundColor: this.props.bgcolor, color: "#333", display: "inline-block", fontFamily: "monospace", fontSize: 32, textAlign: "center" }; //对组件绑定上面的事件,并传入参数 return ( <div style={helloMessageStyle} onClick={testClick.bind(this, this.props.message)}> {this.props.children} </div> ); } }); ReactDOM.render( <div> <HelloMessage bgcolor="#58B3FF" message='I'>I</HelloMessage> <HelloMessage bgcolor="#FF605F" message='A'>A</HelloMessage> <HelloMessage bgcolor="#FFD52E" message='M'>M</HelloMessage> <HelloMessage bgcolor="#49DD8E" message='X'>X</HelloMessage> <HelloMessage bgcolor="#AE99FF" message='Y'>Y</HelloMessage> <HelloMessage bgcolor="#EF4d6F" message='Q'>Q</HelloMessage> </div>, document.querySelector('#container') ); </script> </body> </html>