黑马React18: 基础Part II
黑马React: 基础2
Date: November 16, 2023
Sum: 受控表单绑定、获取DOM、组件通信、useEffect、Hook、优化B站评论
受控表单绑定
受控表单绑定
概念:使用React组件的状态(useState)控制表单的状态

- 准备一个React状态值
const [value, setValue] = useState('')
- 通过value属性绑定状态,通过onChange属性绑定状态同步的函数
<inputtype="text"value={value}onChange={(e) => setValue(e.target.value)}
/>
Case:
Code:
// 受控绑定表单import { useState } from "react"// 1. 声明一个react状态 - useState// 2. 核心绑定流程// 1. 通过value属性绑定 react 状态// 2. 绑定 onChange 事件 通过事件参数e拿到输入框最新的值 反向修改到react状态function App() {const [value, setValue] = useState('')return (<div className="App"><input type="text" value={value}onChange={(e) => setValue(e.target.value)}/></div>)
}export default App
Res:

React中获取DOM
在 React 组件中获取/操作 DOM,需要使用 useRef React Hook钩子函数,分为两步:
- 使用useRef创建 ref 对象,并与 JSX 绑定
const inputRef = useRef(null)
<input type="text" ref={inputRef} />
- 在DOM可用时,通过 inputRef.current 拿到 DOM 对象
console.log(inputRef.current)
Case:
Code:
import React, { useRef } from "react"
// React中获取DOM// 1. useRef生成ref对象, 绑定到dom标签身上
// 2. dom可用时, ref.current获取dom对象// 渲染完毕之后dom生成之后可用function App() {const inputRef = useRef(null)const showDom = () => {console.log(inputRef.current)}return (<div className="App"><input type="text" ref={inputRef}/><button onClick={ () => showDom() }>获取DOM</button></div>)
}export default App
Res:

案例:B站评论—发表评论
B站评论案例 —— 核心功能实现

