从0到1无比流畅的React入门教程

news2024/11/25 0:46:33

无比流畅的React入门教程TOC

React 是什么

简介

  • 用于构建 Web 和原生交互界面的库
  • React 用组件创建用户界面
  • 通俗来讲:是一个将数据渲染为HTML视图的开源JS库

其他信息

  • Facebook 开发,并且开源

为什么使用React?

  • 原生JS使用DOM-API修改UI代码很繁琐,效率低下,React可以解决这种问题
  • 原生JS直接操作DOM,浏览器会大量重绘重排,React可以解决这种问题
  • 原生JS没有组件化方案好用,代码复用率很低,
  • React 采用组件化模式,React 让你可以通过组件来构建用户界面
  • React 使用声明式编码
  • React 使用虚拟DOM,将数据映射成虚拟DOM,再生成真实DOM,当数据变化的时候,会对原有的虚拟DOM和新的虚拟DOM进行比较,再生成真实DOM。
  • React 使用DOM diffing 算法,最小化页面重绘

特点

声明式设计 −为你应用的每一个状态设计简洁的视图,当数据改变时 React 能有效地更新并正确地渲染组件。

  • 高效 −React采用Virtual DOM(虚拟DOM), 极大的提升了UI渲染(更新)效率。
  • 灵活 −React 允许你结合其他框架或库一起使用。
  • JSX − JSX 是 JavaScript 语法的扩展。JSX 可以很好地描述 UI 应该呈现出它应有交互的本质形式。
  • 组件 − 通过 React 构建组件,使得代码更加容易得到复用,能够很好的应用在大项目的开发中。
  • 单向响应的数据流 − React 采用了单向响应的数据流,使组件状态更容易维护, 组件模块化更易于快速开发。

怎么用 React?

前置条件

  • ES6
  • Class
  • js基础

文档

  • 中文文档: https://zh-hans.reactjs.org
  • 英文文档: https://reactjs.org
  • React DevTools: https://github.com/facebook/react-devtools
  • react CDN link: https://zh-hans.reactjs.org/docs/cdn-links.html
  • babel CDN link: https://www.babeljs.cn/setup#installation

基础知识-点击获取教程代码

了解 Babel

  • ES6转化为ES5
  • JSX转化为JS

了解 jsx

JSX简介

  • 1、全称:JavaScript XML
  • 2、react定义的一种类似于XML的JS扩展语法:JS + XML本质是React.createElement(component, props, …children)方法的语法糖
  • 3、作用:用来简化创建虚拟DOM
  • 4、写法:
var ele = <h1>Hello JSX!</h1>

基本语法规则

  • 1、定义虚拟DOM时,不要写引号;
  • 2、标签中混入JS表达式时要用{};
  • 3、样式的类名指定不要用class,要用className;
  • 4、内联样式,要用style={{key:value}}的形式去写;
  • 5、只有一个根标签;
  • 6、标签必须闭合;
  • 7、标签首字母:
    (1)小写字母开头,代表该标签转为html中同名元素
    (2)大写字母开头,代表组件

开始上手

了解 模块与组件

模块

  • 1、理解:向外提供特定功能的js文件;
  • 2、业务逻辑增加,代码越来越多且复杂,需要拆成模块
  • 3、作用:复用js,简化js的编写,提高js运行效率;

组件

  • 1、理解:用来实现局部功能效果的代码和资源的集合(html/css/js/image等等);
  • 2、为什么要用组件: 一个界面的功能更复杂,拆分成一个一个小组件,更容易复用
  • 3、作用:复用编码,简化项目编码,提高运行效率;

模块化、组件化
应用的js都以模块来编写-就是模块化
应用是以多组件的方式实现-就是组件化

React开发者工具

引入依赖库,理解基础jsx语法

<!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>
    <!-- React 核心库、 -->
    <script src="lib/react/react.development.js"></script>
    <!-- 操作 DOM 的 react 扩展库、 -->
    <script src="lib/react/react-dom.development.js"></script>
    <!-- 将 jsx 转为 js 的 babel 库 -->
    <script src="lib/babel.min.js"></script>
  </head>
  <body>
    <!-- 创建react解析的容器 -->
    <div id="xiaojin"></div>
    <script type="text/babel">
      var msg = "I am xiaojin!!!";
      //1.创建虚拟DOM
      const VDOM = (
        /* 此处一定不要写引号,因为不是字符串 */
        <h1 id="title">
          <span>Hello,{msg}</span>
        </h1>
      );
      //2.渲染虚拟DOM到页面
      ReactDOM.render(VDOM, document.getElementById("xiaojin"));
    </script>
  </body>
</html>

注释-在花括号里

ReactDOM.render(
    <div>
    {/*注释...*/}
     </div>,
    document.getElementById('XXX')
);

数组-JSX 允许在模板中插入数组,且自动展开

