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