- 获取评论内容
- 点击发布按钮发布评论
Code:
- 获取评论内容
const [content, setContent] = useState('')...{/* 评论框 */}
<textareaclassName="reply-box-textarea"placeholder="发一条友善的评论"ref={inputRef}value={content}onChange={(e) => setContent(e.target.value)}
/>
- 点击发布按钮发布评论
const handlPublish = () => {setCommentList([...commentList,{rpid: uuidV4(), // 随机iduser: {uid: '30009257',avatar,uname: '黑马前端',},content: content,ctime: dayjs(new Date()).format('MM-DD hh:mm'), // 格式化 月-日 时:分like: 66,}])// 1. 清空输入框的内容setContent('')// 2. 重新聚焦 dom(useRef) - focusinputRef.current.focus()
}...<div className="reply-box-send"><div className="send-text" onClick={handlPublish}>发布</div>
</div>
B站评论案例 — id处理和时间处理

- rpid要求一个唯一的随机数id - uuid
- ctime要求以当前时间为标准,生成固定格式 - dayjs
Code:
import { v4 as uuidV4 } from 'uuid'
import dayjs from 'dayjs'...{rpid: uuidV4(), // 随机iduser: {uid: '30009257',avatar,uname: '黑马前端',},content: content,ctime: dayjs(new Date()).format('MM-DD hh:mm'), // 格式化 月-日 时:分like: 66,
}
理解:
1-uuid会生成一个随机数
在component中查看:

2-日期格式化
dayjs.format() // 具体参考以下文档
Ref:
随机数uuid: https://github.com/uuidjs/uuid
日期dayjs: https://dayjs.gitee.io/zh-CN/
B站评论案例 — 清空内容并重新聚焦

- 清空内容 - 把控制input框的value状态设置为空串
- 重新聚焦 - 拿到input的dom元素,调用focus方法
Code:
const handlPublish = () => {setCommentList([...commentList,{rpid: uuidV4(), // 随机iduser: {uid: '30009257',avatar,uname: '黑马前端',},content: content,ctime: dayjs(new Date()).format('MM-DD hh:mm'), // 格式化 月-日 时:分like: 66,}])// 1. 清空输入框的内容setContent('')// 2. 重新聚焦 dom(useRef) - focusinputRef.current.focus()
}...{/* 评论框 */}
<textareaclassName="reply-box-textarea"placeholder="发一条友善的评论"ref={inputRef} // 给评论框绑定个ref标签, 方便获取value={content}onChange={(e) => setContent(e.target.value)}
/>
组件通信
理解组件通信
概念:组件通信就是组件之间的数据传递,根据组件嵌套关系的不同,有不同的通信方法

父传子-基础实现

实现步骤:
- 父组件传递数据 - 在子组件标签上绑定属性
- 子组件接收数据 - 子组件通过props参数接收数据
Case:
Code:
// 父传子
// 1. 父组件传递数据 子组件标签身上绑定属性
// 2. 子组件接受数据 props的参数function Son(props) {console.log(props);return <div>this is Son, {props.name}</div>
}function App() {const name = 'this is app name'return (<div className="App"><Son name={name} /></div>)
}export default App
Res:

父传子-props说明
- props可传递任意的数据
数字、字符串、布尔值、数组、对象、函数、JSX

- props是只读对象
子组件只能读取props中的数据,不能直接进行修改, 父组件的数据只能由父组件修改
父传子 - 特殊的prop children
场景:当我们把内容嵌套在子组件标签中时,父组件会自动在名为children的prop属性中接收该内容
Case:
Code:
// 父传子
// 1. 父组件传递数据 子组件标签身上绑定属性
// 2. 子组件接受数据 props的参数function Son(props) {console.log(props);return <div>this is Son, {props.children}</div>
}function App() {return (<div><Son><span>this is span</span></Son></div>)
}export default App
Res:

父子组件通信-子传父

核心思路:在子组件中调用父组件中的函数并传递参数

Case:
Code:
// 子传父
// 核心: 在子组件中调用父组件中的函数并传递实参import { useState } from "react";function Son({onGetMsg}) {// Son组件中的数据const sonMsg = 'this is son msg'return (<div><button onClick={() => onGetMsg(sonMsg)}>sendMsg</button></div>)
}function App() {const [msg, setMsg] = useState('')const getMsg = (msg) => {console.log(msg);setMsg(msg)}return (<div>Father: { msg }<Son onGetMsg={getMsg}/></div>)
}export default App
Res:

使用状态提升实现兄弟组件通信
实现流程:

实现思路:借助“状态提升”机制,通过父组件进行兄弟组件之间的数据传递
- A组件先通过子传父的方式把数据传给父组件App
- App拿到数据后通过父传子的方式再传递给B组件
Case:
// 兄弟组件传递// 1. 通过子传父 A => App ✅
// 2. 通过父传子 App => B import { useState } from "react";function A({ onGetAName }) {const name = 'this is A name'return (<div>this is A component: <button onClick={() => onGetAName(name)}>send</button></div>)
}function B(props) {return (<div>this is B component: {props.name}</div>)
}function App() {const [name, setName] = useState('')const getAName = (name) => {setName(name)}return (<div><h1>Father: </h1><A onGetAName={getAName} /><B name={name} /></div>)
}export default App
Res:

使用Context机制跨层级组件通信
图示:

实现步骤:
- 使用createContext方法创建一个上下文对象Ctx
- 在顶层组件(App)中通过 Ctx.Provider 组件提供数据
- 在底层组件(B)中通过 useContext 钩子函数获取消费数据

Case:
Code:
// Context跨层通信
// App => A => B// 1. createContext方法创建一个上下文对象// 2. 在顶层组件 通过Provider组件提供数据
// 3. 在底层组件 通过useContext钩子函数使用数据import { createContext, useContext } from "react";const MsgContext = createContext()function A() {return (<div>this is A component< B /></div>)
}function B() {const msg = useContext(MsgContext)return (<div>this is B component - { msg }</div>)
}function App() {const msg = 'this is app msg'return (<div><MsgContext.Provider value={msg}>this is App<A /></MsgContext.Provider></div>)
}export default App
Res:

useEffect 的使用
useEffect 的概念理解
useEffect是一个React Hook函数,用于在React组件中创建不是由事件引起而是由渲染本身引起的操作(副作用),比如发送AJAX请求,更改DOM等等

说明:上面的组件中没有发生任何的用户事件,组件渲染完毕之后就需要和服务器要数据,整个过程属于 “只由渲染引起的操作”
useEffect 的基础使用
需求:在组件渲染完毕之后,立刻从服务端获取频道列表数据并显示到页面中
语法:
useEffect(() => {}, [])
参数1是一个函数,可以把它叫做副作用函数,在函数内部可以放置要执行的操作
参数2是一个数组(可选参),在数组里放置依赖项,不同依赖项会影响第一个参数函数的执行,当是一个空数组的时候,副作用函数只会在组件渲染完毕之后执行一次
接口地址:http://geek.itheima.net/v1_0/channels
Case:
Code:
import { useEffect, useState } from "react"const URL = 'http://geek.itheima.net/v1_0/channels'function App() {// 创建一个状态数据const [list, setList] = useState([])useEffect(() => {// 额外的操作 获取频道列表async function getList() {const res = await fetch(URL)const jsonRes = await res.json()// console.log(list);setList(jsonRes.data.channels)}getList()}, [])return (<div className="App">{/* this is app - { list[0].name } */}<ul>{ list.map(item => {return <li key={ item.id }>{ item.name }</li>})}</ul></div>)
}export default App
Res:

useEffect 依赖项参数说明
useEffect副作用函数的执行时机存在多种情况,根据传入依赖项的不同,会有不同的执行表现
| 依赖项 | 副作用函数执行时机 |
|---|---|
| 没有依赖项目 | 数组初始渲染+组件更新时执行 |
| 空数组依赖 | 只在初始渲染时执行一次 |
| 添加特定依赖项 | 组件初始渲染 + 特性依赖项变化时执行 |
Case: 1. 没有依赖项
func: 点击按钮, 数字会逐渐加1
Code:
import { useEffect, useState } from "react"function App() {// 1. 没有依赖项 初始 + 组件 更新const [count, setCount] = useState(0)useEffect(() => {console.log('副作用函数执行了');})const handleAdd = () => {setCount(count + 1)}return (<div className="App">this is app<button onClick={ () => handleAdd() }> {count} </button></div>)
}export default App
Res:

Case2: 空数组依赖
Code:
import { useEffect, useState } from "react"function App() {// 1. 没有依赖项 初始 + 组件 更新const [count, setCount] = useState(0)useEffect(() => {console.log('副作用函数执行了');})const handleAdd = () => {setCount(count + 1)}return (<div className="App">this is app<button onClick={ () => handleAdd() }> {count} </button></div>)
}export default App
Res:

Case3: 添加特定依赖项
Code:
import { useEffect, useState } from "react"function App() {// 3. 添加特定依赖项// 依赖于 count , 只要count变化, 就执行副作用函数const [count, setCount] = useState(0)useEffect(() => {console.log('副作用函数执行了');}, [count])const handleAdd = () => {setCount(count + 1)}return (<div className="App">this is app<button onClick={ () => handleAdd() }> {count} </button></div>)
}export default App
Res:

useEffect — 清除副作用
在useEffect中编写的由渲染本身引起的对接组件外部的操作,社区也经常把它叫做副作用操作,比如在useEffect中开启了一个定时器,我们想在组件卸载时把这个定时器再清理掉,这个过程就是清理副作用
useEffect(() => {// 实现副作用操作逻辑return () => {// 清除副作用逻辑...}
}, [])
说明:清除副作用的函数最常见的执行时机是在组件卸载时自动执行
需求:在Son组件渲染时开启一个定制器,卸载时清除这个定时器
Case:
func: 点击卸载, 定时器会停止
Code:
import { useEffect, useState } from "react";function Son() {useEffect(() => {const timer = setInterval(() => {console.log('定时器执行中...pilipala');}, 1000)return () => {clearInterval(timer)}}, [])return <div>this is son</div>
}function App() {// 通过条件渲染模拟组件卸载const [show, setShow] = useState(true)return (<div>{ show && <Son />}<button onClick={() => setShow(false)}>卸载Son组件</button></div>)
}export default App
Res:

自定义Hook实现
自定义Hook函数
概念:自定义Hook是以 use 打头的函数,通过自定义Hook函数可以用来实现逻辑的封装和复用

Case:
func: 切换 显示/隐藏 组件
Code:
// 封装自定义 Hook// 问题: 布尔切换的逻辑 当前组件耦合在一块时, 不方便复用
// 解决思路: 自定义Hookimport { useState } from "react"function useToggle() {// 可复用逻辑代码const [value, setValue] = useState(true)const handleToggle = () => {setValue(false)}// 哪些状态和回调函数需要在其他组件中使用 returnreturn {value, handleToggle}
}// 封装自定义hook通用思路
// 1. 声明一个以use打头的函数
// 2. 在函数体内封装可复用的逻辑 (只要是可复用的逻辑)
// 3. 把组件中用到的状态或者回调returan出去(以对象或者数组)
// 4. 在哪个组件中要用到这个逻辑, 就调用这个自定义hook, 结构出来状态和回调进行使用function App() {const { value, handleToggle } = useToggle()return (<div className="App">{ value && <div>this is div</div>}<button onClick={() => handleToggle()}>toggle</button></div>)
}export default App
Res:

React Hooks使用规则
使用规则:
-
只能在组件中或者其他自定义Hook函数中调用
-
只能在组件的顶层调用,不能嵌套在 if、for、其他函数中
理解: 就是Hooks不能有条件地执行, 只能直接在顶部采用
const { value, handleToggle } = useToggle()这种方式, 直接调用

案例:优化B站评论案例
优化需求

- 使用请求接口的方式获取评论列表并渲染
- 使用自定义Hook函数封装数据请求的逻辑
- 把评论中的每一项抽象成一个独立的组件实现渲染
优化需求-通过接口获取评论列表
-
使用 json-server 工具模拟接口服务, 通过 axios 发送接口请求
json-server是一个快速以.json文件作为数据源模拟接口服务的工具
axios是一个广泛使用的前端请求库
# -D 指安装到开发时依赖
npm i json-server -D
- 使用 useEffect 调用接口获取数据
useEffect(() => {// 发送网络请求...
}, [])
拓展:
json-server
使用步骤:
1-安装(参考视频)
2-配置 package.json
"scripts": {"start": "react-scripts start","build": "react-scripts build","test": "react-scripts test","eject": "react-scripts eject","serve": "json-server db.json --port 3004" // 添加 json-server 的端口
},
参考:
json-server: https://github.com/typicode/json-server
优化需求-自定义Hook函数封装数据请求
一般思路:
- 编写一个 use 打头的函数
- 函数内部编写封装的逻辑
- return出去组件中用到的状态和方法
- 组件中调用函数解构赋值使用
function useGetList () {// 获取接口数据渲染const [commentList, setCommentList] = useState([])useEffect(() => {// 请求数据async function getList () {// axios请求数据const res = await axios.get(' http://localhost:3004/list')setCommentList(res.data)}getList()}, [])return {commentList,setCommentList}
}...const [commetList, setCommetList] = useGetList()
优化需求-封装评论项Item组件

