React学习笔记(基础篇)

2023-10-27

React学习笔记(基础)

  本文主要依据react官网的学习脉络,记录自己的学习过程,同时添加了个人见解,如有理解不妥的地方欢迎评论

1.React介绍

​ react由facebook公司推出,因为该公司不满足于市面上现有的前端框架,他们认为MVC只会让前端越来越复杂,因此react就诞生了,react只关注与视图层,官方对react的定位是:一个快速构建前端视图的javaScript库。

2.React的特点

  1. 虚拟DOM

    ​ 如果没有虚拟DOM,每次DOM改变的时候,都需要在浏览器中进行渲染。每一次DOM改变的时候,浏览器都需要重新计算CSS,进行布局处理,然后重新渲染页面,这都需要时间。而虚拟DOM完成的事情是最小化DOM改变,然后批处理DOM变化,在必要的时候才重新渲染页面。

    ​ 例如:当前页面显示的

    张三

    李四

    ,当我添加

    王五

    时,DOM会重新渲染3个标签,虚拟DOM则可以直接在后面加上新增加的

    王五

  2. 组件化

    • 什么是组件化

      return <>
          <Modal visible={modalVisible} title={editId ? `修改` : `新增`} onCancel={handleModalClose}
                 onOk={handleSubmit}>
              <RfidTagForm ref={formRef} editId={editId}/>
          </Modal>
      </>
      
      ......
      const RfidTagForm = forwardRef<RfidTagFormHandle,RfidTagFormProps>(({editId}, componentRef) => {
          const [form] = Form.useForm()
          const { resetFields, setFieldsValue, validateFields } = form;
      
      ......
      
          return <Form form={form} layout={'vertical'}>
              <Form.Item label={`罐号`} name={`potNum`}>
                  <Input/>
              </Form.Item>
              <Form.Item label={`标签卡ID`}>
                  <Row gutter={8}>
                      <Col span={12}>
                          <Form.Item name={`tagId`}>
                              <Input/>
                          </Form.Item>
                      </Col>
                      <Col span={12}>
                          <Button type={"primary"} onClick={handleReadTag}>读取卡号</Button>
                      </Col>
                  </Row>
              </Form.Item>
          </Form>
      })
      export default RfidTagForm
      

      代码中RfidTagForm即为组件,它接受任意的入参(即 “props”),并返回用于描述页面展示内容的 React 元素。

    • 组件化有两个显著的特点:

      封装:一个组件所需的数据封装于组件内部;

      组合:一个组件可以与其他组件通过组合的方式实现更加复杂的业务逻辑;

  3. 声明式代码

    声明式代码指的是:让开发者按照“我要做什么”,而不是“我要让计算机做什么”去思考如何实现业务需求。

    感受到天气太热,编写代码为例:

    • 命令式代码:

      1.拿起空调遥控器; 2.打开空调;3. 设置温度为 27 摄氏度;

    • 声明式代码:

      1. 调用“开空调(27)”函数;

  4. 纯粹的JavaScript语法

    ​ 在 React 中,没有任何特殊的专有的 React 语法需要理解和记忆,所有的组件,数据操作,业务逻辑都是通过使用 JavaScript 语法实现的。

    ​ 这意味着你想要使用 React 只需理解 React 的思想和几个关键的 API 就可以立即开始使用 React 进行复杂应用的开发。并且 React 还鼓励你使用函数式编程思想进行开发,你可以在 React 开发中,使用你的任何函数式编程技巧。

3.环境搭建

比较简单,网上有很多。

React环境搭建链接

这里建议在github上下载一个nvm,node的版本管理工具,亲测好用。

4.核心概念

4.1JSX

个人理解:用js写html的内容,其格式比较像是html语言,但事实上是编译后会变成js函数被调用

示例:

function formatName(user) {
  return user.firstName + ' ' + user.lastName;
}

const user = {
  firstName: 'Harper',
  lastName: 'Perez'
};

const element = (
  <h1>	Hello, {formatName(user)}!  </h1>
);

ReactDOM.render(
  element,
  document.getElementById('root')
);

Babel 会把 JSX 转译成一个名为 React.createElement() 函数调用。

以下三种代码完全相同