var arr = [
  <h1>A</h1>,
  <h1>B</h1>,
];
ReactDOM.render(
  <div>{arr}</div>,
  document.getElementById('XXX')
);

组件

  • react提供两种形式创建组件,函数式组件和class形式

组件使用注意事项:

  1. 组件名必须是首字母大写

  2. 虚拟DOM元素只能有一个根元素

  3. 虚拟DOM元素必须有结束标签 < />

函数式组件

// 创建函数,返回一个虚拟DOM
function Test(props) {
  return <h1>Hello, {props.name}</h1>;
}
// 渲染
ReactDOM.Render(<Test name = "xiaojin" />,document.getElementById("div"));

class形式,这个提一下,后面就不再举例啦,之后都用函数式

  <div id="root"></div>
  <script type="text/babel">
    var msg = 'hello,world!';
    // class形式
    class HelloWorld extends React.Component {
      render(){
        console.log('this',this);
        return (
          <div>{msg}</div>
        )
      }
    }
    ReactDOM.render(<HelloWorld />,document.getElementById('root'));

组件核心属性

state

通俗理解:state就是组件的一些数据绑定,数据变了,页面就会变,这是我的理解哦

注意事项
1、切勿直接修改state数据,直接state会重新渲染内容;
2、通过setState修改后,不会立即修改DOM,react会在所有状态改变后,对比虚拟DOM,统一修改,提升性能;

关于this

  1. 组件中的 render 方法中的 this 为组件实例对象
  2. 组件自定义方法中由于开启了严格模式,this 指向 undefined 如何解决
    1. 通过 bind 改变 this 指向
    2. 推荐采用箭头函数,箭头函数的 this 指向

因为类式组件基本不怎么用,所以接下来只写函数式组件内容啦

props

理解

  • 1、每个组件对象都会有props(properties的简写)属性;
  • 2、组件属性保存在props中;

作用

  • 1、通过标签属性从外向组件内传递变化的数据;
  • 2、props只读

使用:

<script type="text/babel">
  function Person(props) {
    const { name, age, sex } = propsreturn(
      <ul>
        <li>姓名:{name}</li>
        <li>性别:{sex}</li>
        <li>年龄:{age}</li>
      </ul>
    );
  }
  Person.propTypes = {
    name: PropTypes.string.isRequired,
    // 限制name必传,且为字符串sex:PropTypes.string, 限制sex为字符串age:PropTypes.number, 限制age为数值
  };
  // 标签属性值
  Person.defaultProps = {
    sex: "女",
    age: 18,
  };
  ReactDOM.render(<Person name="XIAOJIN" />, document.getElementById("root"));
</script>

refs

组件内的标签可以定义ref属性来标识自己

