黑马React保姆级(PPT+笔记)

一、react基础

1.进程

2、优势

封装成一个库,组件化开发更加方便

跨平台主要是react native等可以来写移动端如android,ios等

丰富生态:可以在很多浏览器用

3、市场

4、搭建脚手架

npx create-react-app react-basic

npm start后仍然可能会报错

解决办法,在index.js中把这两行注释掉

认识目录
核心依赖(右边两个react)

去除非必要

除了app.js和index.js其他全干掉

index.js

app.js

重新启动测试

npm start

运行原理:

总结

创建->清理

创建react的其他方式

5、JSX

本质

工具编译测试

Babel · Babel,点击上面的try it out,然后勾选左边的react就可以了

也就是说,JSX是浏览器不认可的格式,需要通过babel编译器转换成js

高频场景

const count = 1000
function getName(){return('john')
}
function App() {return (<div className="App">this is my first react app{'this is message'}{count}{getName()}{new Date().getDate()}<div style={{color:'red'}}>this is div</div></div>);
}

解释:外面的括号(外层)是识别表达式,内层是对象结构

注意
渲染列表

总结

const list = [{id:1001,name:'react'},{id:1002,name:'angular'},{id:1003,name:'vue'}
]
function App() {return (<div className="App"><ul>{list.map(item=><li key={item.id}>{item.name}</li>)}</ul></div>);
}export default App;
条件渲染
简单情况

复杂情况

一个页面三种图片展示方式

事件绑定(交互)

获取事件参数e

自定义参数(要用函数引用)

两个都要

6、组件

所谓的组件其实就是函数,可以用function也可以用箭头函数声明,只要首字母是大写就可以。

7、useState

状态不可变

修改对象状态

拓展:看看官方文档数组要怎么变化

8、组件样式变化

1、行内样式

2、类名

9、B站评论案例

渲染

这堆要放在commentList的map循环里面

删除

思路是传一个id进去函数,然后用过滤器过滤掉id相等的那个人

切换功能

思路:先准备一个列表,遍历出最热和最新,设置一个动态state,点击就传type给函数,然后顺便修改这个state,高亮显示就是动态类名,判断这个state和遍历的item一不一样。

排序

安装lodash,主要用他的order功能

npm i lodash

引入横杠

解释:三个字段,第一个是列表,第二个是针对哪个type,第三个是排序方式

改进

让一开始进去就是按最热排序,有默认排序

修改前

修改后

10、classnames优化类名

图里面那种本质还是字符串拼接的模板字符串

安装包

npm i classnames

import

11、受控表单绑定

12、react中获取dom

可以用dir查看有哪些属性

13、发布评论

1、获取评论内容

2、点击发布触发回调函数

本质是修改commentList,先展开,后面再拓展进去(格式要一致),content改为动态的

3、优化

安装uuid
npm i uuid

用法

import {v4 as uuidv4} from 'uuid';
day.js
import dayjs from 'dayjs';

主要观察rpid,ctime

13、清空内容并聚焦案例

当发布完评论后就要这样

1、清空内容

2、聚焦

先创建ref实例,然后绑定到input,最后调用focus方法即可

调用current.focus()即可

14、组件通信

父传子

function Son(props){return <div>this is son,{props.name}</div>
}
function App() {const name = "this is father"return (<div className="App"><Son name={name}></Son></div>);
}export default App;

props说明

这里修改会报错,因为props是只读属性

children说明

子传父

影响视图变化的是状态数据

兄弟组件通信

import {useState} from "react";function A({onGetAMsg}){const name = "this is A"return (<div>我是A组件<button onClick={()=>onGetAMsg(name)}>send</button></div>)
}
function B({name}){return(<div>我是B组件{name}</div>)
}
function App() {const [name,setName] = useState(null)const getAMsg = (msg)=>{setName(msg)}return (<div className="App"><A onGetAMsg={getAMsg}/><B name={name}/></div>);
}export default App;

跨层组件通信

15、useEffect

我们主要关注是否有请求并且只请求一次。

依赖项参数说明

第一种情况

事实也确实是这样,组件初始化和更新时都会执行一次

第二种情况

这里只执行一次

第三种情况

看起来和第一种情况差不多,实则不然,第一种情况不管什么组件更新都会执行一次,而这里只有count变化才执行一次。

清除副作用

import {useEffect, useState} from "react";function Son(){useEffect(() => {const timer = setInterval(()=>{console.log("定时器执行中")},1000)return () => {clearInterval(timer)}}, []);return <div>this is son</div>
}
function App() {const [show, setShow] = useState(true)return (<div className="App">{show && <Son/>}<button onClick={()=>setShow(false)}>卸载Son组件</button></div>);
}export default App;

