(一)React学习笔记

131 阅读5分钟

学习React的常用网址

第一个React 程序

说起Hello World这是我第一次手动在电脑上实现的输出, 那时候也可激动, 现在学习React 当然第一个也是它, 好似默认学习一门新语言的时候就行从Hello World开始的 首先建立一html文件, 在body中定义编写以下内容

   <!-- 定义一个节点 -->
 <div id="root"></div>

 <!-- 引入依赖, 不同的依赖负责不同的功能, crossorigin:启动本地服务的时候直接调用回产生跨域问题 -->
 <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>

 <!-- 编写type=“text/babel” 作用是让babel解析jsx的语法 -->
 <script type="text/babel">
   // 在当前模块内编写React代码(jsx语法)

   // 通过createRoot创建一个react根, 后续内容将渲染到这个跟里
   const root = ReactDOM.createRoot(document.querySelector("#root"));

   // 渲染内容,至root根节点中
   root.render(<h1>Hello World</h1>);

最后运行即可看到React的第一个Helo World

image.png

React中的变量及赋值

// 修改render方法
   root.render(
        <div>
          <h1>Hello World</h1>
          <button onClick={btnClick}>进入React世界</button>
        </div>
      );
   // 定义按钮方法
  function btnClick() {
    //  定义变量
    const message = "Welcome to the world of React";
    root.render(
      <div>
        {/* 使用{}来包裹变量, 或者方法名来进行赋值*/}
        <h1>{message}</h1>
        <button onClick={btnClick}>进入React世界</button>
      </div>
    );
  }

点击按钮后, 通过调用方法来修改message值, 赋值后重新渲染即可看到最新的效果

image.png

image.png

以上就是第一个编写的React程序以及对程序中数据的修改,重新渲染

方法提取

因为两段渲染的内容一致, 顾可以将渲染的内容进行提取, 合并成一个公共的方法, 避免代码重复的编写

// 定义变量, 变量的赋值通过一个大括号实现 {变量}
  let message = "hello world";
// 方法提取
 function rootRender() {
    root.render(
      <div>
        <h2>{message}</h2>
        <button onClick={btnClick}>进入React世界</button>
      </div>
    );
  }
// 定义按钮点击的方法
function btnClick() {
    message = "Welcome to the world of React";
    rootRender();
  }

rootRender();

代码重构

以上已经实现了React的第一个程序, 以及对文本的修改, 渲染方法的提取, 但是还不足够, 还需要进一步的对代码进行重构, 组件化. 组件化中关键的一点就是类的继承, 这个可以看阮一峰老师的入门课程: https://es6.ruanyifeng.com/#docs/class-extends
// 定义组件进行代码重构
class HelloWorld extends React.Component {
    constructor(){
        super()

        // 固定写法, 设置组件的属性 
        this.state = {
            message: 'Hello World'
        }
    }

    // 定义按钮点击的方法
    btnClick(){
        // 固定的更新方法. 1. 通过setState来进行更新, 2.更新后会自动执行render方法进行渲染
        this.setState({message: 'Welcome to the world of React'})
    }
    render(){
        // 通过解构获取
        const { message } = this.state;
        return (
            <div>
                <h2>{message}</h2>
                {/* 定义点击方法, 需要绑定this, 否则按钮点击时会报undefined
                    因为btnClick函数并不是主动调用的, 而是传入的函数地址, 何时被谁调用不知道,  
                    是在React的内部调用的btnClick, 而内部调用的时候, 并不知道绑定的this是谁
                */}
                <button onClick={this.btnClick.bind(this)}>进入React世界</button>
            </div>
        )
    }
}

//  将组件渲染到页面之上
const root = ReactDOM.createRoot(document.querySelector('#root'))
root.render(<HelloWorld />)

JSX的基本语法

JSX的书写规范

*  1. JSX结构中只能有一个跟元素, 不能在render方法中写多个跟元素
*  2. JSX中通常会使用()将元素包裹起来, 将整个JSX当做是一个整体实现换行
*  3. jsx组件可以是单标签(必须以/结尾), 也可以是双标签

JSX的注释语法

{/* 写在JSX中的注释内容 */}

JSX中可插入的内容

  1. Number/String/Array类型的可以直接显示出来 image.png

  2. undefined/null/Boolean类型则不会进行显示 image.png

  3. Object类的不能作为子元素进行显示, 直接显示的话会导致报错

  4. 可以插入表达式,字符串拼接等 image.png

  5. 可以插入三元表达式 image.png

  6. 通过方法返回值进行显示 image.png

JSX属性绑定

  1. 基本属性的绑定,例如title, a标签的herf属性

    我是div
    跳转掘金
  2. class属性绑定, 使用className image.png

  3. style属性绑定, 绑定对象类型 image.png

this的绑定

在React中this的绑定一共三种方式
* 第一种就是就是直接写在组件上通过bind进行绑定
    * onClick={this.btnClick.bind(this)
* 第二种是写在组件构造函数中的也就是ES6 class fields
    * this.btnClick = this.btnClick.bind(this)
* 第三中是写在组件上的箭头函数的写法(这是最常用也是比较推荐的一种方式)
    * onClick={() => this.btnClick()}

参数的传递

根据this的绑定方式不同, 就有不同的参数传递方式
1. 当没有额外参数时, bind和箭头函数获取默认event打印出来的效果一致
2. 当有额外参数时, 通过bind绑定的参数顺序就改变了, 而箭头函数的参数顺序与传入的一致
// event不是原生的event是经过react包裹的
btnClick(event, age, name){
    console.log('event:', event, 'age:' , age, 'name:', name);
}

image.png 故参数传递中, 还是this绑定中, 官方都是建议使用箭头函数的方式

条件渲染

  1. 根据条件设定展示不同的内容 image.png

  2. 根据三元表达式显示不同的内容 image.png

  3. 通过逻辑运算展示内容(&&)

    1. 因为根据JSX中可插入的内容中第2条, undefined, null, Boolean的值是不进行显示的, 故通过逻辑运算符&&来控制当内容为undefined时则不进行展示

image.png