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

千峰React:Hooks(上)

什么是Hooks

ref引用值

普通变量的改变一般是不好触发函数组件的渲染的,如果想让一般的数据也可以得到状态的保存,可以使用ref

import { useState ,useRef} from 'react'function App() {const [count, setCount] = useState(0)let num = useRef(0)const handleClick = () => {setCount(count + 1)num.current++ //current,当前值console.log(num.current)}return (<div><button onClick={handleClick}>计数</button></div>)
}
export default App

那你就要问了:这和useState有什么区别?

更改时不会触发渲染,例如这里,我们注释掉setCount的语句:

import { useState ,useRef} from 'react'function App() {const [count, setCount] = useState(0)let num = useRef(0)const handleClick = () => {//  setCount(count + 1)num.current++ //current,当前值console.log(num.current)}return (<div><button onClick={handleClick}>计数</button>{count},{num.current}</div>)
}
export default App

可以看出,num的值变了,但是并没有渲染出来

所以我们一般不会把ref写在jsx的结构里,但是可以在渲染过程之外随意修改和更新current的值,不需要像useState一样使用里面的方法修改的值才有效

如果我们在里面开启定时器,在这里一秒触发一次,如果单击按钮,num的值一秒增加一次,如果点击按钮多次,就会同时开启多个定时器,数值就会涨的飞快

import { set } from 'lodash'
import { useState ,useRef} from 'react'function App() {const [count, setCount] = useState(0)let timer=nulllet num = useRef(0)const handleClick = () => {setCount(count + 1)setInterval(() => {console.log(123)}, 1000);}return (<div><button onClick={handleClick}>计数</button>{count},{num.current}</div>)
}
export default App

一般的解决办法是每次新开一个定时器,就关掉旧定时器

import { set } from 'lodash'
import { useState ,useRef} from 'react'function App() {const [count, setCount] = useState(0)let timer=nullconst handleClick = () => {clearInterval(timer)timer=setInterval(() => {console.log(123)}, 1000);}return (<div><button onClick={handleClick}>计数</button>{count}</div>)
}
export default App

但是如果对整个函数重新调用(也就是启用useState)就无法销毁定时器了

因为整个函数重新调用,定时器是在上一次调用产生的,这一次删不掉上一次的定时器,作用域不同

import { set } from 'lodash'
import { useState ,useRef} from 'react'function App() {const [count, setCount] = useState(0)let timer=nullconst handleClick = () => {setCount(count + 1)clearInterval(timer)timer=setInterval(() => {console.log(123)}, 1000);}return (<div><button onClick={handleClick}>计数</button>{count}</div>)
}
export default App

这时候就需要对timer做记忆,也就是使用ref,就算走了多次渲染函数,也可以销毁

import { set } from 'lodash'
import { useState, useRef } from 'react'function App() {const [count, setCount] = useState(0)let timer = useRef(null)const handleClick = () => {setCount(count + 1)clearInterval(timer.current)timer.current = setInterval(() => {console.log(123)}, 1000)}return (<div><button onClick={handleClick}>计数</button>{count}</div>)
}
export default App

试了试,如果timer放全局定义是可以的,但是感觉这样不利于函数的封装性

import { useState, useRef } from 'react'let timer = null
function App() {const [count, setCount] = useState(0)const handleClick = () => {setCount(count + 1)clearInterval(timer)timer = setInterval(() => {console.log(123)}, 1000)}return (<div><button onClick={handleClick}>计数</button>{count}</div>)
}
export default App

通过ref操作原生dom

react里可以使用js的方法操作dom,例如什么querySelector这种css选择器,但是更推荐我们使用React的方法操作dom

import { set } from 'lodash'
import { useState, useRef } from 'react'function App() {const myRef = useRef(null)const handleClick = () => {//通过ref操作原生domconsole.log(myRef.current.innerHTML)myRef.current.style.background = 'red'}return (<div><button onClick={handleClick}>计数</button><div ref={myRef}>hello React</div></div>)
}
export default App

这么写是会报错的,钩子是按顺序使用的,在循环里这么写会报错,所以这么写不符合规范;而且也不建议把const myRef=useRef(null)写在结构里

import { set } from 'lodash'
import { useState, useRef } from 'react'function App() {const list = [{ id: 1, text: 'aaa' },{ id: 2, text: 'bbb' },{ id: 3, text: 'ccc' },]const handleClick = () => {//通过ref操作原生domconsole.log(myRef.current.innerHTML)myRef.current.style.background = 'red'}return (<div>{list.map((item) => {const myRef = useRef(null)return <li key={item.id} ref={myRef}>{item.text}</li>})}</div>)
}export default App

在循环操作里ref可以使用回调函数的写法:

import { useState, useRef } from 'react'function App() {const list = [{ id: 1, text: 'aaa' },{ id: 2, text: 'bbb' },{ id: 3, text: 'ccc' },]return (<div><ul>{list.map((item) => {return (<likey={item.id}ref={(myRef) => {myRef.style.background = 'red'}}>{item.text}</li>)})}</ul></div>)
}export default App

但是我报了很多错,说是

其实就算style在卸载的时候为空,加个逻辑判断就好了

铭记励志轩

import { useState, useRef } from 'react'function App() {const list = [{ id: 1, text: 'aaa' },{ id: 2, text: 'bbb' },{ id: 3, text: 'ccc' },]return (<div><ul>{list.map((item) => {return (<likey={item.id}ref={(myRef) => {if (myRef) {myRef.style.background = 'red'}}}>{item.text}</li>)})}</ul></div>)
}export default App

组件设置ref需要forwardRef进行转发

forwardRef 是 React 提供的一个高阶函数,用于将 ref 从父组件传递到子组件中的 DOM 元素或组件实例。它主要用于解决在函数组件中直接使用 ref 时无法访问子组件内部 DOM 元素的问题。

在 MyInput 组件中,ref 被绑定到 <input> 元素,也就是把ref转发到内部的input身上,然后=在 handleClick 函数中,ref.current 用于直接操作 <input> 元素:

import {  useRef ,forwardRef} from 'react'const MyInput = forwardRef(function MyInput(props, ref) {return (<input type='text' ref={ref}></input>
)
})function App() {const ref = useRef(null)const handleClick = () => {ref.current.focus()ref.current.style.background='red'}return (<div><button onClick={handleClick}>点我</button><MyInput ref={ref} /></div>)
}export default App

useImperativeHandle自定义ref

你想要它其中两个方法:focusscrollIntoView。为此,用单独额外的 ref 来指向真实的浏览器 DOM。然后使用 useImperativeHandle 来暴露一个句柄,它只返回你想要父组件去调用的方法

import {  useRef ,forwardRef,useImperativeHandle} from 'react'const MyInput = forwardRef(function MyInput(props, ref) {const inputRef=useRef(null)useImperativeHandle(ref,()=>{return{focus(){inputRef.current.focus()}}})return (<input type='text' ref={inputRef}></input>
)
})function App() {const ref = useRef(null)const handleClick = () => {
ref.current.focus()}return (<div><button onClick={handleClick}>点我</button><MyInput ref={ref} /></div>)
}export default App

点击按钮获取焦点

然后你就要问了(因为我也想问):这个获取焦点的操作为什么要写成这样?

这样会更加灵活,不用完全写在dom里,可以把你想要写的功能放在useImperativeHandle的第二个参数里,也就是里面的回调函数,来实现你自己的功能、自定义的功能

相当于你自己写了一个组件,可以像普通的组件使用,在里面添加属性和属性值,你也可以写自己的组件实现的功能

例如这个button的属性是他自己自带的,我们写的组件也可以写一些自己带的属性,focusscrollIntoView就是这个作用

 <button onClick={handleClick}>点我</button>

比如我们再添加一个获取焦点以后背景变红色的功能:


import {  useRef ,forwardRef,useImperativeHandle} from 'react'const MyInput = forwardRef(function MyInput(props, ref) {const inputRef=useRef(null)useImperativeHandle(ref, () => {return {focus() {inputRef.current.focus()},focusAndStyle() {inputRef.current.focus()inputRef.current.style.background = 'red'}}})return (<input type='text' ref={inputRef}></input>
)
})function App() {const ref = useRef(null)const handleClick = () => {if (ref) {ref.current.focusAndStyle()}}return (<div><button onClick={handleClick}>点我</button><MyInput ref={ref} /></div>)
}export default App

纯函数如何处理副作用

纯函数之前提过,只关注输入和输出、两次执行函数是否结果一样axios

上面图的意思是:组件是纯函数,但是有时候组件不得不写一些违背纯函数的功能,例如Ajax调用、还有我们用ref操作dom等都是副作用

事件本身可以去除副作用

import { useRef, forwardRef, useImperativeHandle } from 'react'function App() {const ref = useRef(null)//副作用,不符合纯函数的规范//        setTimeout(() => {//     ref.current.focus()// },1000)//副作用,但是符合纯函数的规范,因为事件可以处理副作用const handleClick = () => {ref.current.focus()}return (<div><button onClick={handleClick}>点击</button><input type='text' ref={ref} /></div>)
}export default App

但不是所有的副作用都可以用事件去除,而且有时候需要初始化副作用

所以在react里时间操作可以处理副作用,比如useEffect钩子

import { useRef, forwardRef, useImperativeHandle, useEffect } from 'react'function App() {const ref = useRef(null)//副作用,不符合纯函数的规范//        setTimeout(() => {//     ref.current.focus()// },1000)//副作用,但是符合纯函数的规范,因为事件可以处理副作用//   const handleClick = () => {//     ref.current.focus()//   }//可以在初始的时候进行副作用操作//useEffect触发的时机是jsx渲染后触发的,这样就会消除副作用的影响useEffect(() => {if (ref) {ref.current.focus()}})return (<div><button onClick={handleClick}>点我</button><input type='text' ref={ref} /></div>)
}export default App

一刷新就自动获取焦点

初次渲染和更新渲染,都会触发useEffect(),因为每次渲染jsx以后,会触发useEffect(),整个当前函数组件作用域的最后时机触发的

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

执行顺序:

组件首次渲染(调用 useState(0),初始化 count 为 0,渲染组件返回jsx)->点击按钮(触发handleClick函数调用useCount)->重新渲染组件->执行useEffect中的副作用函数

useEffect的依赖项使用

一个组件里可能有多个副作用,原则上来说多个副作用可以放在同一个useEffect里,但是比较杂

可以使用useEffect的依赖项进行拆解,因为useEffect本身就是个函数

我们可以使用多个useEffect来控制副作用

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

两个根一个一样,也可以正常的更新、渲染

但是有时候根据不同的应用场景,有些副作用需要重新触发,有的不需要,可以指定哪些可以触发、哪些不可以。

添加useEffect的依赖项目


import {useState,useEffect} from 'react'function App() {const [count, setCount] = useState(0) const [msg, setMsg] = useState('hello React')useEffect(() => {console.log(msg)},[msg])useEffect(() => {console.log(count)},[count])//这就是依赖项const handleClick = () => {setCount(count + 1)}return (<div><button onClick={handleClick}>点我</button></div>)
}
export default App

初始都触发,更新以后,只有对应依赖项发生改变时才触发,像这里msg没改变所以不触发

内部是怎么判别有没有发生变化的?是通过Object.is()方法来判定是否改变

像这样,依赖项是静态的空数组,只有初始会触发,以后发生改变都不会渲染他

不过尽量不要这么写,尽量还是要把里面用到的状态写在依赖项里

除了状态变量,还有props、计算变量等也可以写在依赖项里

计算变量:是指通过其他变量或数据动态计算得出的值,而不是直接存储的静态值。计算变量通常用于根据某些条件或逻辑动态生成数据,而不是手动维护这些数据。

函数也可以做依赖项

函数也可能成为计算变量,所以也可以作为依赖项

但是会出现一个问题,Object.is()方法在判别函数的时候会看引用类型的地址,两个函数是两个函数,内存地址不一样Object.is()就会判别为false

useCallBack可以修复这个问题,可以缓存函数,一般用于组件性能优化,其他情况不推荐使用,这里先不细说

最好的解决办法是把函数定义在useEffect内部

import {useState,useEffect} from 'react'function App() {const [count, setCount] = useState(0) useEffect(() => {const foo = () => {console.log(count)}foo()},[count])//这就是依赖项return (<div></div>)
}
export default App

useEffect清理操作

先写一个简易的关闭聊天室的功能


import {useState,useEffect} from 'react'function Chat() {return (<div>我是聊天室</div>)
}function App() {const [show,setShow] = useState(true)const handleClick = () => {setShow(false)}return (<div><button onClick={handleClick}>点我关闭聊天室</button>{show&&<Chat/>}</div>)
}
export default App

useEffect可以在卸载组件的时候清理

import {useState,useEffect} from 'react'function Chat() {useEffect(() => { console.log('进入聊天室')//useEffect返回一个函数,这个函数会在组件卸载的时候执行return () => {console.log('离开聊天室')}})return (<div>我是聊天室</div>)
}function App() {const [show,setShow] = useState(true)const handleClick = () => {setShow(false)}return (<div><button onClick={handleClick}>点我关闭聊天室</button>{show&&<Chat/>}</div>)
}
export default App

增加了useEffect更新时的清理功能,清理功能是整个作用域的结束,而不是下一次作用域的开始

import {useState,useEffect} from 'react'function Chat({title}) {useEffect(() => { console.log('进入',title)//useEffect返回一个函数,这个函数会在组件卸载的时候执行return () => {console.log('离开',title)}},[title])return (<div>我是课堂</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><button onClick={handleClick}>点我退出课堂</button><select value={title} onChange={handleChange}><option value="电磁场与电磁波">电磁场与电磁波</option><option value="半导体物理">半导体物理</option></select>{show && <Chat title={title} />}</div>)
}
export default App

清理功能是很常见的需求,如果注释掉清理的代码就会变成这样:

没有退出只有进入,如果是严格模式其实会把函数执行两边,可以看到👇

实际上是违背正常逻辑的,如果加上清理功能,在严格模式执行的现象应该是

也就是说严格模式也可以起到提醒你需要自检的作用

再举一个栗子,如果我们要切换不同的课程,切换不同的课程耗时不同

import {useState,useEffect} from 'react'function fetchChat(title) {const delay = title==='电磁场与电磁波'?2000:1000return 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 [list,setList]=useState([])useEffect(() => { fetchChat(title).then((data) => {setList(data)
})return () => {}},[title])return (<div>{list.map((item)=>{return <li key={item.id}>{ item.text}</li>})}</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><button onClick={handleClick}>点我退出课堂</button><select value={title} onChange={handleChange}><option value="电磁场与电磁波">电磁场与电磁波</option><option value="半导体物理">半导体物理</option></select>{show && <Chat title={title} />}</div>)
}
export default App

如果不添加useEffect,二者耗时不同,就会出现上一个还在加载,下一个作用域已经执行的问题

变成这样

加入清理,就可以解决问题

import {useState,useEffect} from 'react'function fetchChat(title) {const delay = title==='电磁场与电磁波'?2000:1000return 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 [list, setList] = useState([])useEffect(() => { let ignore = falsefetchChat(title).then((data) => {if (!ignore) {setList(data)//上一次没结束不能提前更新}
})return () => {ignore=true//做清理工作}},[title])return (<div>{list.map((item)=>{return <li key={item.id}>{ item.text}</li>})}</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><button onClick={handleClick}>点我退出课堂</button><select value={title} onChange={handleChange}><option value="电磁场与电磁波">电磁场与电磁波</option><option value="半导体物理">半导体物理</option></select>{show && <Chat title={title} />}</div>)
}
export default App

有很多人在遇到这样的异步操作时会用async和await,但是React不支持你这么写

你可以单独写一个async函数,然后把要执行的放进去:

import { useState, useEffect } from 'react';function fetchChat(title) {const delay = title === '电磁场与电磁波' ? 2000 : 1000;return 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 [list, setList] = useState([]);useEffect(() => {let ignore = false;const fetchData = async () => {const data = await fetchChat(title);if (!ignore) {setList(data); // 上一次没结束不能提前更新}};fetchData();return () => {ignore = true; // 做清理工作};}, [title]);return (<div>{list.map((item) => (<li key={item.id}>{item.text}</li>))}</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><button onClick={handleClick}>点我退出课堂</button><select value={title} onChange={handleChange}><option value="电磁场与电磁波">电磁场与电磁波</option><option value="半导体物理">半导体物理</option></select>{show && <Chat title={title} />}</div>);
}export default App;

useEffectEvent

实验性版本提供的钩子

如果你的状态变量有多个,只想执行一个可以用实验版本的useEffectEvent

介于六月份同学说实验版本也用不了,所以不讲了

相关文章:

千峰React:Hooks(上)

什么是Hooks ref引用值 普通变量的改变一般是不好触发函数组件的渲染的&#xff0c;如果想让一般的数据也可以得到状态的保存&#xff0c;可以使用ref import { useState ,useRef} from reactfunction App() {const [count, setCount] useState(0)let num useRef(0)const h…...

salesforce 为什么无法关闭task,显示:insufficient access rights on object id

在 Salesforce 中&#xff0c;如果你在尝试关闭任务&#xff08;Task&#xff09;时遇到 “Insufficient access rights on object id” 错误&#xff0c;通常是由于以下几种可能的权限问题导致的&#xff1a; 1. 任务的所有权问题 Salesforce 中的任务&#xff08;Task&…...

机器学习:强化学习的epsilon贪心算法

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是一种机器学习方法&#xff0c;旨在通过与环境交互&#xff0c;使智能体&#xff08;Agent&#xff09;学习如何采取最优行动&#xff0c;以最大化某种累积奖励。它与监督学习和无监督学习不同&#xff0c;强调试错…...

MongoDB—(一主、一从、一仲裁)副本集搭建

MongoDB集群介绍&#xff1a; MongoDB 副本集是由多个MongoDB实例组成的集群&#xff0c;其中包含一个主节点&#xff08;Primary&#xff09;和多个从节点&#xff08;Secondary&#xff09;&#xff0c;用于提供数据冗余和高可用性。以下是搭建 MongoDB 副本集的详细步骤&am…...

MyBatis TypeHandler 详解与实战:FastJson 实现字符串转 List

在 MyBatis 中&#xff0c;TypeHandler 是实现 Java 类型与数据库类型双向转换 的核心组件。无论是处理基础数据类型还是复杂的 JSON、枚举或自定义对象&#xff0c;它都能通过灵活的扩展机制满足开发需求。本文将通过一个 将数据库 JSON 字符串转换为 List<User> 的案例…...

第二十八:5.5.【storeToRefs】5.6.【getters】

LoveTalk.vue: 调用&#xff1a; // 方法 const talkStore useTalkStore() function getLoveTalk(){ talkStore.getATalk() } 如果是要简短的形式调用&#xff1a; const talkStore useTalkStore() // user hooks 的形式调用 const {schoole,local} talkStore // …...

APISIX Dashboard上的配置操作

文章目录 登录配置路由配置消费者创建后端服务项目配置上游再创建一个路由测试 登录 http://192.168.10.101:9000/user/login?redirect%2Fdashboard 根据docker 容器里的指定端口&#xff1a; 配置路由 通过apisix 的API管理接口来创建&#xff08;此路由&#xff0c;直接…...

MinIO在 Docker中修改登录账号和密码

MinIO在 Docker中修改登录账号和密码 随着云计算和大数据技术的快速发展&#xff0c;对象存储服务逐渐成为企业数据管理的重要组成部分。MinIO 作为一种高性能、分布式的对象存储系统&#xff0c;因其简单易用、高效可靠的特点而备受开发者青睐。然而&#xff0c;在实际应用中…...

英文论文查重,Turnitin和IThenticate两个系统哪个更合适?

Turnitin系统和IThenticate系统都是检测英文论文的查重系统&#xff0c;但是两者之间还是有一些不一样的。 下面针对这两个系统给大家具体分析一下。 一、Turnitin系统 Turnitin检测系统&#xff1a; https://truth-turnitin.similarity-check.com Turnitin是世界上主流的…...

pnpm的基本用法

以下是 pnpm 的核心命令和使用指南&#xff0c;涵盖从安装依赖到项目管理的常见操作&#xff1a; 1. 基础命令 (1) 安装依赖 pnpm install # 安装 package.json 中的所有依赖 pnpm install <包名> # 安装指定包&#xff08;自动添加到 dependencies&#xf…...

【实战中提升自己】防火墙篇之双ISP切换与VRRP切换对于用户的体验

! 拓扑与说明 某公司的网络架构&#xff0c;这样的架构在目前的网络中是在常见的&#xff0c;假设您接收一个这样的网络&#xff0c;应该如何部署&#xff0c;该实战系列&#xff0c;就是一步一步讲解&#xff0c;如何规划、设计、部署这样一个环境&#xff0c;这…...

Go在1.22版本修复for循环陷阱

记录 前段时间升级Go版本碰到一个大坑&#xff0c;先记录。 先上代码案例&#xff1a; func main() {testClosure() }func testClosure() {for i : 0; i < 5; i {defer func() {fmt.Println(i)}()} }在1.22之下&#xff08;不包括1.22&#xff09;版本&#xff1a; 输出的…...

Nginx+PHP+MYSQL-Ubuntu在线安装

在 Ubuntu 上配置 Nginx、PHP 和 MySQL 的步骤如下&#xff1a; 1. 更新系统包 首先&#xff0c;确保系统包是最新的&#xff1a; sudo apt update sudo apt upgrade2. 安装 Nginx 安装 Nginx&#xff1a; sudo apt install nginx启动并启用 Nginx 服务&#xff1a; sudo…...

SpringDataJPA使用deleteAllInBatch方法逻辑删除失效

概述 在使用Spring Boot JPA时&#xff0c;执行批量删除操作时&#xff0c;遇到逻辑删除失效的问题。具体而言&#xff0c;当使用deleteAllInBatch方法时&#xff0c;数据会被物理删除&#xff0c;而不是进行逻辑删除&#xff1b;但是当使用deleteAll时&#xff0c;逻辑删除操…...

DOM Node

DOM Node 引言 在Web开发中,DOM(Document Object Model)节点是构建网页和交互式应用程序的核心。DOM节点是文档的构建块,可以用来表示HTML和XML文档中的任何部分。本文将详细介绍DOM节点的基本概念、类型、操作方法以及在实际开发中的应用。 什么是DOM节点? DOM节点是…...

基于STM32的智能家居能源管理系统

1. 引言 传统家庭能源管理存在能耗监控粗放、设备联动不足等问题&#xff0c;难以适应绿色低碳发展需求。本文设计了一款基于STM32的智能家居能源管理系统&#xff0c;通过多源能耗监测、负荷预测与优化调度技术&#xff0c;实现家庭能源的精细化管理与智能优化&#xff0c;提…...

智慧园区后勤单位消防安全管理:安全运营和安全巡检

//智慧园区消防管理困境大曝光 智慧园区&#xff0c;听起来高大上&#xff0c;但消防管理却让人头疼不已。各消防子系统各自为政&#xff0c;像一座座孤岛&#xff0c;信息不共享、不协同。 消防设施管理分散&#xff0c;不同区域、企业的设备标准不一样&#xff0c;维护情况…...

HTML 日常开发常用标签

文章目录 HTML 日常开发常用标签1、基本结构标签2、内容标签3、多媒体标签4、表单标签5、列表和定义标签6、表格标签7、链接和图像8、元数据9、语义化标签&#xff08;HTML5新增&#xff09;10、框架和内联11、交互12、过时或不推荐使用的标签 HTML 日常开发常用标签 1、基本结…...

Spring事务失效六大场景

引言 Spring事务一般我们采用注解实现&#xff0c;但是我们构造事务实现的时候常常没察觉失效的情况&#xff0c;本篇文章总结事务失效的六大情况&#xff0c;帮助我们深刻理解事务失效的边界概念 1. 方法自调用 这个主要是针对声明式事务的&#xff0c;经过前面的介绍&…...

【缓冲区】数据库备份的衍生问题,缓冲区在哪里?JVMor操作系统?(二)

【缓冲区】数据库备份的衍生问题&#xff0c;缓冲区在哪里&#xff1f;JVMor操作系统&#xff1f;&#xff08;二 完结&#xff09; 缓冲区既属于操作系统&#xff0c;也属于 JVM&#xff0c;具体取决于你讨论的是哪个层面的缓冲区。下面我会详细解释这两者的区别和联系。 1. …...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下&#xff0c;风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...