三菱PLC程序解密加密怎么破解,【電;I7I54833762】登錄口令破解React Hooks 是 React 團(tuán)隊(duì)在兩年前的 16.8 版本推出的一套全新的機(jī)制。作為最主流的前端框架,React 的 API 十分穩(wěn)定,這次更新的發(fā)布,讓眾多恐懼新輪子的前端大佬們虎軀一震,畢竟每一次更新又是高成本的學(xué)習(xí),這玩意到底好使么?
答案是好用的,對(duì)于 React 的開(kāi)發(fā)者而言,只是多了一個(gè)選擇。過(guò)去的開(kāi)發(fā)方式是基于Class組件的,而hooks是基于函數(shù)組件,這意味著 這兩種開(kāi)發(fā)方式可以并存 ,而新的代碼可以根據(jù)具體情況采用 Hooks 的方式來(lái)實(shí)現(xiàn)就行了。這篇文章主要就來(lái)介紹一下 Hooks 的優(yōu)勢(shì) 和 常用的幾個(gè)鉤子函數(shù) 。
Hooks的優(yōu)勢(shì)
1.類組件的不足
代碼量多 :相較于函數(shù)組件的寫(xiě)法,使用類組件代碼量要略多一點(diǎn),這個(gè)是最直觀的感受。
this指向:類組件中總是需要考慮this的指向問(wèn)題,而函數(shù)組件則可以忽略。
趨向復(fù)雜難以維護(hù) :在高版本的React中,又更新了一些生命周期函數(shù),因?yàn)檫@些函數(shù)互相解耦,很容易造成分散不集中的寫(xiě)法,漏掉關(guān)鍵邏輯和多了冗余邏輯,導(dǎo)致后期debug困難。相反,hooks可以把關(guān)鍵邏輯都放在一起,不顯得那么割裂,調(diào)試起來(lái)也易懂一點(diǎn)。
狀態(tài)邏輯難復(fù)用 :在組件之間復(fù)用狀態(tài)邏輯很難,可能要用到 render props (渲染屬性)或者 HOC (高階組件),但無(wú)論是渲染屬性,還是高階組件,都會(huì)在原先的組件外包裹一層父容器(一般都是 div 元素),導(dǎo)致層級(jí)冗余。
2. Hooks帶來(lái)的好處
邏輯復(fù)用
在組件之前復(fù)用狀態(tài)邏輯,往往需要借助高階組件等復(fù)雜的設(shè)計(jì)模式,這些高級(jí)組件會(huì)產(chǎn)生冗余的組件節(jié)點(diǎn),讓調(diào)試變得困難,下面用一個(gè)demo來(lái)對(duì)比一下兩種實(shí)現(xiàn)方式。
Class
在class組件場(chǎng)景下,定義了一個(gè)高階組件,負(fù)責(zé)監(jiān)聽(tīng)窗口大小變化,并將變化后的值作為 props 傳給下一個(gè)組件。
const useWindowSize = Component => {
// 產(chǎn)生一個(gè)高階組件 HOC,只包含監(jiān)聽(tīng)窗口大小的邏輯
class HOC extends React.PureComponent {
constructor(props) {
super(props);
this.state = {
size: this.getSize()
};
}
componentDidMount() {
window.addEventListener("resize", this.handleResize);
}
componentWillUnmount() {
window.removeEventListener("resize", this.handleResize);
}
getSize() {
return window.innerWidth > 1000 ? "large" :"small";
}
handleResize = ()=> {
const currentSize = this.getSize();
this.setState({
size: this.getSize()
});
}
render() {
// 將窗口大小傳遞給真正的業(yè)務(wù)邏輯組件
return ;
}
}
return HOC;
};
復(fù)制代碼
接下來(lái)可以在自定義組件中可以調(diào)用 useWindowSize 這樣的函數(shù)來(lái)產(chǎn)生一個(gè)新組件,并自帶 size 屬性,例如:
class MyComponent extends React.Component{
render() {
const { size } = this.props;
if (size === "small") return ;
else return ;
}
}
// 使用 useWindowSize 產(chǎn)生高階組件,用于產(chǎn)生 size 屬性傳遞給真正的業(yè)務(wù)組件
export default useWindowSize(MyComponent);
復(fù)制代碼
下面看下Hooks的實(shí)現(xiàn)方式
Hooks
const getSize = () => {
return window.innerWidth > 1000 ? "large" : "small";
}
const useWindowSize = () => {
const [size, setSize] = useState(getSize());
useEffect(() => {
const handler = () => {
setSize(getSize())
};
window.addEventListener('resize', handler);
return () => {
window.removeEventListener('resize', handler);
};
}, []);
return size;
};
復(fù)制代碼
使用:
const Demo = () => {
const size = useWindowSize();
if (size === "small") return ;
else return ;
};
復(fù)制代碼
從上面的例子中通過(guò) Hooks 的方式對(duì)窗口大小進(jìn)行了封裝,從而將其變成一個(gè)可綁定的數(shù)據(jù)源。這樣當(dāng)窗口大小發(fā)生變化時(shí),使用這個(gè) Hook 的組件就都會(huì)重新渲染。而且代碼也更加簡(jiǎn)潔和直觀,不會(huì)產(chǎn)生額外的組件節(jié)點(diǎn),也不顯得那么冗余了。
業(yè)務(wù)代碼更加聚合
下面舉一個(gè)最常見(jiàn)的計(jì)時(shí)器的例子。
class
let timer = null
componentDidMount() {
timer = setInterval(() => {
// ...
}, 1000)
}
// ...
componentWillUnmount() {
if (timer) clearInterval(timer)
}
復(fù)制代碼
Hooks
useEffect(() => {
let timer = setInterval(() => {
// ...
}, 1000)
return () => {
if (timer) clearInterval(timer)
}
}, [//...])
復(fù)制代碼
Hooks的實(shí)現(xiàn)方式能讓代碼更加集中,邏輯也更清晰。
寫(xiě)法簡(jiǎn)潔
這個(gè)就不舉例了,可以從字面意思理解,使用函數(shù)組件確實(shí)能少些很多代碼,懂得都懂,嘻嘻~
幾個(gè)內(nèi)置Hooks的作用以及使用思考
useState :讓函數(shù)組件具有維持狀態(tài)的能力
const[count, setCount]=useState(0);
復(fù)制代碼
優(yōu)點(diǎn):
讓函數(shù)組件具有維持狀態(tài)的能力,即:在一個(gè)函數(shù)組件的多次渲染之間,這個(gè) state 是共享的。便于維護(hù)狀態(tài)。
缺點(diǎn):
一旦組件有自己狀態(tài),意味著組件如果重新創(chuàng)建,就需要有恢復(fù)狀態(tài)的過(guò)程,這通常會(huì)讓組件變得更復(fù)雜。
用法:
useState(initialState) 的參數(shù) initialState 是創(chuàng)建 state 的初始值。
它可以是任意類型,比如數(shù)字、對(duì)象、數(shù)組等等。
useState() 的返回值是一個(gè)有著兩個(gè)元素的數(shù)組。第一個(gè)數(shù)組元素用來(lái)讀取 state 的值,第二個(gè)則是用來(lái)設(shè)置這個(gè) state 的值。
在這里要注意的是,state 的變量(例子中的 count)是只讀的,所以我們必須通過(guò)第二個(gè)數(shù)組元素 setCount 來(lái)設(shè)置它的值。
如果要?jiǎng)?chuàng)建多個(gè) state ,那么我們就需要多次調(diào)用 useState。
什么樣的值應(yīng)該保存在 state 中?
通常來(lái)說(shuō),我們要遵循的一個(gè)原則就是:state 中不要保存可以通過(guò)計(jì)算得到的值 。
從 props 傳遞過(guò)來(lái)的值。有時(shí)候 props 傳遞過(guò)來(lái)的值無(wú)法直接使用,而是要通過(guò)一定的計(jì)算后再在 UI 上展示,比如說(shuō)排序。那么我們要做的就是每次用的時(shí)候,都重新排序一下,或者利用某些 cache 機(jī)制,而不是將結(jié)果直接放到 state 里。
從 URL 中讀到的值。比如有時(shí)需要讀取 URL 中的參數(shù),把它作為組件的一部分狀態(tài)。那么我們可以在每次需要用的時(shí)候從 URL 中讀取,而不是讀出來(lái)直接放到 state 里。
從 cookie、localStorage 中讀取的值。通常來(lái)說(shuō),也是每次要用的時(shí)候直接去讀取,而不是讀出來(lái)后放到 state 里。
useEffect:執(zhí)行副作用
useEffect(fn, deps);
useEffect ,顧名思義,用于執(zhí)行一段副作用。
什么是副作用?
通常來(lái)說(shuō),副作用是指一段和當(dāng)前執(zhí)行結(jié)果無(wú)關(guān)的代碼。比如說(shuō)要修改函數(shù)外部的某個(gè)變量,要發(fā)起一個(gè)請(qǐng)求,等等。
也就是說(shuō),在函數(shù)組件的當(dāng)次執(zhí)行過(guò)程中, useEffect 中代碼的執(zhí)行是不影響渲染出來(lái)的 UI 的。
對(duì)應(yīng)到 Class 組件,那么 useEffect 就涵蓋了 ComponentDidMount、componentDidUpdate 和 componentWillUnmount 三個(gè)生命周期方法。不過(guò)如果你習(xí)慣了使用 Class 組件,那千萬(wàn)不要按照把 useEffect 對(duì)應(yīng)到某個(gè)或者某幾個(gè)生命周期的方法。你只要記住,useEffect 是每次組件 render 完后判斷依賴并執(zhí)行就可以了。
審核編輯:符乾江
-
單片機(jī)
+關(guān)注
關(guān)注
6057文章
44811瀏覽量
644314 -
plc
+關(guān)注
關(guān)注
5028文章
13589瀏覽量
470569
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
淺談加密芯片的一種破解方法和對(duì)應(yīng)加密方案改進(jìn)設(shè)計(jì)
淺談加密芯片的一種破解方法和加密方案改進(jìn)設(shè)計(jì)
三菱PLC解密工具
三菱plc遠(yuǎn)程監(jiān)控網(wǎng)關(guān)是什么

評(píng)論