const element = (
  <h1 className="greeting">
    Hello, world!
  </h1>
);
const element = React.createElement(
  'h1',
  {className: 'greeting'},
  'Hello, world!'
);
const element = {
  type: 'h1',
  props: {
    className: 'greeting',
    children: 'Hello, world!'
  }
};

4.2 元素&组件

元素是构成 React 应用的最小砖块,它描述了你在屏幕上想看到的内容,与浏览器的 DOM 元素不同,React 元素是创建开销极小的普通对象。React DOM 会负责更新 DOM 来与 React 元素保持一致。

示例:

const element = <h1>Hello, world</h1>;

此处区分一下元素组件:

元素:

const element = React.createElement(
  'h1',
  {className: 'greeting'},
  'Hello, world!'
);

组件分为两种:函数式组件&&class组件

函数式:const Element= () => React.createElement(...)

class组件:

import React from 'react'
import ReactDOM from 'react-dom'

class App extends React.Component {
render () {
  return (
    // 注意这里得用this.props.name, 必须用this.props
    <h1>欢迎进入{this.props.name}的世界</h1>
	)
}
}
export default App;

无论是函数式组件还是class组件,目的都是为了返回一个元素.由此可以看出元素和组件的区别。

组件可以接收任何入参,即Props.例如 我们刚刚定义的App组件做里使用到了this.props.name,那么我们在使用此组件的时候就可以给他传一个 name参数供其使用.具体如下:

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';

ReactDOM.render(
  <React.StrictMode>
    <App name="Sara" />
  </React.StrictMode>,
  document.getElementById('root')
);

注意:为了让react可以区分dom原有标签和自己定义的组件,在定义组件时首字母要大写.

Props具有只读性,在组件中对拿到的props不可进行修改操作,

正确:

function sum(a, b) {  return a + b;}

错误:

function withdraw(account, amount) {  account.total -= amount;}

4.3 State&生命周期

首先介绍State,state与props类似,不过state是私有的,只在当前组件使用,与props用于传参不同

每次组件更新时 render 方法都会被调用,但只要在相同的 DOM 节点中渲染 <Clock /> ,就仅有一个 Clock 组件的 class 实例被创建使用。这就使得我们可以使用如 state 或生命周期方法等很多其他特性。(啥意思)

挂载&卸载

​ 当 Clock组件第一次被渲染到 DOM 中的时候,就为其设置一个计时器。这在 React 中被称为“挂载(mount)”。

同时,当 DOM 中 Clock 组件被删除的时候,应该清除计时器。这在 React 中被称为“卸载(unmount)”。

生命周期函数:

  • componentDidMount() 方法会在组件已经被渲染到 DOM 中后运行,组件挂载完成时触发的函数
  • 组件将要挂载时触发的函数:componentWillMount
  • 是否要更新数据时触发的函数:shouldComponentUpdate
  • 将要更新数据时触发的函数:componentWillUpdate
  • 数据更新完成时触发的函数:componentDidUpdate
  • 组件将要销毁时触发的函数:componentWillUnmount
  • 父组件中改变了props传值时触发的函数:componentWillReceiveProps

正确地使用state

不要直接修改 State

例如,此代码不会重新渲染组件:

// Wrongthis.state.comment = 'Hello';

而是应该使用 setState():

// Correctthis.setState({comment: 'Hello'});

4.4 事件处理

使用:

  • React 事件的命名采用小驼峰式(camelCase),而不是纯小写。
  • 使用 JSX 语法时你需要传入一个函数作为事件处理函数,而不是一个字符串。

react中如果需要使标签的默认事件不生效的方法:

import React, {Component} from 'react';

class Button extends React.Component{
    doClick(e){
        //阻止标签的默认事件
        e.preventDefault();
        alert("do click");

    }
    render(){
        return (
            <a href="https://www.baidu.com/" onClick={this.doClick}>
                事件处理测试
            </a>
        )
    }
}
export default Button

重点:

你必须谨慎对待 JSX 回调函数中的 this,在 JavaScript 中,class 的方法默认不会绑定 this。如果你忘记绑this.handleClick并把它传入了 onClick,当你调用这个函数的时候 this 的值为 undefined