16、自定义hook函数

不封装直接实现

封装自定义Hook实现

抽象实现的通用逻辑

17、ReactHooks使用规则

第一种错误

第二种错误

18、优化B站评论

需求1

json-sever

npm i json-sever -D
根目录创建db.json

复制静态数据过来

pages.json添加serve

npm run serve启动
npm run serve

有笑脸就是成功

可以尝试请求这个地址

打开就是模拟get请求

axios
npm i axios
从后台获取数据 

先初始化一个动态数组准备接收

先在useEffect里编写函数逻辑,再来调用函数

需求2

封装函数

把上一步编写的逻辑都放到hook函数里面

App组件调用

需求3

封装Item组件

去掉key

这里会报错,先把功能去掉

封装删除功能(子组件调用父组件 / 父传子)

父传子把功能传递下去(onDel那里)

接收一下

重新调用

至此,我们通过组件抽象的方式实现了小组件的封装

19、Redux

快速体验(计数器)

模版

最后一步

流程梳理

20、react-redux

配置基础环境

store目录结构设计

跟着创建目录先

21、用redux继续实现counter案例

整体路径熟悉

使用Reacttoolkit创建counterStore

使用中间件react-redux连接,为React注入store

下面是在根目录的index.js中操作的哦

react中使用store数据

useSelector

react中修改store数据

useDispatch

这里还要引入store里的actions对象,然后通过中间件的useDispatch提交

总结

22、提交action传参

需求

实现

完整代码

原理:跟action对象的payload有关

23、react-redux异步操作

需求理解:跟之前的没什么变化,只是多了异步修改

异步操作样板代码

实际代码,重新创建channelStore.js

导出reducer

24、redus调试-devtools

安装扩展程序

重启浏览器就可以

25、美团案例

1、点击左边列表,右边列表也会渲染

2、点击+号下面会有高亮显示

3、清除购物车

准备工作

分类和商品列表

启动项目
npm run start
npm run serve
 创建store实例

 异步获取

 

导出

 

modules的index.js引入

根目录的index.js引入

触发action并且渲染数据

用redux工具查看

渲染列表

点击分类激活交互实现

点击背景会变白

redux编写

解构出来并export出去

Menu组件的index.js引入方法和使用dispatch

redux工具调试查看

引入activeIndex

classNames编写

商品列表切换显示(视图控制)

App.js引入activeIndex

添加购物车实现

思路

redux编写
编写modules的state

编写reducer

export导出

编写foodsCart组件
 引入方法

引入dispatch

传入对象

使用redux工具测试

统计区域功能实现

思路

cart组件取到carList长度渲染

成功实现

计算总价(reduce方法和toFixed)

高亮(classNames)

 起送和结算显示控制(三元运算符)

购物车列表实现

思路 

使用cartList渲染

把原本的cart干掉

替换

 添加visible显示

增减reducer,action提交
 store编写

export导出

 熟悉Count组件

引入dispatcher

引入reducer

子传父触发回调 

优化(不能是负数)

store里修改(判断逻辑)

清空购物车
store编写
reducer

export导出

cart组件引入reducer

然后导入dispatcher和reducer方法就可以了 

控制购物车显示和隐藏

思路(用useState控制,不用Redux)

编写classNames

优化(购物车列表为空应该是不会有蒙层的)

编写onShow函数控制

修改之前的setVisible方法为onShow

总结:多组件共享才要放到Redux里面去,如果不用的话直接用useState就可以了。

26、react-router

前言提示

Vue中不需要export页面,而React就需要 

npx create-react-app react-router-pro
npm i react-router-dom
npm run start

实际的router配置

创建Login和Article页面并export

创建router目录并import组件最后export

index.js中注入router并且去配置即可

路由导航

声明式导航(Link)

编程式导航(useNavigate)

导航跳转传参

1、useSearchParams

在Article页接收参数
2、useParams

这个id是哪里来的呢?要到router实例去配置

编写样式

 到router位置给占位符(重中之重)

后面要接收多个参数的话同样的方式操作即可

在Article页接收id

嵌套路由配置

Outlet

配置基本跟Vue没什么两样,多了个Outlet而已 ,作为二级路由出口

默认二级路由

我们要的是一进入就有显示“我是面板”,而不用专门去点击

404路由配置(path用星号“*”配置)

兜底组件

提高体验感

可以加一些按钮之类跳转到首页

两种路由模式

换成hash模式的话直接替换API就可以了,切换页面的时候路径前面有#

 

在实际开发中,后端支持的话就选history模式,不支持就选hash模式,其实没什么差别

