千峰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

介于六月份同學說實驗版本也用不了,所以不講了

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/72039.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/72039.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/72039.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Ubuntu20.04安裝Redis

1.切換到root用戶 如果沒有切換到root用戶的&#xff0c;切換到root用戶。 2.使用 apt install redis 安裝redis 遇到y/n直接y即可。 redis安裝好之后就自動啟動起來了&#xff0c;因此我們可以通過netstat -anp | grep redis命令來查看是否安裝成功。 6379是Redis的默認端…

鴻蒙-AVPlayer

compileVersion 5.0.2&#xff08;14&#xff09; 音頻播放 import media from ohos.multimedia.media; import common from ohos.app.ability.common; import { BusinessError } from ohos.base;Entry Component struct AudioPlayer {private avPlayer: media.AVPlayer | nu…

機器學習數學通關指南——泰勒公式

前言 本文隸屬于專欄《機器學習數學通關指南》&#xff0c;該專欄為筆者原創&#xff0c;引用請注明來源&#xff0c;不足和錯誤之處請在評論區幫忙指出&#xff0c;謝謝&#xff01; 本專欄目錄結構和參考文獻請見《機器學習數學通關指南》 正文 一句話總結 泰勒公式是用多…

游戲引擎學習第124天

倉庫:https://gitee.com/mrxiao_com/2d_game_3 回顧/復習 今天是繼續完善和調試多線程的任務隊列。之前的幾天&#xff0c;我們已經介紹了多線程的一些基礎知識&#xff0c;包括如何創建工作隊列以及如何在線程中處理任務。今天&#xff0c;重點是解決那些我們之前沒有注意到…

在MacOS上打造本地部署的大模型知識庫(一)

一、在MacOS上安裝Ollama docker run -d -p 3000:8080 --add-hosthost.docker.internal:host-gateway -v open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:main 最后停掉Docker的ollama&#xff0c;就能在webui中加載llama模…

(八)Java-Collection

一、Collection接口 1.特點 Collection實現子類可以存放多個元素&#xff0c;每個元素可以是Object&#xff1b; 有些Collection的實現類&#xff0c;可以存放重復的元素&#xff0c;有些不可以&#xff1b; 有些Collection的實現類&#xff0c;有些是有序的&#xff08;Li…

大模型RAG(檢索增強)創新--SELF-RAG

檢索增強生成 (RAG) 提供了一種將 ChatGPT/GPT-4 等大型語言模型與自定義數據集成的途徑&#xff0c;但存在局限性。讓我們看看 RAG 最近的研究是如何解決一些問題。 大語言模型(LLM)將改變整個金融領域。其中一個場景是大語言模型可以學習大量文檔&#xff0c;并在很短的時間內…

《AI和人工智能和編程日報》

OpenAI&#xff1a;將深度研究擴展到 ChatGPT Plus、Team、Edu 和 Enterprise 用戶&#xff0c;每月 10 次查詢&#xff1b;Pro 用戶每月有 120 次查詢&#xff0c;ChatGPT 語音模式向免費用戶開放。DeepSeek&#xff1a;R1 大模型宣布降價&#xff0c;調用價格將至四分之一&am…

【音視頻】編解碼相關概念總結

NALU RTP PS流 三者總體關系 NALU在RTP中的應用&#xff1a;視頻流的RTP傳輸通常將NALU作為基本的單元進行傳輸。每個RTP包攜帶一個或多個NALU&#xff0c;這些NALU包含了視頻編碼數據。RTP協議通過其頭部信息&#xff08;如時間戳、序列號等&#xff09;幫助接收端重新排列和…

端口映射/內網穿透方式及問題解決:warning: remote port forwarding failed for listen port

文章目錄 需求&#xff1a;A機器是內網機器&#xff0c;B機器是公網服務器&#xff0c;想要從公網&#xff0c;訪問A機器的端口方式&#xff1a;端口映射&#xff0c;內網穿透&#xff0c;使用ssh打洞端口&#xff1a;遇到問題&#xff1a;命令執行成功&#xff0c;但是端口轉發…

11特殊函數

