React介绍及CDN方式实现Hello React案例

# React学习--day01 

## 一、React简要介绍和学习路线

### 1、React是什么?

​    React官方解释是用于构建用户界面的JavaScript库

​    目前对于前端开发来说,几乎很少直接使用原生的JavaScript来开发应用程序,而是选择一个JavaScript库(框架)

​        在过去的很长时间内,jQuery是被使用最多的JavaScript库;

​        在过去的一份调查中显示,全球前10,000个访问最高的网站中,有65%使用了jQuery,是当时最受欢迎的JavaScript库;

​        但是,目前甚至已经处于淘汰的边缘了;

### 2、如何学习React?

​    1)官方文档阅读网址:https://zh-hans.reactjs.org/

​    2)开源项目,eg:And Design

​    个人路线:还是跟着coderwhy先把基础学扎实了,再看开源

### 3、React课程体系(coderwhy)

更正:三、Rudex==>Redux

## 二、邂逅React开发

### 1、React的介绍和特点

​    1)**介绍:**React:用于构建用户界面的JavaScript库(网址:https://zh-hans.reactjs.org/)

​    2)**特点:**

​    **声明式编程**:

​        声明式编程是目前整个大[前端开发](https://so.csdn.net/so/search?q=前端开发&spm=1001.2101.3001.7020)的模式:Vue、React、Flutter、SwiftUI;

​        它允许我们只需要维护自己的状态,当状态改变时,React可以根据最新的状态去渲染我们的UI界面;

​    **组件化开发:**

​        组件化开发页面目前前端的流行趋势,我们会将复杂的界面拆分成一个个小的组件;

​        如何合理的进行组件的划分和设计也是后面我会讲到的一个重点;

​    **多平台适配:**

​        2013年,React发布之初主要是开发Web页面;

​        2015年,Facebook推出了ReactNative,用于开发移动端跨平台;(虽然目前Flutter非常火爆,但是还是有很多公司在使用 ReactNative);

​        2017年,Facebook推出ReactVR,用于开发虚拟现实Web应用程序;(VR也会是一个火爆的应用场景);

### 2、Hello React案例说明

​        需求:在界面上显示一个文本:Hello world;点击文本下方按钮,点击后文本改为Hello React

### 3、React的开发依赖

​        在编写react代码前,需引入依赖库:

​        react:包含react所必须的核心代码

​        react-dom:react渲染在不同平台所需要的核心代码

​        babel:将jsx转换成React代码的工具

​        react和react-dom库已经能够编写react代码,并将其渲染出来;需要第三个包的原因是:在进行react开发,编写的react代码包含jsx语法,默认情况下浏览器是不识别的;所以需要babel将其变化成普通的Js代码让浏览器识别。

​        **第一次接触React会被它繁琐的依赖搞蒙,居然依赖这么多东西: (直接放弃?) --坚持就是胜利**

​                对于Vue来说,我们只是依赖一个vue.js文件即可,但是react居然要依赖三个包。

​                其实呢,这三个库是各司其职的,目的就是让每一个库只单纯做自己的事情;

​                在React的0.14版本之前是没有react-dom这个概念的,所有功能都包含在react里

​        **为什么要进行拆分呢?原因就是推出react-native**

​                react包中包含了react web和react-native所共同拥有的核心代码。

​                react-dom针对web和native所完成的事情不同:(暂时不太清楚具体,先知道有这么回事吧~)

​                √web端:react-dom会将jsx最终渲染成真实的DOM,显示在浏览器中

​                √native端:react-dom会将jsx最终渲染成原生的控件(比如Android中的Button,iOS中的UIButton)

​        **Babel是什么呢?**

​                    Babel ,又名 Babel.js;是目前前端使用非常广泛的编译器、转移器。

​                    比如当下很多浏览器并不支持ES6的语法,但是确实ES6的语法非常的简洁和方便,我们开发时希望使用它。

​                    那么编写源码时我们就可以使用ES6来编写,之后通过Babel工具,将ES6转成大多数浏览器都支持的ES5的语法。

​        **React和Babel的关系:**

​                    默认情况下开发React其实可以不使用babel。

​                    但是前提是我们自己使用 React.createElement 来编写源代码,它编写的代码非常的繁琐和可读性差。 

​                    那么我们就可以直接编写jsx(JavaScript XML)的语法,并且让babel帮助我们转换成React.createElement。

​                    后续还会详细讲到

​        **如何添加这三个依赖呢?**

​                    方式一:直接CDN引入

​                    方式二:下载后,添加本地依赖

​                    方式三:通过npm管理(后续脚手架再使用这种方式)

### 4、通过CDN的方式实现2中的Hello React案列

​        **正式实现案例之前,先实现使用react在页面上Hello React**

​        实现步骤:

​        ①引入React开发依赖

        <script src="https://unpkg.com/react@18/umd/react.development.js" crossorigin></script>
        <script src="https://unpkg.com/react-dom@18/umd/react-dom.development.js" crossorigin></script>
        <script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>

​        这里的crossorigin的属性的目的是为了拿到跨域脚本的错误信息

​        ②在编写React的script代码中,必须添加 type="text/babel",babel才会对代码进行转化;即可以让babel解析jsx的语法

        <script type="text/babel">    </script>

​        ③渲染Hello World

​        在react18之前:通过ReactDOM.render()实现,有两个参数,第一个渲染内容,第二个渲染地    

```
<body>
    <div id="root">
    </div>
    <script src="https://unpkg.com/react@18/umd/react.development.js" crossorigin></script>
    <script src="https://unpkg.com/react-dom@18/umd/react-dom.development.js" crossorigin></script>
    <script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>
    <script type="text/babel">
        // 渲染Hello world
        //在react18之前:ReactDOM.render()实现,有两个参数,第一个渲染内容,第二个渲染地
        ReactDOM.render(<h2>Hello world</h2>, document.querySelector('#root'))
    </script>
</body>
```

​        在react18后,使用ReactDOM.createRoot()先创建一个根,告诉内容渲染在哪里;再使用render()传入内容

```
        //在react18之后:该方式可以创建多个根,但这个根目前还没有东西
        const root=ReactDOM.createRoot(document.querySelector('#root'));
        //拿到root使用render传入内容
        root.render(<h2>Hello world</h2>);
```

​        **回顾下vue实现Hello Vue:**(对比学习加强记忆)

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

    <!-- CDN引入Vue -->
    <script src="https://unpkg.com/vue@next"></script>

    <script>
      const app = Vue.createApp({
        template: `<h2>Hello Vue3</h2>`,
      });

      // 挂载到id为app的元素上
      app.mount("#app");
    </script>
```

​        个人感觉本质上是差不多的。

​        **正式实现2中提出的需求:**

​        在界面显示一个文本:Hello World;点击下方的一个按钮,点击后再将文本改变为Hello React

​        

​        ①将元素渲染到页面

​        通过`{}`语法来引入外部变量或者表达式;根据之前的知识能快速实现上图左边部分

```
<body>
    <div id="root">   
    </div>
    <script src="https://unpkg.com/react@18/umd/react.development.js" crossorigin></script>
    <script src="https://unpkg.com/react-dom@18/umd/react-dom.development.js" crossorigin></script>
    <script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>
    <script type="text/babel">
        let message="Hello World";
        const root=ReactDOM.createRoot(document.querySelector("#root"))
        root.render((<div>
            <h2>{message}</h2>
            <button>改变文本</button>
            </div>
            ))
        // 括号里面的括号表示一个整体
    </script>
</body>
```

​        ②现需实现点击button改变内容;具体实现:监听按钮的点击,定义一个函数,将其绑定给button

​        【vue中用@click】,react中,onClick={函数名}

```
    function btnClick(){
            message="Hello React";
        }
        root.render((<div>
            <h2>{message}</h2>
            <button onClick={btnClick}>改变文本</button>
            </div>
            ))
```

​        **注:此时存在问题:在vue中如果把数据修改了,会重新自动执行,然后根据最新的数据渲染界面;而React默认情况下不会重新执行,所以需在修改完数据后,重新渲染**    

```
<body>
    <div id="root">   
    </div>
    <script src="https://unpkg.com/react@18/umd/react.development.js" crossorigin></script>
    <script src="https://unpkg.com/react-dom@18/umd/react-dom.development.js" crossorigin></script>
    <script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>
    <script type="text/babel">
        let message="Hello World";
        const root=ReactDOM.createRoot(document.querySelector("#root"));
        function btnClick(){
            // 修改数据
            message="Hello React";
            // 重新渲染界面
            root.render((<div>
            <h2>{message}</h2>
            <button onClick={btnClick}>改变文本</button>
            </div>
            ))
        }
        root.render((<div>
            <h2>{message}</h2>
            <button onClick={btnClick}>改变文本</button>
            </div>
            ))
        // 括号里面的括号表示一个整体
    </script>
</body>
```

​        ③优化:封装一个渲染函数,将重复代码抽取在函数中,进而简化代码。

```
    <script type="text/babel">
        let message="Hello World";
        const root=ReactDOM.createRoot(document.querySelector("#root"));
        function btnClick(){
            // 修改数据
            message="Hello React";
            // 重新渲染界面
            rootRender()
        }
        rootRender()
        // 括号里面的括号表示一个整体
        function rootRender(){
            root.render((<div>
            <h2>{message}</h2>
            <button onClick={btnClick}>改变文本</button>
            </div>
            ))
        }
    </script>
```