zoukankan      html  css  js  c++  java
  • 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="js/jsx/react.js"></script>
    <script src="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="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="js/jsx/react.js"></script> <script src="js/jsx/JSXTransformer.js"></script> </html>

    在这段代码中,我用createClass()函数进行自定义组件的创建,其实所谓创建组件是官方说法,最终创建出来的就是DOM元素,只不过这里进行动态生成的机制,感觉更灵活。至于组件的内容还有高级组件的创建后期再分享。

    注:这里有个细节,当在render中返回DOM元素的时候,设置css样式用className才生效,如果想直接加入style属性,官方提供了内联样式写法!

    在页面展示如下:

    以上介绍了第一种编程方式 接下来想把页面中的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还有很多要去研究,继续激情的前进着。。。

  • 相关阅读:
    kubestack 源码分析
    CNI IPAM插件分析 --- 以hostlocal为示例
    CNI bridge 插件实现代码分析
    CNI插件实现框架---以loopback为示例
    CNI Proposal 摘要
    OpenStack Network --- introduction部分 阅读笔记
    javascript变量,类型 第9节
    html页面布局 第8节
    css样式继承 第7节
    css样式 第6节
  • 原文地址:https://www.cnblogs.com/kuailingmin/p/3998187.html
Copyright © 2011-2022 走看看