抽象原则:App作为“智能组件”负责数据的获取,Item作为“UI组件”负责数据的渲染
// 封装Item组件
function Item ({ item, onDel }) {return (<div className="reply-item">{/* 头像 */}<div className="root-reply-avatar"><div className="bili-avatar"><imgclassName="bili-avatar-img"alt=""src={item.user.avatar}/></div></div><div className="content-wrap">{/* 用户名 */}<div className="user-info"><div className="user-name">{item.user.uname}</div></div>{/* 评论内容 */}<div className="root-reply"><span className="reply-content">{item.content}</span><div className="reply-info">{/* 评论时间 */}<span className="reply-time">{item.ctime}</span>{/* 评论数量 */}<span className="reply-time">点赞数:{item.like}</span>{/* 条件:user.id === item.user.id */}{user.uid === item.user.uid &&<span className="delete-btn" onClick={() => onDel(item.rpid)}>删除</span>}</div></div></div></div>)
}{/* 评论列表 */}
<div className="reply-list">{/* 评论项 */}{commetList.map(item => <Item key={item.rpid} item={item} onDel={() => handleDel(item.rpid)}/>)}
</div>
相关文章:
黑马React18: 基础Part II
黑马React: 基础2 Date: November 16, 2023 Sum: 受控表单绑定、获取DOM、组件通信、useEffect、Hook、优化B站评论 受控表单绑定 受控表单绑定 概念:使用React组件的状态(useState)控制表单的状态 准备一个React状态值 const [value, se…...
Maven工程继承关系,多个模块要使用同一个框架,它们应该是同一个版本,项目中使用的框架版本需要统一管理。
1、父工程pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/PO…...
Selenium UI 自动化
一、Selenium 自动化 1、什么是Selenium? Selenium是web应用中基于UI的自动化测试框架。 2、Selenium的特点? 支持多平台、多浏览器、多语言。 3、自动化工作原理? 通过上图,我们可以注意到3个角色,下面具体讲解一…...
竞赛 题目:基于深度学习的图像风格迁移 - [ 卷积神经网络 机器视觉 ]
文章目录 0 简介1 VGG网络2 风格迁移3 内容损失4 风格损失5 主代码实现6 迁移模型实现7 效果展示8 最后 0 简介 🔥 优质竞赛项目系列,今天要分享的是 基于深度学习卷积神经网络的花卉识别 该项目较为新颖,适合作为竞赛课题方向,…...
【unity3D-网格编程】01:Mesh基础属性以及用代码创建一个三角形
💗 未来的游戏开发程序媛,现在的努力学习菜鸡 💦本专栏是我关于游戏开发的网格编程方面学习笔记 🈶本篇是unity的网格编程系列01-mesh基础属性 网格编程系列01 mesh基础属性实践操作用代码初始化一个三角形在三角形的基础上改成正…...
Java贪吃蛇小游戏
Java贪吃蛇小游戏 import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.util.LinkedList; import java.util.Random;publi…...
Linux:系统基本信息扫描(1)
#系统基本信息: uname -a #Linux发行版信息: lsb_release -a #内核与发行版信息: cat /proc/version #linux 用户 cat /etc/passwd #Linux 组查询 cat /etc/group #CPU详细信息:lscpu -a #获取CPU模式: cat /sys/devices/system/cpu/cpu0/cpufreq/scaling\_governor #per…...
VR全景打造亮眼吸睛创意内容:三维模型、实景建模
随着VR技术在不同行业之间应用落地,市场规模也在快速扩大,VR全景这种全新的视觉体验为我们生活中的许多方面都带来了无限的可能。更加完整的呈现出一个场景或是物体的所有细节,让浏览者感受到自己仿佛置身于现场一般;其次…...
ProTable高级表格获取表单数据
隐藏高级表格中的收起按钮 手动控制高级表格中的搜索按钮 获取高级表格中的表单数据 Forminstance 引入 然后在代码中定义 const refForm useRef(); 使用 refForm.current.getFileDsValue();...
力扣刷题第二十七天--二叉树
前言 题目大同小异,按要求来即可。 内容 一、二叉树的右视图 199.二叉树的右视图 给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。 广度优先搜索 取每层最后一个…...
一个快递包裹的跨国之旅
事情要从今年三月份说起,一位爱尔兰的同事在6月份结婚,团队同事准备了中国风的丝绸画轴、领带、丝巾作为礼物。3月份开始邮寄,4月初爱尔兰方面收件,5月份因为文件不足、不完整、不正确等原因被取消进口,7月份退回到大连…...
qsort函数使用方法总结
目录 一、qsort函数原型 二、compar参数 三、各种类型的qsort排序 1. int 数组排序 2. 结构体排序 3. 字符串指针数组排序 4. 字符串二维数组排序 四、回调函数 1. 什么是回调函数 2. 为什么要用回调函数? 3. 怎么使用回调函数? 4.下面是…...
机器学习介绍与分类
随着科学技术的不断发展,机器学习作为人工智能领域的重要分支,正逐渐引起广泛的关注和应用。本文将介绍机器学习的基本概念、原理和分类方法,帮助读者更好地理解和应用机器学习技术。 一、机器学习的基本概念 机器学习是一种通过从数据中学…...
linux控制台命令
进入root sudo su root 浏览当前文件夹列表 ll ls 查看文件 vim test.txt :q 退出查看模式 上传 sudo rz rz 覆盖上传 rz -y 修改文件名: mv 旧文件名 新文件名 修改文件权限 sudo chmod ar xxx.txt sudo chmod 777 test.txt 7 4 2 1 读写运行权限…...
快时尚品牌Halara登上TikTok美国小店榜Top 5,运动健身风靡TikTok
TikTok Shop美国电商数据周榜(11/06-12)已出,具体信息如下: 上周总GMV达到5850万美元,日均出单840万美元;单日出单最高达2110万美元,是当前美国单日最高销售额; 截至11月12日&…...
Docker 安装 Oracle Database 23c
目录 访问 Oracle 官方网站 使用 Docker 运行 Oracle Database 23c 免费容器映像 创建并运行 Oracle Database 23c 容器 查看已下载的镜像 列出正在运行的容器 进入容器 sqlplus 命令 访问 Oracle 官方网站 Database Software Downloads | Oracle 中国 使用 Docker 运行…...
什么是美国服务器,有哪些优势,适用于什么场景?
在互联网发展的过程中,服务器扮演着至关重要的角色。而美国作为全球信息技术的中心,其服务器在全球范围内受到广泛关注。 美国服务器是指在美国本土机房搭建并运行的服务器。其拥有带宽大、优质硬件、售后运维好、位置优越、数据安全性高以及免备…...
TeXLive 2023安装教程
TeXLive 2023安装教程 本文介绍最新TeX发行版——TeXLive 2023的安装步骤。如果你想用LaTeX进行写作,那么需要搭建LaTeX环境:可以选择下面两种方案之一进行安装:(1)TeXLive 2023TeXStudio或者(2)TeXLive 2023WinEdt 11。其中TeXLive 2023是由…...
uniapp中swiper 轮播带左右箭头,点击切换轮播效果demo(整理)
可以点击箭头左右切换-进行轮播 <template><view class"swiper-container"><swiper class"swiper" :current"currentIndex" :autoplay"true" interval"9000" circular indicator-dotschange"handleSw…...
网络连接Android设备
参考:https://blog.csdn.net/qq_37858386/article/details/123755700 二、网络adb调试开启步骤 1、把Android平板或者手机WiFi连接到跟PC机子同一个网段的网络,在设置-系统-关于-状态 下面查看设备IP,然后查看PC是否可以ping通手机的设备的IP。 2、先…...
手把手教你写一个能自动上网写研报的 Research Agent
手把手教你写一个能自动上网写研报的 Research Agent 引言 痛点引入 如果你是券商研究员、行业分析师、高校商科学生,或者企业战略岗的从业者,一定对「写研报」这件事的痛苦深有体会: 查资料耗时:一篇中等深度的行业研报,至少需要翻阅30+权威来源的信息,包括工信部政策…...
GaussDB 操作时间【玩转PB级数仓GaussDB(DWS)】
前言在使用 GaussDB DWS 进行数仓相关操作时,我们经常会涉及到对时间的操作,本文主要来讲解下有关时间操作的定义及函数格式化字符串模式描述HH一天的小时数(01-12)HH12一天的小时数(01-12)HH24一天的小时数(00-23)MI分钟(00-59)ss秒(00-59)MS毫秒(000-9…...
2026最新论文降AI攻略:实测5款高效辅助工具,查降一体与结构重构选哪个
最近看了一些行业报告,AI工具在写作方面的普及率真的已经超乎想象了。 很多大学生在写论文时也都习惯用AI来辅助寻找灵感、提高效率。 与此同时,相关部门针对人工智能写作出台了一系列规定,各大学术检测平台也都在不断升级AIGC检测算法。 现…...
探索Windows上的安卓应用部署:APK Installer技术实践指南
探索Windows上的安卓应用部署:APK Installer技术实践指南 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 想在Windows电脑上直接运行安卓应用,却…...
开发环境准备:Python、Node.js、Docker与Git
从“环境搞了两天”到“半小时开箱即用”,一个老油条的环境配置血泪史前几天团队来了个新同事,应届生,看着简历上写着“熟悉Python、Node.js、Docker、Git”。我心想,挺好,基本功扎实。然后给了他一个新电脑࿰…...
电磁兼容(EMC)设计实战:从干扰源头到系统防护的完整指南
1. 电磁兼容(EMC)设计的核心逻辑 电磁兼容设计就像给电子设备打造一套"防干扰盔甲"。想象一下,你正在用手机通话时,突然听到收音机杂音——这就是典型的电磁干扰现象。EMC设计要解决两个核心问题:不让自家设…...
AI Agent社区平台架构实战:React 19 + Cloudflare边缘计算全栈开发
1. 项目概述:一个为AI Agent时代设计的社区平台如果你最近在折腾AI Agent,或者想找一些靠谱的AI工具,那你可能已经发现了一个痛点:信息太散了。教程、工具推荐、硬件配置、社区交流,这些内容散落在各个论坛、博客和社交…...
QtScrcpy安卓投屏终极指南:从零基础到精通应用的完整教程
QtScrcpy安卓投屏终极指南:从零基础到精通应用的完整教程 【免费下载链接】QtScrcpy Android实时投屏软件,此应用程序提供USB(或通过TCP/IP)连接的Android设备的显示和控制。它不需要任何root访问权限 项目地址: https://gitcode.com/barry-ran/QtScrc…...
为什么你的Windows任务栏需要一次彻底的美学革命?
为什么你的Windows任务栏需要一次彻底的美学革命? 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB 你是否曾经盯着Windows桌面…...
深度探索JD-GUI:Java字节码逆向工程与代码解析实战剖析
深度探索JD-GUI:Java字节码逆向工程与代码解析实战剖析 【免费下载链接】jd-gui A standalone Java Decompiler GUI 项目地址: https://gitcode.com/gh_mirrors/jd/jd-gui 在Java开发与逆向工程领域,Java反编译、字节码分析、代码逆向已成为开发者…...
