一、react简介

1.1、概述


React 起源于 Facebook(脸书) 的内部项目,它是一个用于构建用户界面的 javascript 库,Facebook用它来架设公司的Instagram网站,并于2013年5月开源。

React 拥有较高的性能,代码逻辑非常简单,越来越多的人已开始关注和使用它。认为它可能是将来 Web 开发的主流工具之一。

1.2、特点


  •  声明式

你只需要描述UI看起来是什么样式,就跟写HTML一样,React负责渲染UI

  • 基于组件

组件时React最重要的内容,组件表示页面中的部分内容

  • 学习一次,随处使用

使用React可以开发Web应用(ReactJs),使用React可以开发移动端(react-native),可以开发VR应用(react 360)

1.3、React与传统MVC的关系


React用于构建用户界面的JavaScript库,它不是一个完整的MVC框架,最多可以认为是MVC中的V(view),甚至React并不非常认可MVC开发模式。

React构建页面UI库。可以简单地理解为,React将界面分成各个独立的小块,每一个块就是组件,这些组件可以组合、嵌套,就成了我们的页面。

1.4、浏览器扩展与VSCode开发扩展安装


1.4.1、Chrome浏览器扩展

打开Chrome 浏览器设置,点击更多工具,点击扩展程序,点击加载已解压的扩展程序,找到fmkadmapgofadopljbjfkapdkoienihi-4.15.0-8112021-Crx4Chrome.com.crx文件(我会上传),然后选择该文件即可。

react Fiber架构解决了什么问题 react框架介绍_html

 1.4.2、VSCode安装react开发扩展

react Fiber架构解决了什么问题 react框架介绍_前端_02

1.5、使用react打印出hello world


react Fiber架构解决了什么问题 react框架介绍_前端_03

附代码: 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <!-- 1、引入react js文件 -->
    <!-- react.js 核心包  react-dom.js 相关dom操作的包 -->
    <script src="https://unpkg.com/react@17/umd/react.development.js"></script>
    <script src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script>
    <!-- 2、挂载点 -->
    <!-- 解释:react渲染之后的内容统一挂在到当前#app元素中-->
    <div id="app"></div>
    <!-- 3、创建 -->
    <script>
        ReactDOM.render(
            //在js中有:document.createElement(节点名,属性,子元素)
            //在react有:React.createElement(节点名,属性,子元素)
            React.createElement('p','','hello world'),
            document.querySelector('#app')
        )
        /* 
          react渲染过程:
          1、拿到react组件中state中的数据,通过object.defineperoprty进行监听
          2、通过render函数,把组件渲染成vdom
          3、通过patch函数,把vdom挂载到真实的dom上
        */
    </script>
</body>
</html>

二、JSX


2.1、简介


由于通过React.createElement()方法创建的React元素有一些问题,代码比较繁琐,结构不直观,无法一眼看出描述的结构,不优雅,开发时写代码很不友好。

React使用 JSX 来替代常规的JavaScript,JSX 可以理解为的JavaScript语法扩展,它里面的标签申明要符合XML规范要求。React不一定非要使用JSX,但它有以下优点:

  • JSX执行更快,因为它在编译为JavaScript代码后进行了优化
  • 它是类型安全的,在编译过程中就能发现错误
  • 声明式语法更加直观,与HTML结构相同,降低了学习成本,提升开发效率速
  • jsx语法中一定要有一个顶级元素包裹,否则编译报错,程序不能运行

jsx本质是什么?

jsx等同于vue模板,vue模板不是html,jsx不是js

2.2、使用JSX打印出hello world


react Fiber架构解决了什么问题 react框架介绍_html_04

附代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <!-- 1、引入react js文件 -->
    <!-- react.js 核心包  react-dom.js 相关dom操作的包 -->
    <script src="https://unpkg.com/react@17/umd/react.development.js"></script>
    <script src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script>
    <!-- 引入babel -->
    <script src="https://cdn.staticfile.org/babel-standalone/6.26.0/babel.min.js"></script>

    <!-- 2、挂载点 -->
    <!-- 解释:react渲染之后的内容统一挂在到当前#app元素中-->
    <div id="app"></div>
   
    <!-- 
        什么是jsx?
        react的模板叫jsx jsx不是js,是react的模板,既可以放react语法,又可以放html元素

        如何使用jsx?
        1、引入babel
        2、type="text/babel"
        3、jsx提取出来一个变量
     -->

    <!-- 3、创建 -->
    <script type="text/babel">
        //jsx提取出来一个变量
        var mydiv = <div>hello world</div>
        ReactDOM.render(
            mydiv,
            document.querySelector('#app')
        )
    </script>
</body>
</html>

 2.3、插值表达式


react Fiber架构解决了什么问题 react框架介绍_html_05