关于为组件添加事件时,要注意this的绑定问题.(个人理解:组件在渲染时已经不在当前组件内,此时的this指向的不是我们所需要的组件),所以要加一个this绑定:

绑定方法一:

class Toggle extends React.Component {
  constructor(props) {
    super(props);
    this.state = {isToggleOn: true};
    // 为了在回调中使用 `this`,这个绑定是必不可少的    
    this.handleClick = this.handleClick.bind(this);  }

  handleClick() {
      this.setState(state => ({
          isToggleOn: !state.isToggleOn    
      }));  
  }
  render() {
    return (
      <button onClick={this.handleClick}>        
            {this.state.isToggleOn ? 'ON' : 'OFF'}
      </button>
    );
  }
}
export default Toggle

绑定方法二(和一类似):

import React, {Component} from 'react';

class Toggle extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            isToggeleOn: true
        }
        console.log("constructor()"+this)
        // 把this绑定给handleclick事件
        // this.handleClick = this.handleClick.bind(this);
    }

    handleClick(title) {
        alert(title)//输出abc
        console.log("handleClick()"+this)
        this.setState(state => ({
            isToggeleOn: !state.isToggeleOn
        }))
    }

    render() {
        return(
            // 把this绑定给handleclick事件
            <button onClick={this.handleClick.bind(this,"abc")}>
                {this.state.isToggeleOn ? 'ON':'OFF'}
            </button>
        )
    }
}
export  default Toggle;

绑定方法三(ES6的箭头函数)

import React, {Component} from 'react';

class Toggle extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            isToggeleOn: true
        }
        console.log("constructor()"+this)
        // 把this绑定给handleclick事件
        // this.handleClick = this.handleClick.bind(this);
    }

    // es6的箭头函数自动绑定上下文
    handleClick=()=> {
        console.log("handleClick()"+this)
        this.setState(state => ({
            isToggeleOn: !state.isToggeleOn
        }))
    }

    render() {
        return(
            // 把this绑定给handleclick事件
            <button onClick={this.handleClick.bind(this)}>
                {this.state.isToggeleOn ? 'ON':'OFF'}
            </button>
        )
    }
}
export  default Toggle;

向事件处理程序传递参数

<button onClick={(e) => this.deleteRow(id, e)}>Delete Row</button>
<button onClick={this.deleteRow.bind(this, id)}>Delete Row</button>

4.5 条件渲染

4.6 列表&Key

function NumberList(props) {
  const numbers = props.numbers;
  const listItems = numbers.map((number) =>
    <li key={number.toString()}>      {number}
    </li>
  );
  return (
    <ul>{listItems}</ul>
  );
}

const numbers = [1, 2, 3, 4, 5];
ReactDOM.render(
  <NumberList numbers={numbers} />,
  document.getElementById('root')
);

如果 不定义key,会报警告:a key should be provided for list items.

深入解析为什么 key 是必须的

4.7表单

相对于html表单元素定义了固有的参数而言,react组件可以使用state来起任何名字的参数进行操作,没什么可说的,照着官网示例操作即可.

官网表单示例

4.8 组合

4.9 包含关系

我们遇到组件引用组件时,可以使用特殊的 children prop 来将他们的子组件传递到渲染结果中:

function FancyBorder(props) {
  return (
    <div className={'FancyBorder FancyBorder-' + props.color}>
      {props.children}    
    </div>
  );
}

这使得别的组件可以通过 JSX 嵌套,将任意组件作为子组件传递给它们。

function WelcomeDialog() {
  return (
    <FancyBorder color="blue">
      <h1 className="Dialog-title">
          Welcome      
      </h1>
      <p className="Dialog-message">
              Thank you for visiting our spacecraft!
      </p>
    </FancyBorder>
  );
}

可以看出,我们把

两个元素的内容 以 {props.children}为参数进行传递

4.10特例关系

实际就是我们对目标组件做一些个性化定制,在原组件的基础上产生一个个性化定制的新组件

function Dialog(props) {
  return (
    <FancyBorder color="blue">
      <h1 className="Dialog-title">
        {props.title}      
      </h1>
      <p className="Dialog-message">
        {props.message}  
      </p>
    </FancyBorder>
  );
}