记账本项目

功能演示

讲解:可以切换月份,可以切换年份,会展示每个月份的收支,可以输入“记一笔”

准备工作
 移动端组件库antd-mobile

 是阿里出品的适应React项目的组件库

配置别名路径@

配置步骤

修改pages.json的scripts

启动
npm run start
创建test.js测试

index.js导入

VsCode路径联想配置
数据Mock实现
 json-sever实现数据mock

npm i -D json-sever
server目录下创建data.json文件放入数据

添加启动命令

意思是添加一个以data.json为数据源,端口号为8888的服务器

启动
npm run serve
访问接口 

配置路由
编写router和pages 

index.js引入
配置二级路由

antD-mobile主题定制

编写css文件

注入到入口文件

到官方文档可以看见更多配置

Redux管理账目列表
思路

补充name

编写异步(!!!)

记得导出异步

测试即可

TabBar

静态布局实现

ant design mobile官网查找

这个去看老师代码就可以

导入代码和scss文件
npm i scss
配置跳转路由

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32 CUBE Can调试

STM32 CUBE Can调试 1、CAN配置2、时钟配置3、手动添加4、回调函数5、启动函数和发送函数6、使用方法(采用消息队列来做缓存)7、数据不多在发送函数中获取空邮箱发送&#xff0c;否则循环等待空邮箱 1、CAN配置 2、时钟配置 3、手动添加 需要注意的是STM32CUBE配置的代码需要再…

DeepSeek从入门到精通:全面掌握AI大模型的核心能力

文章目录 一、DeepSeek是什么&#xff1f;性能对齐OpenAI-o1正式版 二、Deepseek可以做什么&#xff1f;能力图谱文本生成自然语言理解与分析编程与代码相关常规绘图 三、如何使用DeepSeek&#xff1f;四、DeepSeek从入门到精通推理模型推理大模型非推理大模型 快思慢想&#x…

【vscode+latex】实现overleaf本地高效编译

overleaf本地高效编译 1. 配置本地latex环境2. vscode插件与配置3. 使用 之前觉得用overleaf在线写论文很方便&#xff0c;特别是有辅助生成latex格式公式的网页&#xff0c;不需要在word上一个一个手打调格式。 然而&#xff0c;最近在写一篇论文的时候&#xff0c;由于这篇论…

Spring AI -使用Spring快速开发ChatGPT应用

前言 Spring在Java生态中一直占据大半江山。最近我发现Spring社区推出了一个Spring AI项目&#xff0c;目前该项目还属于Spring实验性项目&#xff0c;但是我们可以通过该项目&#xff0c;可以非常快速的开发出GPT对话应用。 本篇文章将会对SpringAI进行简单的介绍和使用&#…

XILINX硬件设计-(1)LVDS接口总结

1.LVDS差分信号电路原理 LVDS指的是低压差分信号&#xff0c;是一种电平标准。 差分信号在串行通信中有着非常广泛的应用&#xff0c;典型应用有PCIE中的gen1&#xff0c;gen2&#xff0c;gen3&#xff0c;gen4&#xff0c;gen5&#xff0c;SATA接口&#xff0c;USB接口等。 …

保姆级教程Docker部署Zookeeper模式的Kafka镜像

目录 一、安装Docker及可视化工具 二、Docker部署Zookeeper 三、单节点部署 1、创建挂载目录 2、命令运行容器 3、Compose运行容器 4、查看运行状态 5、验证功能 四、部署可视化工具 1、创建挂载目录 2、Compose运行容器 3、查看运行状态 一、安装Docker及可视化工…

学习笔记:在华为云ModelArts上运行MindSpore扩散模型教程

目录 一、背景与目的 二、环境搭建 三、模型原理学习 1. 类定义与初始化 2. 初始卷积层 3. 时间嵌入模块 4. 下采样模块 5. 中间模块 6. 上采样模块 7. 最终卷积层 8. 前向传播 9. 关键点总结 四、代码实现与运行 五、遇到的问题及解决方法 六、总结与展望 教程来源&#xff1a…

Office/WPS接入DeepSeek等多个AI工具,开启办公新模式!

在现代职场中&#xff0c;Office办公套件已成为工作和学习的必备工具&#xff0c;其功能强大但复杂&#xff0c;熟练掌握需要系统的学习。为了简化操作&#xff0c;使每个人都能轻松使用各种功能&#xff0c;市场上涌现出各类办公插件。这些插件不仅提升了用户体验&#xff0c;…

学习 PostgreSQL 流复制

