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

UI组件库及antd

什么是UI组件库及antd安装

随着商业化的趋势,企业级产品中需求多且功能复杂,且变动和并发频繁,常常需要设计者与开发者快速做出响应,同时这类产品中有很多类似的页面及组件,可以通过抽象得到一些稳定且高复用性的内容

常见的UI组件库:Ant Design,Material UI等

组件库安装:npm install antd

图标库安装:npm install @ant-design/icons

 我的远程卡掉了

按在本地了

 

好的其实根本和那些没关系

我决定不再用deepseek

 

import { Button, Space } from 'antd'
import { PlusCircleFilled } from '@ant-design/icons'function App() {return (<div>hello App<br /><Space><Button type="primary" icon={ <PlusCircleFilled />} >按钮</Button></Space></div>)
}export default App

引入antd,然后用Space把他们包起来可以更好的对齐,有空格

<PlusCircleFilled />是一个加号小图标

antd布局与导航组件

布局:Gird,Layout........

导航:Breadcrumb,Menu ....

看一下官网:

Ant Design - 一套企业级 UI 设计语言和 React 组件库https://ant-design.antgroup.com/index-cn

很多的 分类

 

看看栅格: 

 

 

可以通过看文档来直接使用这些代码,制作出自己想要的效果

import { Row, Col, Layout } from 'antd'
import 'antd/dist/reset.css'
const { Header, Footer, Sider, Content } = Layoutconst col = {background: 'red',
}function App() {return (<div>hello App<Row gutter={[10, 10]}><Col xs={12} md={8}><div style={col}>aaaaa</div></Col><Col xs={12} md={8}><div style={col}>bbbbb</div></Col><Col xs={12} md={8}><div style={col}>ccccc</div></Col></Row><Layout><Header>header</Header><Layout><Sider>left sidebar</Sider><Content>main content</Content><Sider>right sidebar</Sider></Layout><Footer>footer</Footer></Layout></div>)
}export default App

这是调整边距以及页面改变之后的距离

 antd数据录入组件

数据录入:From,Switch,Rate...

。。。六月份学长说全不用看。。。

直接把项目写了得了

案例一:手写antd按钮组件

功能:类型,尺寸,文字,图标。。。。

自定义hook

先了解一下什么是自定义hook

自定义hook是一个函数,函数内部可以调用其他hook函数,且以use开头,主要作用是对逻辑功能进行封装处理,达到一种复用能力

让我们试试实现一个实时获取鼠标坐标的自定义Hook

import { useEffect, useState } from "react"function useMouse(){const [state,setState] = useState({pageX:NaN,pageY:NaN,})useEffect(()=>{function move(e){setState({pageX:e.pageX,pageY:e.pageY})}document.addEventListener("mousemove",move)return()=>{document.removeEventListener('mousemove',move)}},[])return state
}
function App(){const mouse = useMouse()return (<div>hello App,{mouse.pageX},{mouse.pageY}</div>)
}export default App

第三方Hooks库:ahooks,react-use...

 安装ahooks:

npm i ahooks

ahooks中的:

import { useMouse } from "ahooks"function App(){const mouse = useMouse()return (<div>hello App,{mouse.pageX},{mouse.pageY}</div>)
}export default App

这个clientX和clientY是针对可视区的

ahooks处理Ajax请求

useRequest是一个强大的异步数据管理的Hooks,React项目中的网络请求场景使用useRequest就够了

ahooks官方:nullhttps://ahooks.js.org/zh-CN/

import {useRequest} from 'ahooks'
import axios from 'axios'async function getData(){const res = await axios.get('./cartData.json')return res.data.list
}function App(){const {data,error,loading} = useRequest(getData)if(error){return <div>{error.message}</div>}if(loading){return <div>loading...</div>}return(<div>hello App<ul>{data.map((item)=> <li key={item.id}>{item.name}</li> )}</ul></div>)
}export default App

 使用异步函数,获取数据,然后进行解构赋值

先加载再显示出数据

再改成点击之后加载后出数据:

import {useRequest} from 'ahooks'
import axios from 'axios'
import { useState } from 'react'async function getData(){const res = await axios.get('./cartData.json')return res.data.list
}function App(){const [data,setData] = useState([])const {run,error,loading} = useRequest(getData,{manual:true,onSuccess(ret){setData(ret)}})if(error){return <div>{error.message}</div>}if(loading){return <div>loading...</div>}return(<div>hello App<button onClick={()=>run()}>点击</button><ul>{data.map((item)=> <li key={item.id}>{item.name}</li> )}</ul></div>)
}export default App