function WelcomeDialog() {
  return (
    <Dialog
        title="Welcome"
        message="Thank you for visiting our spacecraft!" />
  );
}

我们可以说 WelcomeDialogDialog的特殊实例.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React学习笔记(基础篇) 的相关文章

  • React中的“计算属性”

    React中的 计算属性 相信许多学习过vue的小伙伴对计算属性都不陌生吧 计算属性能帮我们数据进行一些计算操作 计算属性是依赖于data里面的数据的 在vue中只要计算属性依赖的data值发生改变 则计算属性就会调用 那React中也有计
  • React + Umi + Dva + Antd 简述 及创建项目过程简述

    React 你的第一个组件 React React是前端三大主流框架之一 你可以在React里传递多种类型的参数 如声明代码 帮助你渲染出UI 也可以是静态的HTML DOM元素 也可以传递动态变量 甚至是可交互的应用组件 安装react框
  • React重点知识拓展,含Hooks、路由懒加载等

    第7章 React扩展 一 setState 1 setState更新状态的2种写法 setState stateChange callback 对象式的setState stateChange为状态改变的对象 该对象可以体现出状态的更改
  • css in js开发利器 - styled-components(样式组件)

    styled components 是一个常见的 css in js 类库 和所有同类型的类库一样 通过 js 赋能解决了原生 css 所不具备的能力 比如变量 循环 函数等 注意 有时候 React 版本和 styled componen
  • 对Fiber架构的理解?解决了什么问题?

    一 问题 JavaScript引擎和页面渲染引擎两个线程是互斥的 当其中一个线程执行时 另一个线程只能挂起等待 如果 JavaScript 线程长时间地占用了主线程 那么渲染层面的更新就不得不长时间地等待 界面长时间不更新 会导致页面响应度
  • React Native 环境搭建, 新建项目, 运行和调试

    React Native 可以理解为一个基于 JavaScript 具备动态配置能力 面向前端开发者的移动端开发框架 目前为止虽然一直还没有V1 0 0版本 但是相信很多小伙伴都了解过或者已经入坑了 为什么RN那么有人气呢 我们可以先简单分
  • state和props的区别__react

    首先说明 state和props是每个组件都有的 其次 state可变 但props不可变 这是官网给出的说法 但实操过程中 state的确可变 但props也可以变 是不是fb搞错了 当然不是 这里的可变与不可变 说的是改变后 是否会重新
  • 在校学生如何白嫖黑群辉虚拟机和内网穿透,实现海量资源的公网访问?(小白专用)

    文章目录 前言 本教程解决的问题是 按照本教程方法操作后 达到的效果是 前排提醒 1 搭建群辉虚拟机 1 1 下载黑群辉文件 vmvare虚拟机安装包 1 2 安装VMware虚拟机 1 3 解压黑 群辉虚拟机文件 1 4 虚拟机初始化 1
  • Ionic3开发教程 - 开发(2)

    Ionic3开发系列教程Ionic3开发教程 环境准备 1 Ionic3开发教程 开发 2 Ionic3开发教程 发布Android版本 3 Ionic3开发教程 发布IOS版本 4 Ionic3开发教程 更新 5 本文中介绍的Ionic3
  • 三、react中类组件和函数组件

    简介 本篇我们只要介绍react中类组件与函数组件两种组件的写法 两者的优缺点 同时对在我们的项目开发中该使用类组件还是函数组件进行思考分析 废话不多说进入正题 类组件 设计思路 类组件时面向对象编程的思想 在其中我们去设计类组件时使用st
  • react和react jsx基础

    本文是个人学习笔记 例子都是来自React Native官网 之前不是做前端的 没有使用过react 要学习react native做混合开发 react 包括react jsx还是得补补 react和react jsx react是一个j
  • Umi+Dva初印象<基础应用,结构,流转逻辑>

    目录 前言 知识储备 generator函数 Dva初识 实际交互 函数式组件 class组件 前言 项目初始为umi脚手架进行初始化 lt 初始化过程 http t csdn cn cuTaY gt 工程中加载了umi自带的antd ui
  • React解密:React Hooks函数之useCallback和useMemo

    之所以将useCallback和useMemo放到一起 从某种意义上说 他们都是性能优化的始作俑者 他们也有很多的共性 我们先来回顾一下class组件性能优化的点 调用 setState 就会触发组件的重新渲染 无论前后 state 是否相
  • React核心概念:状态提升

    上一节 表单 下一节 组合vs继承 React核心概念 状态提升 引言 添加第二个输入框 编写转换函数 状态提升 经验总结 引言 很多情况下我们使用的多个组件需要对同一个数据做出对应的反应 在这里我们推荐把这个共享的状态提升到距离这些组件最
  • React官方文档--Lifting State Up

    Lifting State Up 如果 几个组件需要同时影响并且修改同一个数据 我们建议将这个共享状态进行提升 给他们最近的共同祖先 在这个部分 我们将要创建一个温度计算器来判断水会不会在给定温度下沸腾 我们将从一个叫做BoilingVer
  • React实现关键字高亮

    先看效果 实现很简单通过以下这个函数 highLight text keyword gt return text split keyword flatMap str gt span keyword span str slice 1 展示某段
  • React 定时刷新接口

    通过 useEffect 在页面加载时调用 getNodeDetailList 列表接口 useEffect gt getNodeDetailList change 然后通过 setInterval 来进行定时刷新 useEffect gt
  • react 父组件调用子组件的方法

    子组件中 const child forwardRef props ref gt useImperativeHandle ref gt 这里面的方法是暴露给父组件的 test console log 我是组件里的test方法 test2 t
  • react之封装有无Token(路由权限控制)的高阶组件

    TOC 前景 有些路由页面内的内容信息比较敏感 如果用户没有经过登录获取到有效Token 是没有权限跳转的 根据Token的有 无控制当前路由是否可以跳转就是路由的权限控制 技术方案 实现步骤 1 在 components 目录中 创建 A
  • React中渲染html结构---dangerouslySetInnerHTML

    dangerouslySetInnerHTML 胡子 语法绑定的内容全部作为普通文本渲染 渲染html结构基于 dangerouslySetInnerHTML dangerouslySetInnerHTML 是 React 标签的一个属性

