当前位置: 首页 > news >正文

React学习笔记(一)——react基础

目录

1. React 介绍

1.1 React是什么

1.2 React的优势

1.3 React的市场情况

2. 开发环境搭建

2.1 使用create-react-app快速搭建开发环境

2.2 react 项目文件说明

2.3 index.js项目入口文件

2.4 App.js 项目根组件

2.5 react 调试工具安装

3. JSX基础-概念和本质

3.1 什么是JSX

3.2 JSX的本质

3.3 JSX高频场景-JSX中使用JS表达式

3.4 JSX高频场景-JSX中实现列表渲染

3.5 JSX高频场景-JSX中实现条件渲染

3.6 JSX高频场景-JSX中实现复杂条件渲染

4. React中的事件绑定

4.1 React 基础事件绑定

4.2 使用事件对象参数

4.3 传递自定义参数

4.4 同时传递事件对象和自定义参数

5. React中的组件

5.1 组件是什么

5.2 React组件

6. useState

6.1 useState基础使用

6.2 修改状态的规则—状态不可变

6.3 修改对象状态

7. 组件的样式处理

7.1 组件基础样式方案

8. 案例:B站评论

8.1 B站评论案例

8.2 渲染评论列表

8.3 实现评论删除

8.4 渲染Tab+点击高亮实现

8.5 classnames优化类名控制


1. React 介绍

1.1 React是什么

React由Meta公司研发,是一个用于 构建Web和原生交互界面的库

1.2 React的优势

相较于传统基于DOM开发的优势:
  • 组件化的开发方式
  • 不错的性能

相较于其它前端框架的优势:

  • 丰富的生态
  • 跨平台支持

1.3 React的市场情况

全球最流行,大厂必备

2. 开发环境搭建

2.1 使用create-react-app快速搭建开发环境

create-react-app是一个快速 创建React开发环境的工具, 底层由Webpack构建, 封装了配置细节 ,开箱即用
执行命令:
  • npx create-react-app react-basic
    • npx Node.js工具命令,查找并执行后续的包命令
    • create-react-app 核心包(固定写法),用于创建React项目
    • react-basic React项目的名称(可以自定义)
创建React项目的更多方式:
  • https://zh-hans.react.dev/learn/start-a-new-react-project

2.2 react 项目文件说明

  • 项目的根组件 App.js

  • 项目的入口,项目从这里开始运行 index.js

2.3 index.js项目入口文件

  • App.js -> index.js -> public/index.html(root)

2.4 App.js 项目根组件

2.5 react 调试工具安装

老方法——极简插件安装

参考:vue3.0学习笔记(一)——vue3简介与vite脚手架的使用——4.2 Vue.js Devtools 版本问题

3. JSX基础-概念和本质

3.1 什么是JSX

概念:
  • JSX 是 JavaScript 和 XML(HTML)的缩写,表示在 JS 代码中编写 HTML 模版结构,它是React 中编写 UI 模版的方式
优势:
  • HTML的声明式模版写法
  • JS的可编程能力

3.2 JSX的本质

JSX 并不是标准的 JS 语法,它是  JS 的语法扩展 ,浏览器本身不能识别,需要通过 解析工具做解析 之后才能在浏览器中运行

3.3 JSX高频场景-JSX中使用JS表达式

在 JSX 中可以通过 大括号语法{} 识别 JavaScript中的表达式,比如常见的变量、函数调用、方法调用等等

  • 使用引号传递字符串
  • 使用JS变量
  • 函数调用和方法调用
  • 使用JavaScript对象

​​​注意:

  • if语句、switch语句、变量声明属于语句,不是表达式,不能出现在{}中

3.4 JSX高频场景-JSX中实现列表渲染

语法:
  • 在JSX中可以使用原生JS中的map方法遍历渲染列表
  • map方法会返回一个新的数组,该数组包含通过对原始数组中的每个元素应用一个函数处理后得到的结果。

  • map 循环那个结构 return那个结构

  • key 的作用: React框架内部使用,提升更新性能

3.5 JSX高频场景-JSX中实现条件渲染

语法:
  • 在React中,可以通过逻辑与运算符&&、三元表达式(?:)实现基础的条件渲染

3.6 JSX高频场景-JSX中实现复杂条件渲染

需求:
  • 列表中需要根据文章状态适配三种情况,单图,三图,和无图三种模式
解决方案:
  • 自定义函数 + if判断语句

4. React中的事件绑定

4.1 React 基础事件绑定

语法:
  • on + 事件名称 = { 事件处理程序 },整体上遵循驼峰命名法

4.2 使用事件对象参数

语法:
  • 在事件回调函数中设置形参e

4.3 传递自定义参数

语法:
  • 事件绑定的位置改造成箭头函数的写法,在执行clickHandler实际处理业务函数的时候传递实参

注意:

  • 不能直接写函数调用,这里事件绑定需要一个函数引用

4.4 同时传递事件对象和自定义参数

5. React中的组件

5.1 组件是什么

概念:
  • 一个组件就是用户界面的一部分,它可以有自己的逻辑和外观,组件之间可以互相嵌套,也可以复用多次
  • 组件化开发可以让开发者像搭积木一样构建一个完整的庞大的应用

5.2 React组件

在React中,一个组件就是 首字母大写的函数 ,内部存放了组件的逻辑和视图UI, 渲染组件只需要把组件 当成标签书写 即可

6. useState

6.1 useState基础使用

useState 是一个 React Hook(函数),它允许我们向组件添加一个 状态变量 , 从而控制影响组件的渲染结果
5 本质:
  • 和普通JS变量不同的是,状态变量一旦发生变化组件的视图UI也会跟着变化(数据驱动视图)