也可以用mutate方法去修改data

有了useRequest之后会帮我们清理上次ajax的行为

import { reject } from "lodash";
import React, { useState } from "react";
import {useRequest} from 'ahooks'function fetchChat(title){const delay = title === '情感聊天室' ? 2000 : 200return new Promise((resolve,reject)=>{setTimeout(()=>{resolve([{id:1,text:title+'1'},{id:2,text:title+'2'},{id:3,text:title+'3'},])},delay)})
}function Chat({title}){const {data,error,loading} = useRequest(()=>fetchChat(title),{refreshDeps:[title]})if(error){return <div>{error.message}</div>}if(loading){return <div>loading...</div>}return (<div>hello Chat<ul>{data.map((item)=> <li key={item.id}>{item.text}</li> )}</ul></div>)
}function App(){const [show,setShow] = useState(true)const [title,setTitle] = useState('情感聊天室')const handleClick =()=>{setShow(false)}const handleChange=(e)=>{setTitle(e.target.value)}return(<div>hello App<button onClick={handleClick}>关闭聊天室</button><select value={title} onChange={handleChange}><option value="情感聊天室">情感聊天室</option><option value="游戏聊天室">游戏聊天室</option></select>{ show && < Chat title={title}/> }</div>)
}export default App

 这样修改完之后不论怎么加载都是正确的

ahooks处理请求的高级用法

useRequest的功能非常强大:轮询,Loading Delay,Ready,聚焦,防抖,节流。。。

refreshOnWindowFocus: true 是 ahooks 库中 useRequest 这个自定义 Hook 的一个配置项,它的主要作用是当浏览器窗口重新获得焦点时,自动重新发起数据请求以更新数据。

错误重试 - ahooks 3.0https://ahooks.js.org/zh-CN/hooks/use-request/retry主要的使用还是查文档

 