随机推荐

  • 浅谈Spring

    Spring是一个轻量级的控制反转 IoC 和面向切面 AOP 的容器 框架 一 什么是IOC IoC Inversion of Control 翻译成中 是 控制反转 的意思 也就是说 Spring 是 个 控制反转 的容器 1 1控制反
  • python可视化学习七(边缘箱型图)

    边缘箱线图 箱图是用来显示变量分布的统计图 直方图更看重与在取值范围内的分布 而箱线图更看重于观察变量间的重要分割点 箱线图能够显示数据分布的关键数据的节点 常用来作为查找异常值的方式 1当直方图的分布越接近正态分布 箱线图就会越对称 2直
  • 栈区,堆区,全局区,文字常量区,程序代码区 详解

    原博地址 http blog csdn net yitian20000 article details 6358837 感觉这篇文章讲的很清晰 很详细 一 预备知识 程序的内存分配 一个由C C 编译的程序占用的内存分为以下几个部分 1 栈
  • typora用户指南

    Typora 一直是我认为桌面端笔记应用应有的终极形态 用我之前 一篇文章 中的话来说就是 它的功能之强大 设计之冷静 体验之美妙 理念之先进 我认为值得所有笔记应用厂商学习 但一件很尴尬的事情是 由于它极简的设计理念 有许多使用者并没能完
  • liunx ftp 421 passive mode refused([linux]配置 vsftp 启用被动模式(passive mode)解决客户端“no route to host“错误)

    系统 CentOS 修改 vsftpd conf 启用被动模式 指定端口 pasv min port 12000 pasv max port 12199 pasv enable YES 配置防火墙 iptables 允许端口访问 iptab
  • vue2项目(二)---Header、Footer

    非路由组件 Header Footer 首页 搜索页 路由组件 Home首页 Search搜索 login登录 无Footer register注册 无Footer 开发项目的步骤 1 书写静态页面 HTML CSS 2 拆分组件 路由 非
  • 华为机试:敏感字段加密

    题目来源 华为机试 敏感字段加密 题目描述 题目解析 要求 删除命令字前后多余的下换线 对指定索引的敏感字段进行加密 替换为 无法找到指定索引的命令字 输出字符串ERROR 分析 如果遇到大小写字母 数字 这一定是密码 可能需要替换成6个
  • Qt 使用共享库

    创建动态库工程 选择模块需要注意的是如果想要将GUI封装成一个动态库 那么必须要要将QtWidgets选中 不然是不能生成ui xxx h头文件的 接下来直接都下一步直到创建好就好 创建好之后会有两个头文件 一个 cpp文件 Global
  • 数据清洗遇到的问题思考

    因为本次任务是基础的数据预处理和数据集划分 所以本次讨论不涉及特征工程和模型相关的 问题一 缺失数据 有很多人问到了缺失值处理的问题 统一汇总提问 为什么需要处理缺失值 确实值会影响模型训练 某些特征值确实 有可能使得该条样本完全是负样本
  • VM6289:1 http://xxx.cn 不在以下 request 合法域名列表中,请参考文档:https://developers.weixin.qq.com/miniprogra

    本地测试时 点击微信开发工具右上角详情 然后勾选上 不校验合法域名
  • SpringSecurity学习笔记(十二)异常以及权限管理使用

    参考视频 异常 SS中的异常主要分为两种 AuthenticationException authenticationException 认证异常 AccessDeniedException accessDeniedException 授权
  • Django—模板层

    目录 常用语法 变量 模板语法之注释 模板语法之过滤器 常见的django过滤器 模板语法之标签 自定义过滤器 标签和inclusion tag 自定义过滤器 模板的继承 常用语法 变量相关 逻辑相关 模板语法传值支持python的所有基本
  • C#中把中文转换成对应的拼音码

    using System using System Data using System Configuration using System Web using System Web Security using System Web UI
  • ChatGPT生成的介绍Easy发票查验软件的文案!说到我的心坎里了!

    该软件是一款专为企业用户设计的发票处理工具 它拥有多种功能 包括发票图片矫正 发票识别 发票重命名 发票查验和发票打印等 可极大地提高企业的发票处理效率 首先 该软件的发票图片矫正功能可以自动调整图片的角度和大小 确保图片能够清晰地被识别
  • opencv与C++实现最大类间方差法(OTSU)进行图像二值化

    直接上代码 使用最大类间方差法进行二值化的函数 void threshold otsu Mat mat Mat mat thresh mat为输入图像 mat thresh为二值化后的输出图像 求出图像的最大和最小像素值 确定阈值区间 do
  • 单链表的链表拆分

    1 定义三的指针变量 p q t p指向原链表的头结点head1 新建另一个头结点head2 q指向head2 t指向head1的next结点 两个头结点的next都设为空 2 按照条件分配t指向的结点 如果将这个结点连接到head1的链表
  • jdbc-Mysql时间类型的存取

    通过jdbc向mysql存取时间类型的数据时 默认需要使用 java sql Date 但是这个时间一方面使用不方便 java中常用的是 java util Date 另一方面这个时间类型的数据没有时分秒毫秒等 想要解决这个问题目前有三种方
  • win11微软账户登录一直转圈怎么解决?win11微软账户登录一直转圈

    win11微软账户登录一直转圈怎么解决 最近有很多小伙伴们向小编反映说自己的微软账户登录的时候一直在转圈就是进不去 不知道是怎么一回事 就卡在登录界面上 那遇到这个问题应该怎么解决呢 还不清楚的小伙伴们不用担心 跟着小编一起来看看解决方法吧
  • 程序员一年中最佳跳槽时间是什么时候?

    说到跳槽 在职场的初期阶段 这种诉求尤为强烈 要么因为可以多拿一些工资 要么感觉受到了委屈 于是轻易就跳槽了 但随着职场经历的增加会发现 我们无论在哪里都有比现在更高的工资 无论在哪里都会遇到类似的问题 所以 仅仅因为自我感觉受挫或受委屈了
  • React学习笔记(基础篇)

    React学习笔记 基础 本文主要依据react官网的学习脉络 记录自己的学习过程 同时添加了个人见解 如有理解不妥的地方欢迎评论 1 React介绍 react由facebook公司推出 因为该公司不满足于市面上现有的前端框架 他们认为M