日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

React 函數組件不是有狀態嗎,為什么還要說他是純函數

來源: 責編: 時間:2024-05-08 09:19:08 140觀看
導讀許多人在學習 React 時會有這樣一個疑問,不斷看到 React 官方團隊言論,或者說各路大佬都是在說 React 是函數式編程,我們寫組件確實寫的是組件,但問題就在于,我們寫的組件是有內部狀態,這樣的函數就不是純函數了,這怎么能算

sbj28資訊網——每日最新資訊28at.com

許多人在學習 React 時會有這樣一個疑問,不斷看到 React 官方團隊言論,或者說各路大佬都是在說 React 是函數式編程,我們寫組件確實寫的是組件,但問題就在于,我們寫的組件是有內部狀態,這樣的函數就不是純函數了,這怎么能算是函數式編程呢?sbj28資訊網——每日最新資訊28at.com

想不通。sbj28資訊網——每日最新資訊28at.com

今天這篇文章,就來跟大家解釋一下,為什么 React 的函數式組件,其實就是純函數。sbj28資訊網——每日最新資訊28at.com

UI = f(state)

一、hook 的特性

我們在聲明一個函數式組件時,常常會使用到 hook 來聲明一些狀態或者方法,但是我們在使用 hook 時,你會發現 hook 會有一些奇怪的規則,那么就是不能把 hook 放到條件判斷中去。sbj28資訊網——每日最新資訊28at.com

if (a === 1) {  const [count, setCount] = useState(0)}

然后有的人就很不理解這個現象。于是把這個情況定性為 React 的設計缺陷。但這真的是設計缺陷嗎?sbj28資訊網——每日最新資訊28at.com

我們只需要換個思路,你就能對這個現象豁然開朗。sbj28資訊網——每日最新資訊28at.com

二、hook 存在哪?

在初學階段,我們會很自然的認為,當我們使用 useState 在函數內部定義了一個狀態時,那么這個狀態一定是保存在這個函數內部的。sbj28資訊網——每日最新資訊28at.com

function Demo() {  const [count, setCount] = useState(0)  ...}

然后理解得多了,才發現并不是這樣。每一個函數的狀態都被存在了另外一個模塊里(Fiber tree)。也就是說,只要 React 允許,我們甚至可以在別的組件訪問到任意一個組件里的狀態。當然 React 對這種情況做了限制,只允許通過特定的語法來做到這個事情。sbj28資訊網——每日最新資訊28at.com

函數組件中的所有的 hook 都是從外部傳入的。sbj28資訊網——每日最新資訊28at.com

三、state 其實是參數

我們再來看一下這個公式。sbj28資訊網——每日最新資訊28at.com

UI = f(state)

這個時候我們會恍然發現,雖然 state 在函數內部定義/獲取了,但是很明顯,React 是期望大家把他當成外部傳入的參數來理解的。sbj28資訊網——每日最新資訊28at.com

例如我們有這樣一個函數。sbj28資訊網——每日最新資訊28at.com

function Counter({x}) {  const [count, setCount] = useState(0)  return (    <div>{x + count}</div>  )}

他可以等價于。sbj28資訊網——每日最新資訊28at.com

function Counter({x}, [count = 0, setCount]) {  return (    <div>{x + count}</div>  )}

這個時候我們就明朗了,函數,原來還是純函數。但是為什么語法不這樣設計呢,不是更好理解嗎?當然是因為參數太多了寫不下了呀,因此 React 把傳參的行為,下放到了函數內部,通過 hook 的方式來實現。sbj28資訊網——每日最新資訊28at.com

四、重新審視 hook

如果 state 是外部傳入的參數,那么此時我們就要重新審視一下為什么不能把 hook 放到條件判斷中去了。sbj28資訊網——每日最新資訊28at.com

例如:sbj28資訊網——每日最新資訊28at.com

function Counter({x}) {  if (a === 0) {    const [loading, setLoading] = useState(false)    }  const [count, setCount] = useState(0)  return (    <div>{x + count}</div>  )}

所以,useState 是外部傳參,那么參數本來就應該有嚴格的順序要求,這個時候如果第一個參數因為不符合條件而在代碼邏輯里消失了,那第二個參數,不就變成第一個參數了嗎?sbj28資訊網——每日最新資訊28at.com

這個時候代碼邏輯中,就會把第二個參數當成第一個參數去使用,這不就亂了嗎?sbj28資訊網——每日最新資訊28at.com

當我們調用 setState 時,表示入參正在發生變化,函數自然也會重新執行。sbj28資訊網——每日最新資訊28at.com

五、總結

hook 存放在函數外部,因此不屬于函數內部的狀態。我們在理解函數式組件是純函數時,應該把 hook 當成參數去看待,這樣很多現象就非常自然了。sbj28資訊網——每日最新資訊28at.com

函數式編程更加側重于把邏輯解耦拆分成不同的函數,然后通過函數組合的形式去構建一個完整的邏輯,例如我們非常常見的 map 方法sbj28資訊網——每日最新資訊28at.com

function func(item) {  return item + 1}var newArr = arr.map(func)

所以理解函數式編程,會對邏輯封裝解耦的能力要求比較高,在這種情況下,理解函數式編程確實會存在一定的門檻。所以最后思考一個問題,為什么 state 一定要是不可變數據?sbj28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-87257-0.htmlReact 函數組件不是有狀態嗎,為什么還要說他是純函數

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: HTMX:重回前端的原始時代?

下一篇: 十項快速檢查,確保你的 AWS 支出處于控制之中

標簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 林口县| 炎陵县| 松滋市| 光山县| 九龙城区| 始兴县| 神农架林区| 秦皇岛市| 衡水市| 平乡县| 工布江达县| 明水县| 新平| 龙门县| 惠东县| 达日县| 临沂市| 特克斯县| 寻乌县| 越西县| 兴隆县| 瑞金市| 焦作市| 宾川县| 桦南县| 库尔勒市| 格尔木市| 靖西县| 茌平县| 勃利县| 且末县| 阳高县| 得荣县| 南充市| 郸城县| 南木林县| 临清市| 巴中市| 宝坻区| 勐海县| 海阳市|