有三种操作refs的方法,分别为:

  • 字符串形式
  • 回调形式 render(){return(
    <input ref={c => this.input1 = c } type=“text” /> 箭头函数简写,使用时可通过 this.input1来使用
  • createRef形式
    createRef step1:给DOM元素添加ref属性
<input ref={this.MyRef} type="text" placeholder="点击弹出" />
<input ref={this.MyRef1} type="text" placeholder="点击弹出" />

createRef step2:通过API,创建React的容器,会将DOM元素赋值给实例对象的名称为容器的属性的current

MyRef = React.createRef();
MyRef1 = React.createRef();
// 调用
btnOnClick = () =>{
    // 创建之后,将自身节点,传入current中
    console.log(this.MyRef.current.value);
}

事件处理

  1. React 使用自定义事件,非原生 DOM 事件

  2. React 事件通过事件委托方式处理(更高效)

  3. 可用 event.target获取 DOM 减少 refs使用

非受控租价与受控组件

包含表单元素的组件分为非受控租价与受控组件

  • 受控组件:表单组件的输入组件随着输入并将内容存储到状态中(随时更新)
  • 非受控组件:表单组件的输入组件的内容在有需求的时候才存储到状态中(即用即取)
    受控组件
    1、表单元素依赖于状态,表单元素需要默认值实时映射到状态的时候,就是受控组件,这个和双向绑定相似;
    2、元素修改实时映射状态值,可对输入内容进行校验;
    3、只有继承React.Component才有状态;
    4、必须使用onChange绑定
    非受控组件
    1、在虚拟DOM节点上声明ref,且将引用赋值ref
    2、react会自动将输入的值放在实例的ref属性上

注意:官方推荐受控组件,更好的控制组件生命流程
1、受控组件的两个要点:
组件的value属性与React中的状态绑定
组件内声明了onChange事件处理value的变化
2、非受控组件更像是传统的HTML表单元素,数据存储在DOM中,而不是组件内部,获取数据的方式是通过ref引用;
3、尽可能使用受控组件;
4、受控组件是将状态交由React处理,可以是任何元素,不局限于表单元素;
5、大量表单元素的页面,使用受控组件会使程序变得繁琐难控,此时使用非受控组件更为明智;

生命周期 LifeCycle

React 生命周期主要包括三个阶段:初始化阶段,更新阶段,销毁阶段

初始化阶段

1. constructor 执行

constructor 在组件初始化的时候只会执行一次

通常它用于做这两件事

  1. 初始化函数内部 state
  2. 绑定函数

2. static getDerivedStateFromProps 执行

getDerivedStateFromProps初始化和更新中都会被调用,并且在 render 方法之前调用,它返回一个对象用来更新 state

getDerivedStateFromProps 是类上直接绑定的静态(static)方法,它接收两个参数 propsstate

props 是即将要替代 state 的值,而 state 是当前未替代前的值

3. componentWillMount 执行(即将废弃)

如果存在 getDerivedStateFromPropsgetSnapshotBeforeUpdate 就不会执行生命周期componentWillMount

3. render 执行

render() 方法是组件中必须实现的方法,用于渲染 DOM ,但是它不会真正的操作 DOM,它的作用是把需要的东西返回出去。

实现渲染 DOM 操作的是 ReactDOM.render()

注意:避免在 render 中使用 setState ,会造成死循环

4. componentDidMount 执行

componentDidMount 的执行意味着初始化挂载操作已经基本完成,它主要用于组件挂载完成后做某些操作

这个挂载完成指的是:组件插入 DOM tree

总结

执行顺序 constructor -> getDerivedStateFromProps 或者 componentWillMount -> render -> componentDidMount

继续补充中—

今天就写到这里啦~

  • 小伙伴们,( ̄ω ̄( ̄ω ̄〃 ( ̄ω ̄〃)ゝ我们明天再见啦~~
  • 大家要天天开心哦

欢迎大家指出文章需要改正之处~
学无止境,合作共赢

在这里插入图片描述

欢迎路过的小哥哥小姐姐们提出更好的意见哇~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/534860.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用Appium实现录制回放

1、cmd中转到abd所在位置&#xff1a; cd C:\Users\lenovo\AppData\Local\Android\Sdk\platform-tools 2、打开Appium运行 3、打开Appium Inspector &#xff08;1&#xff09;获取设备名称 在cmd中输入以下命令&#xff1a; adb devices &#xff08;2&#xff09;获取appP…

c++核心知识—多态

目录 一、多态 1、多态的基本概念 2、深入剖析多态原理&#xff1a; 3、纯虚函数和抽象类 4、虚析构和纯虚析构 一、多态 1、多态的基本概念 多态是C面向对象三大特性之一 多态分为两类&#xff1a; 1、静态多态: 函数重载 和 运算符重载 属于静态多态&#xff0c;复用…

前端八股文(二)

1.什么是diff算法&#xff1f; https://www.bilibili.com/video/BV1JR4y1R7Ln/?spm_id_from333.337.search-card.all.click&vd_source0406fa5cf8203ba41f1c8aec5f967e9d 我们修改了文本内容后会生成新的虚拟dom,新旧俩个虚拟dom之间是存在一定差异的&#xff0c;如果能快…

未来的航空电子设备会是什么样子?

具有多功能航空电子设备、大触摸屏显示器、先进通信系统、高性能/低功耗解决方案和人工智能 (AI) 功能的驾驶舱将成为未来军事飞行员日常生活的一部分。 如今&#xff0c;配备模拟驾驶舱的军用飞机已经很少见&#xff0c;因为大多数都已被采用先进嵌入式硬件和软件解决方案的现…

金融学学习笔记第2章

第2章 金融市场和金融机构 一、金融体系 金融体系包括金融市场、中介、服务公司和其它用于执行家庭、企业及政府的金融决策的机构 1.金融市场 金融市场&#xff1a;以金融资产为交易对象而形成的供求关系及其机制的总和 金融市场可分为有特定地理位置的市场和没有特定地点的市…

使用NodeJs创建Web服务器

Web服务器 什么是Web服务器&#xff1f; 当应用程序&#xff08;客户端&#xff09;需要某一个资源时&#xff0c;可以向一个台服务器&#xff0c;通过Http请求获取到这个资源&#xff1b;提供资源的这个服务器&#xff0c;就是一个Web服务器&#xff1b; 目前有很多开源的We…

用ChatGPT生成一个Python贪吃蛇游戏(42)

小朋友们好&#xff0c;大朋友们好&#xff01; 我是猫妹&#xff0c;一名爱上Python编程的小学生。 和猫妹学Python&#xff0c;一起趣味学编程。 今日主题 什么是ChatGPT&#xff1f; ChatGPT可以帮我们做什么&#xff1f; 用ChatGPT生成一个Python贪吃蛇游戏。 什么是C…

Rust每日一练(Leetday0002) 中位数、回文子串、Z字形变换

目录 4. 寻找两个正序数组的中位数 Median of two sorted arrays &#x1f31f;&#x1f31f;&#x1f31f; 5. 最长回文子串 Longest Palindromic Substring &#x1f31f;&#x1f31f; 6. Z字形变换 Zigzag Conversion &#x1f31f;&#x1f31f; &#x1f31f; 每日…

C/C++每日一练(20230517) 排序问题、查找小值、寻找峰值

目录 1. 排序问题 &#x1f31f; 2. 查找小值 &#x1f31f; 3. 寻找峰值 &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 排序问题 输入10个数&#…

RK3588平台开发系列讲解(进程篇)Linux文件系统数据结构

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、Linux 文件系统数据结构有哪些二、超级块结构 spuer_block三、目录 dentry四、文件索引结点 inode五、打开的文件 file沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 本篇将介绍 Linux 文件系统数据结构…

深入理解MySQL中的事务和锁

目录 数据库中的事务是什么&#xff1f; MySQL事务的隔离级别 脏读、不可重复读、幻读 MVCC&#xff08;多版本并发控制&#xff09; 快照读和当前读 MySQL中的锁 MyISAM引擎的锁&#xff1a; InnoDB引擎的锁&#xff1a; 乐观锁和悲观锁 共享锁和排他锁 数据库中的事…

【STL二十】算法——排序操作(sort、stable_sort)_集合操作(merge)

【STL二十】算法——排序操作(sort、stable_sort&#xff09;_ 集合操作(merge&#xff09; 一、分类二、修改序列的操作三、排序操作1、sort2、stable_sort3、is_sorted、is_sorted_until 四、集合操作1、merge2、inplace_merge 一、分类 根据网站https://www.apiref.com/cpp…

JavaScript实现输出一个“天”字的代码

以下为实现输出一个“天”字的程序代码和运行截图 目录 前言 一、实现输出一个“天”字 1.1 运行流程及思想 1.2 代码段 1.3 JavaScript语句代码 1.4 运行截图 前言 1.若有选择&#xff0c;您可以在目录里进行快速查找&#xff1b; 2.本博文代码可以根据题目要求实现相…

【瑞萨RA系列FSP库开发】初识寄存器

文章目录 一、寄存器是什么二、瑞萨RA6M5 芯片内部模块与资源三、存储器映射1. 存储器映射表2. 存储器区域划分3. 外设寄存器 四、C语言操作寄存器1. C语言对寄存器的封装&#xff08;1&#xff09;外设模块基地址定义&#xff08;2&#xff09;寄存器结构体定义&#xff08;3&…

【LLM系列之BLOOM】BLOOM: A 176B-Parameter Open-Access Multilingual Language Model

论文题目&#xff1a;《BLOOM: A 176B-Parameter Open-Access Multilingual Language Model》 论文链接&#xff1a;https://arxiv.org/abs/2211.05100 github链接&#xff1a;https://github.com/huggingface/transformers-bloom-inference/tree/main huggingface链接&#xf…

LeetCode35. 搜索插入位置(二分法入门)

写在前面&#xff1a; 题目链接&#xff1a;LeetCode35. 搜索插入位置 编程语言&#xff1a;C 题目难度&#xff1a;简单 一、题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会…

Linkage Mapper:从栖息地连通性到物种保护的连通性指南针

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: Linkage Mapper解密数字世界链接 文章目录 引言一、Linkage Mapper工具包简介1.1 什么是Linkage Mapper工具包⭐️ Linkage Mapper工具包的概述

Vite4 + Vue3 项目打包并发布Nginx服务器 (前端必看)

一、环境 &#x1f604; &#x1f604; &#x1f604; 这里因为我们有的小伙伴可能不太需要服务器&#xff0c;单纯学习的话也没有必要去买一个服务器。如果需要把自己的东西部署到公网上&#xff0c;有很多方式&#xff0c;自行百度。你也可以购买阿里云或者腾讯云。逻辑都是…

MSQL系列(二) Mysql实战-索引结构B+Tree

Mysql实战-索引结构 BTree 上一篇 我们讲解了二叉树&#xff0c;平衡二叉树&#xff0c;红黑树&#xff0c;BTree的结构及特点&#xff0c;本文我们着重讲解一下BTree&#xff0c;为什么Mysql的存储结构采用BTree而不是上面的那几种 1.BTree的缺点 我们用上篇文章中的BTree的…

第四十二天学习记录:C语言进阶:笔试题整理Ⅲ

问&#xff1a;解释一下int(*a[20])(int)是什么&#xff1f; ChatAI答&#xff1a; int (*a[20])(int) 是一个数组&#xff0c;该数组中每个元素都是一个指向函数的指针&#xff0c;该函数具有一个int类型的参数&#xff0c;并返回一个int类型的值。 具体来说&#xff0c;a是一…