zoukankan      html  css  js  c++  java
  • react

    一、React 说明

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

    1、React 的特点

    • 使用JSX语法创建组件,实现组件化开发,为函数式的 UI 编程方式打开了大门;
    • 性能高:通过 diff算法 和 虚拟DOM 实现视图的高效渲染和更新;
    • 声明式、组件化、一处学习到处编写 哒哒哒

    2、react 核心

    虚拟DOM:React将DOM抽象为虚拟DOM,虚拟DOM其实就是用一个对象来描述DOM,通过对比前后两个对象的差异,最终只把变化的部分重新渲染,提高渲染的效率

    为什么用虚拟DOM?
    当DOM发生更改时需要遍历DOM对象的属性, 而原生DOM可遍历属性多达200多个个, 而且大部分属性与渲染无关, 导致更新页面代价太大。

    虚拟DOM的处理方式?
    1) 用 JS对象结构表示 DOM 树的结构,然后用这个树构建一个真正的 DOM 树,插到文档当中。
    2)当状态变更的时候,重新构造一棵新的对象树。然后用新的树和旧的树进行比较,记录两棵树差异。
    3) 把记录的差异应用到步骤1所构建的真正的DOM树上,视图就更新了。


    Diff算法:

    最小化页面重绘
    当我们使用React在render() 函数创建了一棵React元素树,在下一个state或者props更新的时候,render() 函数将会创建一棵新的React元素树。
    React将对比这两棵树的不同之处,计算出如何高效的更新UI(只更新变化的地方),此处所采用的算法就是diff算法。



    二、JSX语法全面入门

    总结
    1. JSX只是高级语法糖, 最终执行时还是会被转成原生js, 通过babel等方式;
    2. 更加语义化, 更加直观, 代码可读性更高;
    3. 性能相对原生方式更加好一些

    1.jsx语法创建虚拟DOM

    <body>
    <div id="app"></div>
    <script src="../js/react.development.js"></script>
    <script src="../js/react-dom.development.js"></script>
    <script src="../js/babel.min.js"></script>
    <script type="text/babel">
        // 1 获取页面上的真实容器
        const containerDiv = document.getElementById('app');
        // 2. jsx 语法创建虚拟dom
        const vDom = <div><span>hello</span><p>Nice to meet you! Sir.</p></div>;
        // 3. 将虚拟 dom 放进去
        ReactDOM.render(vDom, containerDiv);
    </script>
    
    
    

    执行结果

    <script type="text/babel">
        // 1. jsx语法创建虚拟DOM
        const vDom = <div><span>非物质文化遗憾!</span><p>藏族唐卡!</p></div>;
        // 3. 将虚拟的DOM放入
        ReactDOM.render(vDom, document.getElementById('app'));
    </script>
    

    执行结果

    2.典型js方式 和 JSX方式 对比:

    <body>
    <div id="app1"></div>
    <div id="app2"></div>
    <script src="../js/react.development.js"></script>
    <script src="../js/react-dom.development.js"></script>
    <script src="../js/babel.min.js"></script>
    <script type="text/babel">
        // 1.定义变量
        const myClass = 'box01';
        const myContent = 'hello world';
        // 2.创建虚拟 dom
        const vDom = React.createElement('span',{className:myClass},myContent);
        // 3. 渲染到页面
        ReactDOM.render(vDom,document.getElementById('app1'));
    
    </script>
    
    <script type="text/babel">
        // 1. 创建虚拟的DOM
        const vDom1 = <span className={myClass.toLocaleUpperCase()}> {myContent} </span>;
        // 2. 渲染到页面
        ReactDOM.render(vDom1, document.getElementById('app2'));
    </script>
    </body>
    

    image.png


    3. 多层标签嵌套

    <body>
    <div id="app"></div>
    <script src="../js/react.development.js"></script>
    <script src="../js/react-dom.development.js"></script>
    <script src="../js/babel.min.js"></script>
    <script type="text/babel">
        ReactDOM.render(
            <div>
                <h3>多层标签嵌套</h3>
                <p>嵌套多个标签,要用一个大标签包起来</p>
            </div>
            ,
            document.getElementById('app')
        );
    </script>
    </body>
    

    多层标签嵌套

    4.js中的变量, 表达式要写在{}内

    <script type="text/babel">
        ReactDOM.render(
            <div>
                <p>100+200 = {100+200}</p>
            </div>
            ,
            document.getElementById('app')
        );
    </script>
    

    5.内联样式通过对象方式引入

    <script type="text/babel">
        const myStyle = {
            backgroundColor:'blue',
            color:'red',
            fontSize:'30px'
        }
        ReactDOM.render(
            <div>
                <p style={myStyle}>全球果实盛宴</p>
            </div>
            ,
            document.getElementById('app')
        );
    </script>
    

    image.png


    6.数组遍历

    <script type="text/babel">
        // 1. 数据
        const dataArr = [
            {name: '张三', age: 29},
            {name: '李四', age: 20},
            {name: '王五', age: 42},
            {name: '老裕泰', age: 80}
        ];
        // 2 创建虚拟dom
        const vDom = (
            <ul>
                {/* 请注意,注释要采用这种方式, */}
                {dataArr.map((data,index)=> //注意这里没有尖括号了,可以换成() ,但是不能用尖括号
                    <li key={index}>序号:{index+1} - 姓名:{data.name}- 年龄:{data.age}岁</li>
                )}
            </ul>
        );
        ReactDOM.render(vDom,document.getElementById('app'));
    </script>
    

    遍历数据

    四、React中的组件/模块, 组件化/模块化

    1)组件
    一个应用/版块/页面中用于实现某个局部的功能(包括html, js, css等)
    把这些局部功能组装到一起就形成了完整的一个大的功能
    主要目的在于: 复用代码, 提高项目运行效率。
    2)组件化
    如果一个应用是用多组件的方式进行综合开发的, 那么这个应用就是一个组件化应用。
    3)模块
    多个组件形成模块, 或者是一个提供特定功能的js文件, 主要特点在于耦合性低, 可移植性高, 执行效率好。
    4)模块化
    如果一个应用都是用模块的形式来构建的,那么这个应用就是模块化应用。

  • 相关阅读:
    Mongo连接远程数据库
    将MongoDB服务器设置成Windows启动服务(win10)
    关于php初学者的理解!请大家浏览并指出不足!谢谢!
    python+selenium初学者常见问题处理
    极客时间测试专栏阅读总结——软件测试总体方案
    pytest 一.安装和使用入门
    软件测试工程师——你不仅仅应该会点点点
    测试电梯、杯子、桌子、洗衣机的方法
    软件测试面试-软件测试宝典
    支付测试场景
  • 原文地址:https://www.cnblogs.com/friday69/p/10295555.html
Copyright © 2011-2022 走看看