说明:

  • useState是一个函数,返回值是一个数组
  • 数组中的第一个参数是状态变量,第二个参数是set函数用来修改状态变量
  • useState的参数将作为count的初始值
  • 需要先从 react 中导入 useState 函数

6.2 修改状态的规则—状态不可变

在React中,状态被认为是只读的,我们应该始终 替换它而不是修改它 直接修改状态不能引发视图更新

6.3 修改对象状态

规则:
  • 对于对象类型的状态变量,应该始终传给set方法一个全新的对象来进行修改
直接修改原对象,不引发视图变化
调用set传入新对象用于修改

7. 组件的样式处理

7.1 组件基础样式方案

React组件基础的样式控制有俩种方式:
  • 行内样式(不推荐)
  • class类名控制

① 行内样式

  • 第一个 {} 是一个语法, 第二个{} 是一个对象

② class类名控制

  • index.css

  • App.js

8. 案例:B站评论

8.1 B站评论案例

业务需求:
  • 渲染评论列表
  • 删除评论实现
  • 渲染导航Tab和高亮实现
  • 评论列表排序功能实现

8.2 渲染评论列表

核心思路:
  • 使用useState维护评论列表
  • 使用map方法对列表数据进行遍历渲染(别忘了加key)

评论列表数据:

① 使用useState维护评论列表

② 使用map方法对列表数据进行遍历渲染(别忘了加key)

8.3 实现评论删除

需求:
  • 只有自己的评论才显示删除按钮
  • 点击删除按钮,删除当前评论,列表中不再显示
核心思路
  • 删除显示 - 条件渲染
  • 删除功能 - 拿到当前项id以id为条件对评论列表做filter过滤

① 删除显示 - 条件渲染

  • 当前用户的 uid 与 list 列表中的列表项的 uid 相同,则显示删除按钮

② 删除功能 - 拿到当前项id以id为条件对评论列表做filter过滤

8.4 渲染Tab+点击高亮实现

需求:
  • 点击哪个tab项,哪个做高亮处理
核心思路:
  • 点击谁就把谁的type(独一无二的标识)记录下来,然后和遍历时的每一项的type做匹配,谁匹配到就设置负责高亮的类名

导航 Tab 数据:

① 点击谁就把谁的 type 记录下来

② 通过记录的 type 和每一项遍历时的 type 做匹配,控制激活类名 active 的显示

③ 根据 type 类型进行排序列表

  • hot ——根据点赞数排序

  • time——根据创建时间排序

④ 使用 lodash 库实现排序功能

lodash 库官网:Lodash

  • 下载
    • npm install lodash 或者 npm i lodash(不支持 yarn 安装)
  • 引入:
    • import _ from 'lodash'

  • _.orderBy(排序的对象或数组, 排序的条件, 升序排序/降序排序)方法,返回一个排序后的新数组

    • 升序排序/降序排序: asc/desc

8.5 classnames优化类名控制

classnames是一个简单的JS库,可以非常方便的通过条件动态控制class类名的显示

现在的问题:字符串的拼接方式不够直观,也容易出错
  • 下载:
    • npm install classnames
  • 引入:
    • import classNames from 'classnames'

  • className(静态的类名, {动态类名: 条件})
    • 动态类名 key 表示要控制的类名,value表示条件,true的时候类名显示

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 关于python的Django项目性能优化
  • 软件测试3333
  • 苹果系统更新失败怎么办?教你几招轻松应对!
  • 游戏开发中客户端和服务器逻辑
  • pcdn闲置带宽被动收入必看教程。第五讲:光猫更换和基础设置
  • Oracle23ai新特性FOR LOOP循环控制结构增强
  • 工业互联网与大数据实训室解决方案
  • [Linux网络】基本网络命令socket编写TCP应用层实现简易计算器
  • 【TVM 教程】使用 tvmc 接口在 Adreno™ 上部署预训练模型
  • Window下node安装以及配置
  • intel ECI作为ACRN VM使用dpdk(vfio和iommu问题)以及img扩容
  • 2024年消防设施操作员考试题库及答案
  • 【论文阅读】DaST: Data-free Substitute Training for Adversarial Attacks(2020)
  • 六款免费写作工具,一键自动生成爆款文章
  • Xshell 连接服务器
  • 03Go 类型总结
  • 11111111
  • exif信息对照
  • React+TypeScript入门
  • SSH 免密登录
  • Yii源码解读-服务定位器(Service Locator)
  • 动态规划入门(以爬楼梯为例)
  • 工程优化暨babel升级小记
  • 规范化安全开发 KOA 手脚架
  • 技术:超级实用的电脑小技巧
  • 微服务入门【系列视频课程】
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 异步
  • 栈实现走出迷宫(C++)
  • No resource identifier found for attribute,RxJava之zip操作符
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • ​【已解决】npm install​卡主不动的情况
  • #{}和${}的区别是什么 -- java面试
  • #define 用法
  • (1)Hilt的基本概念和使用
  • (13):Silverlight 2 数据与通信之WebRequest
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (论文阅读30/100)Convolutional Pose Machines
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (算法二)滑动窗口
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • (转载)Linux 多线程条件变量同步
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)
  • .NET C# 使用 iText 生成PDF
  • .NET/C# 编译期能确定的字符串会在字符串暂存池中不会被 GC 垃圾回收掉
  • .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中(Constrained Execution Regions)
  • 。Net下Windows服务程序开发疑惑
  • [].shift.call( arguments ) 和 [].slice.call( arguments )
  • [100天算法】-不同路径 III(day 73)
  • [17]JAVAEE-HTTP协议
  • [BZOJ] 3262: 陌上花开
  • [C#]DataTable常用操作总结【转】
  • [C#]使用PaddleInference图片旋转四种角度检测