成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

React 函數(shù)組件不是有狀態(tài)嗎,為什么還要說(shuō)他是純函數(shù)

開(kāi)發(fā) 前端
今天這篇文章,就來(lái)跟大家解釋一下,為什么 React 的函數(shù)式組件,其實(shí)就是純函數(shù)。我們?cè)诼暶饕粋€(gè)函數(shù)式組件時(shí),常常會(huì)使用到 hook 來(lái)聲明一些狀態(tài)或者方法。

許多人在學(xué)習(xí) React 時(shí)會(huì)有這樣一個(gè)疑問(wèn),不斷看到 React 官方團(tuán)隊(duì)言論,或者說(shuō)各路大佬都是在說(shuō) React 是函數(shù)式編程,我們寫組件確實(shí)寫的是組件,但問(wèn)題就在于,我們寫的組件是有內(nèi)部狀態(tài),這樣的函數(shù)就不是純函數(shù)了,這怎么能算是函數(shù)式編程呢?

想不通。

今天這篇文章,就來(lái)跟大家解釋一下,為什么 React 的函數(shù)式組件,其實(shí)就是純函數(shù)。

UI = f(state)

一、hook 的特性

我們?cè)诼暶饕粋€(gè)函數(shù)式組件時(shí),常常會(huì)使用到 hook 來(lái)聲明一些狀態(tài)或者方法,但是我們?cè)谑褂?hook 時(shí),你會(huì)發(fā)現(xiàn) hook 會(huì)有一些奇怪的規(guī)則,那么就是不能把 hook 放到條件判斷中去。

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

然后有的人就很不理解這個(gè)現(xiàn)象。于是把這個(gè)情況定性為 React 的設(shè)計(jì)缺陷。但這真的是設(shè)計(jì)缺陷嗎?

我們只需要換個(gè)思路,你就能對(duì)這個(gè)現(xiàn)象豁然開(kāi)朗。

二、hook 存在哪?

在初學(xué)階段,我們會(huì)很自然的認(rèn)為,當(dāng)我們使用 useState 在函數(shù)內(nèi)部定義了一個(gè)狀態(tài)時(shí),那么這個(gè)狀態(tài)一定是保存在這個(gè)函數(shù)內(nèi)部的。

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

然后理解得多了,才發(fā)現(xiàn)并不是這樣。每一個(gè)函數(shù)的狀態(tài)都被存在了另外一個(gè)模塊里(Fiber tree)。也就是說(shuō),只要 React 允許,我們甚至可以在別的組件訪問(wèn)到任意一個(gè)組件里的狀態(tài)。當(dāng)然 React 對(duì)這種情況做了限制,只允許通過(guò)特定的語(yǔ)法來(lái)做到這個(gè)事情。

函數(shù)組件中的所有的 hook 都是從外部傳入的。

三、state 其實(shí)是參數(shù)

我們?cè)賮?lái)看一下這個(gè)公式。

UI = f(state)

這個(gè)時(shí)候我們會(huì)恍然發(fā)現(xiàn),雖然 state 在函數(shù)內(nèi)部定義/獲取了,但是很明顯,React 是期望大家把他當(dāng)成外部傳入的參數(shù)來(lái)理解的。

例如我們有這樣一個(gè)函數(shù)。

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

他可以等價(jià)于。

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

這個(gè)時(shí)候我們就明朗了,函數(shù),原來(lái)還是純函數(shù)。但是為什么語(yǔ)法不這樣設(shè)計(jì)呢,不是更好理解嗎?當(dāng)然是因?yàn)閰?shù)太多了寫不下了呀,因此 React 把傳參的行為,下放到了函數(shù)內(nèi)部,通過(guò) hook 的方式來(lái)實(shí)現(xiàn)。

四、重新審視 hook

如果 state 是外部傳入的參數(shù),那么此時(shí)我們就要重新審視一下為什么不能把 hook 放到條件判斷中去了。

例如:

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

所以,useState 是外部傳參,那么參數(shù)本來(lái)就應(yīng)該有嚴(yán)格的順序要求,這個(gè)時(shí)候如果第一個(gè)參數(shù)因?yàn)椴环蠗l件而在代碼邏輯里消失了,那第二個(gè)參數(shù),不就變成第一個(gè)參數(shù)了嗎?