一、遞歸函數 遞歸概念&#xff1a;如果一個函數內部&#xff0c;包含了對自身的調用&#xff0c;則該函數稱為遞歸函數。要點&#xff1a; 只有能被表達為遞歸的問題&#xff0c;才能用遞歸函數解決。遞歸函數必須有一個可直接退出的條件&#xff0c;否則會進入無限遞歸。遞歸…

如何使用useContext進行全局狀態管理?

在 React 中&#xff0c;使用 useContext 進行全局狀態管理是一種有效的方法&#xff0c;尤其在需要在多個組件之間共享狀態時。useContext 允許你在組件樹中傳遞數據&#xff0c;而無需通過每個組件的 props 逐層傳遞。以下是關于如何使用 useContext 進行全局狀態管理的詳細指…

鴻蒙 ArkUI 實現敲木魚小游戲

敲木魚是一款具有禪意的趣味小游戲&#xff0c;本文將通過鴻蒙 ArkUI 框架的實現代碼&#xff0c;逐步解析其核心技術點&#xff0c;包括動畫驅動、狀態管理、音效震動反饋等。 一、架構設計與工程搭建 1.1 項目結構解析 完整項目包含以下核心模塊&#xff1a; ├── entry…

神經性肺纖維的預防方法

神經性肺纖維的預防方法 一、引言 神經性肺纖維化是一種慢性進行性肺部疾病&#xff0c;其病因復雜&#xff0c;包括遺傳、環境等多種因素。該病不僅影響患者的呼吸功能&#xff0c;還可能對神經系統造成損害。因此&#xff0c;預防神經性肺纖維化顯得尤為重要。本文將詳細介…

azure sql 網絡安全組 網絡安全sql注入

&#x1f345; 點擊文末小卡片 &#xff0c;免費獲取網絡安全全套資料&#xff0c;資料在手&#xff0c;漲薪更快 SQL注入 1、原理 針對注入的攻擊行為可描述為通過用戶可控參數中注入SQL語法&#xff0c;破壞原有SQL結構&#xff0c;達到編寫程序意料之外結果的攻擊行為。 其…

【Day50 LeetCode】圖論問題 Ⅷ

一、圖論問題 Ⅷ 1、dijkstra算法 堆優化 采用堆來優化&#xff0c;適合節點多的稀疏圖。代碼如下&#xff1a; # include<iostream> # include<vector> # include<list> # include<queue> # include<climits>using namespace std;class myco…

利用node.js搭配express框架寫后端接口(一)

Node.js 憑借其高效的非阻塞 I/O 操作、事件驅動架構以及輕量級的特點&#xff0c;成為了開發高性能服務器應用的熱門選擇。Express 框架作為 Node.js 上最流行的 Web 應用框架之一&#xff0c;以其簡潔的 API 和豐富的中間件生態系統&#xff0c;極大地簡化了 Web 后端開發流程…

【小白數學】為什么可以用拉格朗日乘子法求函數的極值【二】

我們在上一篇【小白數學】- 為什么可以用拉格朗日乘子法求函數的極值【一】已經介紹了一種較為“嚴謹“的方法來說明為什么拉格朗日乘子法可以幫助我們求具有等式約束條件下的函數的極值。雖然在我們的例子中”等式約束“中只有一個等式。但其實很容易推廣到多個等式約束的情況…

JAVA面試_進階部分_netty面試題

1.BIO、NIO 和 AIO 的區別&#xff1f; BIO&#xff1a;一個連接一個線程&#xff0c;客戶端有連接請求時服務器端就需要啟動一個線程進行處理。線程開銷大。 偽異步 IO&#xff1a;將請求連接放入線程池&#xff0c;一對多&#xff0c;但線程還是很寶貴的資源。 NIO&#x…

考研出分24小時,人類精神狀態圖鑒

2月24日&#xff0c;上午10點起&#xff0c;各省考研初試成績陸續公布&#xff0c;考生們或緊張的輸入準考證號&#xff0c;或抱團等待“審判”。然而更魔幻的還在后頭——下午4點&#xff0c;教育部竟在同一天直接發布了《2025年研考國家分數線》。 不少網友表示&#xff1a;…