PostgreSQL 流复制 PostgreSQL数据库异常中止后&#xff0c;数据库刚重启时&#xff0c;会重放停机前最后一个checkpoint点之后的 WAL日志&#xff0c;在把数据库恢复到停机的状态后&#xff0c;自动进入正常的状态&#xff0c;可以接收其他用户的查询和修改。 想象另一个场景…

Python基础-元组tuple的学习

在 Python 中&#xff0c;元组&#xff08;tuple&#xff09;是一种不可变的序列类型&#xff0c;允许存储不同类型的元素。元组非常类似于列表&#xff08;list&#xff09;&#xff0c;但与列表不同的是&#xff0c;元组一旦创建&#xff0c;就不能修改其内容。 1 元组的创建…

Photoshop自定义键盘快捷键

编辑 - 键盘快捷键 CtrlShiftAltK 把画笔工具改成Q , 橡皮擦改成W , 涂抹工具改成E , 增加和减小画笔大小A和S 偏好设置 - 透明度和色域 设置一样颜色 套索工具 可以自定义套选一片区域 Shiftf5 填充 CtrlU 可以改颜色/色相/饱和度 CtrlE 合并图层 CtrlShiftS 另存…

如何在Android Studio中开发一个简单的Android应用?

Android Studio是开发Android应用的官方集成开发环境&#xff08;IDE&#xff09;&#xff0c;它提供了许多强大的功能&#xff0c;使得开发者能够高效地创建Android应用。如果你是Android开发的初学者&#xff0c;本文将引导你如何在Android Studio中开发一个简单的Android应用…

【Qt 常用控件】输入类控件1(QLineEdit和QTextEdit 输入框)

目录 1.QLineEdit 单行输入框 例&#xff1a;输入个人信息&#xff0c;通过按钮提交 例&#xff1a;为输入框设置验证器&#xff0c;检查输入的电话 例&#xff1a;验证两次输入的密码是否一致 例&#xff1a;是否显示密码按钮,toggled信号。 2.QTextEdit多行输入框 、QPl…

Bash (Bourne-Again Shell)、Zsh (Z Shell)

文章目录 1. 历史背景2. 主要区别3. 功能对比自动补全插件和主题路径扩展提示符定制 4. 性能5. 使用场景6. 如何切换 Shell7. 总结 以下是 Bash 和 Zsh 之间的主要区别&#xff0c;列成表格方便对比&#xff1a; 特性BashZsh默认Shell大多数Linux发行版默认ShellmacOS默认She…

Jetbrains IDE http客户端使用教程

简介 JetBrains IDE&#xff08;如IntelliJ IDEA&#xff0c; WebStorm&#xff0c; PhpStorm和PyCharm&#xff09;自带一个内置的HTTP客户端&#xff0c;允许直接从IDE发送HTTP请求&#xff0c;而无需使用第三方工具&#xff0c;如Postman或cURL。 JetBrains IDE 中的 HTTP…

android手机安装deepseek-r1:1.5b

序 本文主要展示一下如何在android手机上安装deepseek-r1:1.5b 步骤 安装termux 到https://termux.dev/cn/index.html去下载 然后执行termux-setup-storage以获取手机存储权限 安装构建依赖 pkg install git cmake golang下载ollama git clone --depth 1 https://gitee.…

U3D支持webgpu阅读

https://docs.unity3d.com/6000.1/Documentation/Manual/WebGPU-features.html 这里看到已经该有的差不多都有了 WOW VFX更是好东西 https://unity.com/cn/features/visual-effect-graph 这玩意儿化简了纯手搓一个特效的流程 如果按原理说就是compute shader刷position&#…

PWM波形输出

一、想要达到的效果 二、实现代码 因为是在1khz的频率下&#xff0c;所以用重新配置定时器0&#xff0c;定时长度为100微妙 void Timer0Init(void) //100微秒12.000MHz {AUXR | 0x80; //定时器时钟1T模式TMOD & 0xF0; //设置定时器模式TL0 0x50; //设置定时初值TH0 …

Spring Boot整合MQTT

MQTT是基于代理的轻量级的消息发布订阅传输协议。 1、下载安装代理 进入mosquitto下载地址&#xff1a;Download | Eclipse Mosquitto&#xff0c;进行下载&#xff0c;以win版本为例 下载完成后&#xff0c;在本地文件夹找到下载的代理安装文件 使用管理员身份打开安装 安装…

前端 CSS 动态设置样式::class、:style 等技巧详解

一、:class 动态绑定类名 v-bind:class&#xff08;缩写为 :class&#xff09;可以动态地绑定一个或多个 CSS 类名。 1. 对象语法 通过对象语法&#xff0c;可以根据条件动态切换类名。 <template><div :class"{ greenText: isActive, red-text: hasError }&…