附代码:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script src="https://unpkg.com/react@17/umd/react.development.js"></script>
    <script src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script>
    <script src="https://cdn.staticfile.org/babel-standalone/6.26.0/babel.min.js"></script>

    <div id="app"></div>

    <!-- 
        react插值语法:{} 可以放变量 表达式 函数调用
     -->

    <script type="text/babel">
        var name = '王昭没有君啊';
        var flag = false;
        var myJsx = (
            //jsx必须要有一个根节点
            <div>
                <h3>插值表达式案例:</h3>
                <p>{name}</p>
                <p>{flag ? '王昭没有君啊' : '王昭君'}</p>
            </div>
        )
        //进行渲染
        ReactDOM.render(
            myJsx,
            document.querySelector('#app')
        )
    </script>
</body>

</html>

2.4、动态属性


react Fiber架构解决了什么问题 react框架介绍_JSX_06

附代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .bgcolor{
            color: palevioletred;
        }
    </style>
</head>
<body>
    <script src="https://unpkg.com/react@17/umd/react.development.js"></script>
    <script src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script>
    <script src="https://cdn.staticfile.org/babel-standalone/6.26.0/babel.min.js"></script>

    <div id="app"></div>

    <!-- 
        动态属性
        react动态属性 直接在属性后面加{} 就可以,
        里面可以放变量,表达式函数调用
        jsx中没有class 用className来替代
     -->

    <script type="text/babel">
        var mycolor = 'bgcolor';
        var myJsx = (
            <div>
                <h3>动态属性案例</h3>
                {/* 静态属性 */}
                <p className="bgcolor">王昭没有君啊</p>
                {/* 动态属性 */}
                <p className={mycolor}>王昭没有君啊</p>
                {/* 需求:把某个html片段插入某个标签中 */}
                <p dangerouslySetInnerHTML={{__html:'<a href="http://baidu.com">百度一下</a>'}}></p>
            </div>
        );
        ReactDOM.render(
            myJsx,
            document.querySelector('#app')
        )
    </script>
</body>
</html>

2.5、循环数组


react Fiber架构解决了什么问题 react框架介绍_前端_07

附代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script src="https://unpkg.com/react@17/umd/react.development.js"></script>
    <script src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script>
    <script src="https://cdn.staticfile.org/babel-standalone/6.26.0/babel.min.js"></script>

    <div id="app"></div>

    <!-- 
        工作中常用的数组循环方式
        arr.map() map是对当前数组进行遍历,处理每个元素,之后返回处理之后的数组。

        key的作用?
        简单的说就是为了提高渲染性能,底层使用diff算法来进行更新比较,
        相同的key diff是直接复用的,这样可以提高性能。
        
        工作中使用唯一主键作为key的值,不建议使用index来作为可以

     -->

    <script type="text/babel">
        var arr = [
            {id:1,name:'王昭',age:23},
            {id:2,name:'王昭君',age:24},
            {id:3,name:'王昭没有君啊',age:25}
        ]
        var myJsx = (
            <div>
               <h3>循环数组案例</h3> 
               {arr.map(item=>{
                   return <p key={item.id}>姓名:{item.name} , 年龄:{item.age}</p>
               })}
            </div>
        )
        ReactDOM.render(
            myJsx,
            document.querySelector('#app')
        )
    </script>

</body>
</html>

2.6、循环对象


react Fiber架构解决了什么问题 react框架介绍_前端_08

 附代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script src="https://unpkg.com/react@17/umd/react.development.js"></script>
    <script src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script>
    <script src="https://cdn.staticfile.org/babel-standalone/6.26.0/babel.min.js"></script>

    <div id="app"></div>

    <!-- 
        循环对象的方法:
        先把对象转化为数组,然后循环数组
     -->

    <script type="text/babel">
        var obj ={
            name: '王昭没有君啊',
            age: 23,
            address:'北京'
        }
        var myJsx = (
            <div>
                <h3>循环对象案例</h3>
                {Object.keys(obj).map(item=>{
                    return <p key={item}>属性:{item} ,属性值:{obj[item]}</p>
                })}
            </div>
        )
        ReactDOM.render(
            myJsx,
            document.querySelector('#app')
        )
    </script>
</body>
</html>

三、脚手架创建项目


3.1、React脚手架


React团队主要推荐使用create-react-app来创建React新的单页应用项目的最佳方式。

create-react-app会配置你的开发环境,以便使你能够使用最新的 JavaScript特性,提供良好的开发体验,并为生产环境优化你的应用程序。你需要在你的电脑上安装 Node >= 8.10 和 npm >= 5.6。

3.2、创建React项目


全局安装

不需要考虑路径,打开cmd输入:

npm install -g create-react-app

构建一个项目

在你想要创建项目的路径下,输入:

create-react-app my-test(my-test为项目名称,不能是中文)

出现如下信息,就表示reactjs项目创建成功

react Fiber架构解决了什么问题 react框架介绍_前端框架_09

 还需要注意的是,3月底发布了React18.0.0版本,我们工作一定要选一个稳定的版本去使用,因为它刚出的版本bug很多,还需要一段时间去维护,我们就需要回到项目中,安装一个稳定的版本,输入如下指令:

cnpm i -S  react@17.0.2 react-dom@17.0.2

react Fiber架构解决了什么问题 react框架介绍_react.js_10