首页 > 代码库 > React入门
React入门
通常我学一门编程语言都是先从“hello world!”开始,React也不例外。
首先搞清楚React的运行方式,有2种,
第一种:
jsx语法糖直接编写在HTML中,这样不用离线转换jsx了。看下代码:
<!DOCTYPE html><html><head> <meta content="text/html; charset=utf-8" http-equiv="Content-Type"> <title></title></head><body><div id="example"></div><script type="text/jsx"> /** @jsx React.DOM */ React.renderComponent( <h1>hello,world!</h1>, document.getElementById(‘example‘) ); </script></body><script src=http://www.mamicode.com/"js/jsx/react.js"></script><script src=http://www.mamicode.com/"js/jsx/JSXTransformer.js"></script></html>
这段代码就是jsx的写法,当执行之后页面展示如下:
并不复杂,很简单,renderComponent()函数实例化根组件、启动框架和注入标记成一个原始的DOM元素,作为第二个参数提供。有2个参数,第一个为jsx脚本(类似html模板,由JSXTransformer.js将其转换为标准js,再由浏览器render 为html),第二个选择的DOM对象,让第一个参数插入到选择的DOM对象中去,renderComponent()相似于jQuery中的$(document).ready(),都是初始化加载操作,但React没有用到Jquery的封装,完全自己实现的机制。在renderComponent()函数中,对参数做了多次的判断逻辑,比如说参数是不是Object对象,参数是不是function类型,第一个参数中的props属性是否为空字符串等等。。。
看下源码就可以了解到renderComponent()函数的实现机制了,
renderComponent: function(nextDescriptor, container, callback) { ("production" !== "development" ? invariant( //这里判断参数nextDescriptor是否是object对象,返回的是ture或false ReactDescriptor.isValidDescriptor(nextDescriptor), ‘renderComponent(): Invalid component descriptor.%s‘, ( //这里判断参数nextDescriptor是否是函数,isValidFactory返回的是类型 ReactDescriptor.isValidFactory(nextDescriptor) ? ‘ Instead of passing a component class, make sure to instantiate ‘ + ‘it first by calling it with props.‘ : // Check if it quacks like a descriptor //这里判断参数nextDescriptor属性中的props属性是否为空字符串 typeof nextDescriptor.props !== "undefined" ? ‘ This may be caused by unintentionally loading two independent ‘ + ‘copies of React.‘ : ‘‘ ) ) : invariant(ReactDescriptor.isValidDescriptor(nextDescriptor))); var prevComponent = instancesByReactRootID[getReactRootID(container)]; if (prevComponent) { var prevDescriptor = prevComponent._descriptor; if (shouldUpdateReactComponent(prevDescriptor, nextDescriptor)) { return ReactMount._updateRootComponent( prevComponent, nextDescriptor, container, callback ); } else { ReactMount.unmountComponentAtNode(container); } } var reactRootElement = getReactRootElementInContainer(container); var containerHasReactMarkup = reactRootElement && ReactMount.isRenderedByReact(reactRootElement); var shouldReuseMarkup = containerHasReactMarkup && !prevComponent; var component = ReactMount._renderNewRootComponent( nextDescriptor, container, shouldReuseMarkup ); callback && callback.call(component); return component; }
这里调用了很多个封装的函数进行处理,renderComponent()函数就是进入React的第一个入口。
接下来用创建一个组件方式来写“hello,world!”
<!DOCTYPE html><html><head> <meta content="text/html; charset=utf-8" http-equiv="Content-Type"> <title></title>
<link rel="stylesheet" type="text/css" href="http://www.mamicode.com/css/index.css"/></head><body><div id="example"></div><script type="text/jsx"> /** @jsx React.DOM */ var CommentBox = React.createClass({ render:function(){ return ( <h1 className=‘hcolor‘> hello,world! </h1>); } }); React.renderComponent( <CommentBox />, document.getElementById(‘example‘) ); </script></body><script src=http://www.mamicode.com/"js/jsx/react.js"></script><script src=http://www.mamicode.com/"js/jsx/JSXTransformer.js"></script></html>
在这段代码中,我用createClass()函数进行自定义组件的创建,其实所谓创建组件是官方说法,最终创建出来的就是DOM元素,只不过这里进行动态生成的机制,感觉更灵活。至于组件的内容还有高级组件的创建后期再分享。
注:这里有个细节,当在render中返回DOM元素的时候,设置css样式用className才生效,如果想直接加入style属性,无效并且页面也不展示DOM元素!
在页面展示如下:
以上介绍了第一种编程方式 接下来想把页面中的js抽取出来单独的js文件并引用,这样就需要下面的方式了;
第二种:
jsx离线转换方式,在React官方网站已经详细说明了,
首先安装命令行工具(要求npm):
npm install -g react-tools
如果你的npm 运行连接失败,请设置一下npm的代理:
设置代理的命令: npm config set proxy=http://127.0.0.1:8087
npm config set registry=http://registry.npmjs.org
在cmd中操作一下即可,下面就是构建本地创建的js
jsx --watch src/ build/
这里src是目录,你可以自己定义,操作完就可以单独引用js进行操作了。
React还有很多要去研究,继续激情的前进着。。。
React入门