初识react | 青训营笔记

83 阅读2分钟

这是我参与【第五届青训营】笔记创作活动的第3天

一、React是什么

React:用于构建用户界面的 JavaScript 库;

React的官网文档:zh-hans.reactjs.org/

  • 是声明式编程

  • 组件化开发

  • 多平台适配

二、React的开发依赖

2.1.依赖三个库

依赖三个库

  • react:包含react所必需的核心代码
  • react-dom: react渲染在不同平台所需要的核心代码
  • babel:将jsx转换成React代码的工具

注意:

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

react-dom针对web和native所完成的事情不同:

  • web端:react-dom会将jsx最终渲染成真实的DOM,显示在浏览器中
  • native端:react-dom会将jsx最终渲染成原生的控件(比如Android中的Button,iOS中的UIButton)。

babel:

babel是什么呢?

  • Ba bel ,又名 Babel.js
  • 是目前前端使用非常广泛的编译器、转移器。
  • 比如当下很多浏览器并不支持ES6的语法,但是确实ES6的语法非常的简洁和方便,我们开发时希望使用它。
  • 那么编写源码时我们就可以使用ES6来编写,之后通过Babel工具,将ES6转成大多数浏览器都支持的ES5的语法。

React和Babel的关系:

  • 默认情况下开发React其实可以不使用babel。
  • 但是前提是我们自己使用 React.createElement 来编写源代码,它编写的代码非常的繁琐和可读性差。
  • 那么我们就可以直接编写jsx(JavaScript XML)的语法,并且让babel帮助我们转换成React.createElement。

2.2.依赖引入

  1. 通过CDN引入
  2. 下载后,添加本地依赖
  3. npm

三、hello React案例

3.1.第一个hello React案例

  • 添加type="text/babel":让babel解析jsx的语法
  • ReactDOM.createRoot函数
    • 用于创建一个React根,之后渲染的内容会包含在这个根上
    • 参数: 将渲染的内容,挂载到某一个html元素上去
  • root.render函数
    • 参数:要渲染的根组件
  • 通过{}语法引入外部的变量或表达式
<script type="text/babel">
      const root = ReactDOM.createRoot(document.querySelector("#root"));

      // 1.将文本定义成变量
      let message = "hello World";

      // 2.监听按钮的点击
      function btnClick() {
        // 1.修改数据
        message = "hello React";
        // 2.重新渲染界面
        rootRender();
      }

      // 3.封装一个渲染函数
      function rootRender() {
        root.render(
          <div>
            <h2>{message}</h2>
            <button onClick={btnClick}>修改文本</button>
          </div>
        );
      }
      rootRender();
    </script>

3.2.hello React组件化开发

<script type="text/babel">
      // 使用组件进行重构代码
      // 类组件和函数式组件’
      class App extends React.Component {
        // 组件数据
        constructor() {
          super();
          this.state = {
            message: "Hello World",

            name: "kk",
            age: 18,
          };
          // 对需要绑定的方法,提前绑定好this
          this.btnClick = this.btnClick.bind(this);
        }
        // 组件方法(实例方法)
        btnClick() {
          // 内部完成了两件事情
          // 1,将state中message值修改掉, 2.自动重新执行render函数
          this.setState({
            message: "hello React",
          });
        }
        // 渲染内容render方法
        render() {
          return (
            <div>
              <h2>{this.state.message}</h2>
              <button onClick={this.btnClick}>修改文本</button>
            </div>
          );
        }
      }

      // 将组件渲染到界面上
      const root = ReactDOM.createRoot(document.querySelector("#root"));
      // App根组件
      root.render(<App />);
    </script>
  1. 封装组件
  • 以类的方式封装组件(类名大写,组件名称大写)
  • render函数返回当前的jsx内容
  1. 数据依赖
  • 数据定义在当前对象的state中
  • this.state={} 括号里面是定义的数据
  • 数据变化时,调用this.setState更新数据,并且通知React进行upDate操作,(进行update操作时,就会重新调用render函数,使用最新的数据,来渲染页面)
  1. 事件绑定
  • onClick

3.3.案例

计数器案例

<script type="text/babel">
      // 1.创建root
      const root = ReactDOM.createRoot(document.querySelector("#root"));

      // 封装组件
      class App extends React.Component {
        constructor() {
          super();
          this.state = {
            counter: 20,
          };
          this.increment = this.increment.bind(this);
          this.decrement = this.decrement.bind(this);
        }
        render() {
          const { counter } = this.state;
          return (
            <div>
              <h2>当前计数: {counter}</h2>
              <button onClick={this.increment}>+1</button>
              <button onClick={this.decrement}>-1</button>
            </div>
          );
        }
        increment() {
          this.setState({
            counter: this.state.counter + 1,
          });
        }
        decrement() {
          this.setState({
            counter: this.state.counter - 1,
          });
        }
      }
      // 2,渲染组件
      root.render(<App />);
    </script>

电影列表案例——进行列表数据的展示

  • for循环
  • map
<script type="text/babel">
      const root = ReactDOM.createRoot(document.querySelector("#root"));

      class App extends React.Component {
        constructor() {
          super();

          this.state = {
            movies: ["千与千寻", "你的名字", "烟花", "天气之子"],
          };
        }
        render() {
          // 1、for循环
          //   const arr = [];
          //   for (let i = 0; i < this.state.movies.length; i++) {
          //     const item = this.state.movies[i];
          //     const liItem = <li>{item}</li>;
          //     arr.push(liItem);
          //   }
          // 2.map
          //   const arr = this.state.movies.map((item) => <li>{item}</li>);
          return (
            <div>
              <h2>电影列表</h2>
              <ul>
                {this.state.movies.map((item) => (
                  <li>{item}</li>
                ))}
              </ul>
            </div>
          );
        }
      }

      root.render(<App />);
    </script>