import { useRequest } from 'ahooks'
import axios from 'axios'
import { useState } from 'react'async function getData() {const res = await axios.get('./cartData.json')return res.data.list.sort(() => Math.random() - 0.5)
}function App() {const { data, error, loading } = useRequest(getData,{// pollingInterval:3000// loadingDelay:1000refreshOnWindowFocus:true,})if (error) {return <div>{error.message}</div>}if (loading) {return <div>loading...</div>}return (<div>hello App<ul>{data && data.map((item) => <li key={item.id}>{item.name}</li>)}</ul></div>)
}export default App

ahooks处理业务场景

useAntdTable,useInfiniteScroll,useHistoryTravel...

import React from 'react';
import { useDynamicList } from "ahooks";
import { MinusCircleOutlined, PlusCircleOutlined } from '@ant-design/icons';function App() {const { list, remove, insert, replace } = useDynamicList(['David', 'Jack']);return (<div>hello App<br />{list.map((item, index) => {return (<div key={index}><inputtype="text"value={item}onChange={(e) => replace(index, e.target.value)}/><MinusCircleOutlined onClick={() => remove(index)} />{/* 修正为调用 insert 方法 */}<PlusCircleOutlined onClick={() => insert(index + 1, '')} /></div>);})}<br /><ul>{list.map((item, index) => <li key={index}>{item}</li>)}</ul></div>);
}export default App;

ahooks处理State钩子

可以借助钩子:useSetState,useGetState,useResetState...

useMount,useUnmount。。。

初始化和卸载的钩子

这个是管理class组件的钩子

import { useBoolean } from "ahooks";function App(){const [state,{toggle,setTrue,setFalse}]= useBoolean(true)return (<div>hello App<br /><button onClick={toggle}>toggle</button><button onClick={setTrue}>setTrue</button><button onClick={toggle}>setFalse</button><br />{state + ''}</div>)
}export default App

这样之后可以点击按钮变成正确或者错误,以及可以切换状态捏

还有一个钩子,和上面的那个用法差不多

useToggle针对的值比较多

这个是加到了本地存储之中

还有比如说useDebounce,useThrottle等防抖节流等钩子

usePrevious的钩子可以用于记录上一次记录的值

防抖(Debounce)

概念

防抖是指在一定时间内,只有最后一次触发事件才会执行相应的函数。如果在这个时间间隔内又触发了该事件,则会重新计时。常用于搜索框输入联想、窗口大小改变等场景,避免在用户输入过程中或窗口频繁改变时频繁触发函数。

实现原理

实现防抖的关键在于使用定时器。当事件触发时,清除之前的定时器并重新设置一个新的定时器,只有当定时器计时结束且期间没有再次触发事件时,才执行函数。

节流(Throttle)

概念

节流是指在一定时间内,只执行一次函数。即使在这段时间内多次触发事件,也只会在规定的时间间隔内执行一次。常用于滚动加载、按钮点击等场景,避免在短时间内频繁触发函数导致性能问题。

实现原理

实现节流的方法有两种:时间戳版和定时器版。时间戳版是通过记录上一次执行函数的时间戳,与当前时间比较,判断是否达到规定的时间间隔;定时器版是在定时器计时结束后执行函数,期间再次触发事件不会重新计时。

useResetState是恢复初始值

ahooks处理Effect钩子

useUpdateEffect,useAsyncEffect,useDebounceEffect...

import { useUpdateEffect } from 'ahooks'
import { useState } from 'react'function App() {const [count, setCount] = useState(0)useUpdateEffect(() => {console.log('useUpdateEffect')})const handleClick = () => {setCount(count + 1)}return (<div>hello App<br /><button onClick={handleClick}>点击</button></div>)
}
export default App

ahooks处理DOM钩子

useFullscreen,useInViewport,useSize...

import { useEventTarget } from "ahooks";export default()=>{const [value,{reset,onChange}] = useEventTarget({initialValue:'this is initial value'})return (<div><input value={value}  onChange = {onChange}style={{width:200,marginRight:20}}/><br />{value}<br /><button type="button" onClick={reset}>reset</button></div>)
}

大多都是钩子的查文档使用方式,暂且就这样吧

相关文章:

UI组件库及antd

什么是UI组件库及antd安装 随着商业化的趋势&#xff0c;企业级产品中需求多且功能复杂&#xff0c;且变动和并发频繁&#xff0c;常常需要设计者与开发者快速做出响应&#xff0c;同时这类产品中有很多类似的页面及组件&#xff0c;可以通过抽象得到一些稳定且高复用性的内容…...

Windows下使用ShiftMediaProject方法编译FFmpeg

Windows SDK 8.1版本不支持dxva vp9! 需要10.0.17134.0&#xff01;或者把config编译选项去掉 1.下载源码 https://github.com/ShiftMediaProject 2.创建ShiftMediaProject文件夹 把下载好的源码放入source 3.进入SMP执行 project_get_dependencies.bat 自动下载ffmepg依赖项…...

【计算机网络入门】TCP拥塞控制

目录 1. TCP拥塞控制和TCP流量控制的区别 2. 检测到拥塞该怎么办 2.1 如何判断网络拥塞&#xff1f; 3. 慢开始算法 拥塞避免算法 4.快重传事件->快恢复算法 5. 总结 1. TCP拥塞控制和TCP流量控制的区别 TCP流量控制是控制端对端的数据发送量。是局部的概念。 TCP拥…...

无人机遥控器无线传输技术解析!

一、主流无线传输方式 无线电遥控系统&#xff08;2.4GHz/5.8GHz频段&#xff09; 频段特性&#xff1a;2.4GHz频段穿透力强、覆盖距离远&#xff08;可达2公里以上&#xff09;&#xff0c;适合控制信号传输&#xff1b;5.8GHz频段带宽更高&#xff0c;适用于高清视频流&…...

修改hosts文件,修改安全属性,建立自己的DNS

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…...

MySQL零基础教程16—表连接进阶

复习表别名 之前已经学习过&#xff0c;查询的时候可以使用as来对检索的列进行重命名&#xff0c;这样可以让sql更加简介&#xff0c;增强易读性&#xff08;as可以省略&#xff09; 此外&#xff0c;使用表别名还可以支持在一条select语句中&#xff0c;一个表是被多次使用 …...

【软件系统架构】系列三:数据库系统之三

1.数据故障与备份 1.1 安全措施 措施说明用户标识和鉴定最外层的安全保护措施&#xff0c;可以使用用户帐户、口令及随机数检验等方式存取控制对用户进行授权&#xff0c;包括操作类型&#xff08;如查找、插入、删除、修改等动作&#xff09;和数据对象&#xff08;主要是数…...

lamp平台介绍

一、lamp介绍 网站&#xff1a; 静态 动态 php语言 .php 作用&#xff1a;运行php语言编写动态网站应用 lamp Linux Apache MySQL PHP PHP是作为httpd的一个功能模块存在的 二、部署lamp平台 1、测试httpd是否可正常返回PHP的响应 2、测试PHP代码是否可正常连接数据…...

826考研

初试总分第一的hh佬小红书&#xff1a;https://www.xiaohongshu.com/user/profile/64e106aa000000000100fe33 深研院巨佬经验贴&#xff1a;https://zhuanlan.zhihu.com/p/690464528 本部羊神经验贴&#xff1a;https://zhuanlan.zhihu.com/p/689494655 本部学硕佬经验贴&#…...

局域网自动识别机器名和MAC并生成文件的命令

更新版本&#xff1a;添加了MAC 地址 确定了设备唯一性 V1.1 局域网自动识别机器名和MAC并生成文件的批处理命令 echo off setlocal enabledelayedexpansionREM 设置输出文件 set outputFilenetwork_info.txtREM 清空或创建输出文件 echo Scanning network from 192.168.20.1…...

todo: 使用融云imserve做登录(android)

使用融云做登录注册思路 注册界面需要name, email, password考虑到融云注册用户的post格式 POST http://api.rong-api.com/user/getToken.json?userId1690544550qqcom&nameIronman这里的userId可以使用用户的email&#xff0c;但是要截断和 . 符号&#xff0c;即1690544…...

Mac OS升级后变慢了,如何恢复老系统?

我的一台Mac Air闲置很久了&#xff0c;原因是某次系统升级后用着会卡&#xff0c;有差不多10年没用了。今天想试着恢复一下出厂系统&#xff0c;目前看这条路可以走通。记录如下&#xff1a; 1、去哪里下载旧版系统&#xff1f; https://support.apple.com/zh-cn/102662 2、…...

cursor使用经验分享(java后端服务开发向)

前言 cursor是一款基于vscode&#xff0c;并集成AI能力的代码编辑器&#xff0c;其功能包括但不限于代码生成及补全、AI对话&#xff08;能够直接将代码环境作为上下文&#xff09;、即时应用建议等等&#xff0c;是一款面向未来的代码编辑器。 对于vscode&#xff0c;最先想…...

初次使用 IDE 搭配 Lombok 注解的配置

前言 在 Java 开发的漫漫征程中&#xff0c;我们总会遇到各种提升效率的工具。Lombok 便是其中一款能让代码编写变得更加简洁高效的神奇库。它通过注解的方式&#xff0c;巧妙地在编译阶段为我们生成那些繁琐的样板代码&#xff0c;比如 getter、setter、构造函数等。然而&…...

vue 安装依赖npm install过程中报错npm ERR! cb() never called!

解决办法&#xff1a; 步骤 1&#xff1a;清理 npm 缓存 npm cache clean --force rm -rf node_modules package-lock.json 步骤 2&#xff1a;一个第三方 npm 工具包&#xff0c;功能是 自动重试失败的 npm install 操作&#xff0c;适用于网络不稳定或依赖源不可靠的场景 …...

android接入rocketmq

一 前言 RocketMQ 作为一个功能强大的消息队列系统&#xff0c;不仅支持基本的消息发布与订阅&#xff0c;还提供了顺序消息、延时消息、事务消息等高级功能&#xff0c;适应了复杂的分布式系统需求。其高可用性架构、多副本机制、完善的运维管理工具&#xff0c;以及安全控制…...

libilibi项目优化(1)使用Redis实现缓存

第一版 获取视频信息使用旁路缓存 当视频信息存在缓存中时&#xff08;命中&#xff09;&#xff0c;直接从缓存中获取。不存在缓存中时&#xff0c;先从数据库中查出对应的信息&#xff0c;写入缓存后再放回数据。 //获取视频详细信息RequestMapping("/getVideoInfo&q…...

The Rust Programming Language 学习 (二)

通用编程概念 变量和可变性 默认情况下变量是不可变的&#xff08;immutable&#xff09;,不过你也可以选择让变量是可变的&#xff08;mutable&#xff09;. 变量的遮蔽 你可以声明和前面变量具有相同名称的新变量,说这个是第一个变量被第二个变量遮蔽&#xff08;shadow&…...

http链接转成https的链接的几种方法

以下是一个将HTTP链接转换为HTTPS的JavaScript函数&#xff0c;处理了多种常见输入情况&#xff1a; function convertToHttps(url) {if (typeof url ! string) return url;// 移除首尾空格并处理空字符串const trimmedUrl url.trim();if (!trimmedUrl) return https://;// 替…...

STM32——串口通信 UART

一、基础配置 Universal Asynchronous Receiver Transmitter 异步&#xff0c;串行&#xff0c;全双工 TTL电平 &#xff1a;高电平1 低电平0 帧格式&#xff1a; 起始位1bit 数据位8bit 校验位1bit 终止位1bit NVIC Settings一栏使能接受中断。 之前有设置LCD&#xff0c;…...

mybatis日期格式与字符串不匹配bug

异常特征&#xff1a;java.lang.IllegalArgumentException: invalid comparison: java.time.LocalDateTime and java.lang.String ### Error updating database. Cause: java.lang.IllegalArgumentException: invalid comparison: java.time.LocalDateTime and java.lang.Str…...

文献分享: ConstBERT固定数目向量编码文档

&#x1f602;图放这了&#xff0c;大道至简的 idea \text{idea} idea不愧是 ECIR \text{ECIR} ECIR &#x1f449;原论文 1. ConstBERT \textbf{1. ConstBERT} 1. ConstBERT的原理 1️⃣模型的改进点&#xff1a;相较于 ColBERT \text{ColBERT} ColBERT为每个 Token \text{Tok…...

学习记录-用例设计编写

黑马测试视频记录 目录 一、 软件测试流程 二、测试用例编写格式 1、等价类法 2、边界值分析法 3、 判定表法 4、场景法​编辑 5、错误推荐法 一、 软件测试流程 二、测试用例编写格式 1、等价类法 2、边界值分析法 3、 判定表法 4、场景法 5、错误推荐法 时间紧任务重…...

学习工具的一天之(burp)

第一呢一定是先下载 【Java环境】&#xff1a;Java Downloads | Oracle 下来是burp的下载 Download Burp Suite Community Edition - PortSwigger 【下载方法二】关注的一个博主 【BurpSuite 安装激活使用详细上手教程 web安全测试工具】https://www.bilibili.com/video/BV…...

el-tree右键节点动态位置展示菜单;el-tree的节点图片动态根据节点属性color改变背景色;加遮罩层(opacity)

一、el-tree右键节点动态位置展示菜单 关键:@node-contextmenu="handleRightClick"与@node-click=“handleNodeClick” <div class="content"><el-tabs class="tabs" @tab-click="handleClick" v-model="Modal"…...

K8s 1.27.1 实战系列(一)准备工作

一、主机规划与硬件要求 1、节点数量 至少需要 3 台服务器(1 台 Master 节点,2 台 Worker 节点)。本地测试可缩容:若仅用于测试,可缩减为 1 个 Master 和 1 个 Worker,但需注意稳定性风险。2、硬件配置 ​Master 节点:建议 2 核 CPU、8GB 内存、80GB 硬盘。​Worker 节…...

说一下SpringBoot3新特新和JDK17新特性

JDK1.8&#xff08;Java8&#xff09;新特性 stream流式编程 流处理 Stream API 提供了对集合数据进行操作的一种高效、简洁的方式。它支持顺序和并行的聚合操作 如&#xff1a;过滤&#xff08;filter&#xff09;、排序&#xff08;sort&#xff09;、映射&#xff08;map&…...

Linux系统服务安全检测手记

一&#xff1a;服务器ip暴露ip和端口的安全问题 服务器IP和端口暴露在外网中确实存在一定的安全风险&#xff0c;以下是几个主要的安全问题及相应的缓解措施&#xff1a; ### 主要安全问题 1. **直接攻击**&#xff1a; - 暴露的IP地址和开放的端口可能成为黑客直接攻击的…...

鸿蒙与DeepSeek深度整合:构建下一代智能操作系统生态

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 https://www.captainbed.cn/north 目录 技术融合背景与价值鸿蒙分布式架构解析DeepSeek技术体系剖析核心整合架构设计智能调度系统实现…...

[创业之路-329]:华为铁三角实施的步骤

一、通用过程 华为铁三角实施的步骤主要包括以下几个关键阶段&#xff1a; 1、明确角色与职责 确定铁三角成员&#xff1a;组建由客户经理&#xff08;AR&#xff09;、解决方案经理&#xff08;SR&#xff09;和交付经理&#xff08;FR&#xff09;组成的铁三角团队。制定岗…...