react笔记01

一、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)模块化
如果一个应用都是用模块的形式来构建的,那么这个应用就是模块化应用。




构造函数创建组件:

<script type="text/babel">
    function Func1() {
        return <h2>妙明本心</h2>
    }

    ReactDOM.render(
        <Func1/>,
        document.getElementById('app')
    );

</script>
<script type="text/babel">
    function Func2(props) {
        return <h3>哒哒哒:{props.name} ,三个人分别是{props.name}</h3>
    }
    ReactDOM.render(
        <Func2 title = "古人" name={["李白 ","李煜 ","张择端 "]} />,
        document.getElementById('app')
    )
</script>
image.png



<script type="text/babel">
    function Name(props) {
        return <p>我叫{props.name},</p>
    }
    function Skill(props) {
        return <p>我的技能是 {props.skill}</p>
    }
    
    function LogInfo() {
        return(
            <div>
                <Name name="鸣人"/>
                <Skill skill = {["大玉螺旋丸 ","手里剑 ","会飞"]}/>
            </div>
        )
    }

    ReactDOM.render(
        <LogInfo/>,
        document.getElementById('app')
    )
</script>
image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,099评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,828评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,540评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,848评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,971评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,132评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,193评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,934评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,376评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,687评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,846评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,537评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,175评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,887评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,134评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,674评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,741评论 2 351

推荐阅读更多精彩内容