這個(gè)時(shí)候代碼邏輯中,就會(huì)把第二個(gè)參數(shù)當(dāng)成第一個(gè)參數(shù)去使用,這不就亂了嗎?

當(dāng)我們調(diào)用 setState 時(shí),表示入?yún)⒄诎l(fā)生變化,函數(shù)自然也會(huì)重新執(zhí)行。

五、總結(jié)

hook 存放在函數(shù)外部,因此不屬于函數(shù)內(nèi)部的狀態(tài)。我們?cè)诶斫夂瘮?shù)式組件是純函數(shù)時(shí),應(yīng)該把 hook 當(dāng)成參數(shù)去看待,這樣很多現(xiàn)象就非常自然了。

函數(shù)式編程更加側(cè)重于把邏輯解耦拆分成不同的函數(shù),然后通過(guò)函數(shù)組合的形式去構(gòu)建一個(gè)完整的邏輯,例如我們非常常見(jiàn)的 map 方法

function func(item) {
  return item + 1
}

var newArr = arr.map(func)

所以理解函數(shù)式編程,會(huì)對(duì)邏輯封裝解耦的能力要求比較高,在這種情況下,理解函數(shù)式編程確實(shí)會(huì)存在一定的門檻。所以最后思考一個(gè)問(wèn)題,為什么 state 一定要是不可變數(shù)據(jù)?

責(zé)任編輯:姜華 來(lái)源: 這波能反殺
相關(guān)推薦

2021-07-08 06:51:29

React函數(shù)組件

2022-06-07 08:39:35

RPCHTTP

2019-08-05 14:23:43

DockerKubernetes容器

2024-07-11 10:41:07

HTTPSHTTP文本傳輸協(xié)議

2020-11-25 09:36:17

HTTPRPC遠(yuǎn)程

2019-04-19 11:56:48

框架AI開(kāi)發(fā)

2020-04-29 08:04:11

NoSQLMySQLSQL

2021-05-19 09:37:45

SessionTokencookie

2024-04-22 09:12:39

Redux開(kāi)源React

2022-02-16 08:11:52

組件渲染前端

2023-09-07 08:07:56

goHTTP網(wǎng)絡(luò)

2022-10-08 00:00:00

websocket協(xié)議HTTP

2023-01-12 09:01:01

MongoDBMySQL

2022-07-19 08:01:32

HTTP協(xié)議RPC

2023-12-11 12:03:14

Python工具元組

2021-10-13 14:01:00

函數(shù)React進(jìn)階

2025-03-06 11:07:27

2022-03-18 14:09:52

ReactJavaScript

2021-12-20 10:30:33

forforEach前端

2022-09-13 08:44:02

IP網(wǎng)絡(luò)MAC地址
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 国产精品一区二区三区久久久 | h视频在线观看免费 | 在线免费av电影 | 久久伊人在 | 亚洲一区二区在线视频 | 精品中文字幕久久 | 视频精品一区二区三区 | 中文在线а√在线8 | 亚洲精品白浆高清久久久久久 | 日韩在线观看视频一区 | 国产午夜精品久久久久免费视高清 | 国产精品久久久久久一级毛片 | 国产成人精品午夜 | 午夜一级做a爰片久久毛片 精品综合 | av天天看| 中文字幕在线人 | 亚洲精品片| 国产一区二区三区四区hd | 丁香综合 | 日韩中文字幕 | 亚洲电影一区二区三区 | 伊人免费在线 | 三区在线观看 | 久在线视频播放免费视频 | 午夜影视网| aaa级片 | 中文在线视频观看 | 久久国产精品久久国产精品 | 狠狠操av| 一区二区三区中文字幕 | www视频在线观看 | 色吊丝2288sds中文字幕 | 精品国产青草久久久久96 | 欧美日韩亚洲在线 | 亚洲国产日韩欧美 | 国产精品久久久久久婷婷天堂 | 欧美在线看片 | 精品综合 | 久艹av| 超碰免费观看 | 久久天堂|