[譯] React Hooks: 沒有魔法,只是數組
[譯] React Hooks: 沒有魔法,只是數組
原文鏈接: https://medium.com/@ryardley/react-hooks-not-magic-just-arrays-cd4f1857236e
我是 React
新特性 Hooks
的粉絲。但是,在你使用 React Hooks
的過程中,有一些看上去 很奇怪的限制 。在本文里,對於那些還在為了理解這些限制而苦苦掙扎的同志,我嘗試通過一些列圖表的方式,來解釋為什麼會存在這些限制。
理解hooks怎麼運行
我聽說很多同學都對hooks像魔法一般的效果感到困惑,因此我將嘗試通過淺顯的方式,來演示hooks是怎麼運行的。
hooks的原則
react團隊在怎麼使用hooks的 官方文檔 中,強調了兩點主要的使用原則:
- 不要 在 循環、條件語句或者嵌套函數中調用hooks
- 只能在
React
函數組件中調用hooks
第二點我認為是顯而易見的。為了給 函數組件 增加一些能力(比如 state
,類聲明周期方法),你當然需要通過一種方式,來把這種能力賦給函數組件,這種方式就是使用hooks。
然而,第一點規則,很容易讓人感到困惑。不就是使用一個 API
么,為什麼還有這麼多限制呢。這也正是我將要在下文里解釋的。
hooks中的state管理,只是在操作數組
為了更加清晰的理解hooks,讓我們來看看怎麼簡單實現hooks API。
請注意,下面代碼只是一個demo,是為了讓我們理解hooks大概是怎麼運作的。這不是 React 中的真正內部實現。
怎麼實現 useState 呢?
讓我們通過一個例子來演示,useState
內部大概是怎麼運作的。
組件代碼如下:
function RenderFunctionComponent() {
const [firstName, setFirstName] = useState("Rudi");
const [lastName, setLastName] = useState("Yardley");
return (
<Button onClick={() => setFirstName("Fred")}>Fred</Button>
);
}
useState
實現的功能是,你能通過這個hook返回的 數組 中第二個元素,作為修改這個state的一個setter方法。
那麼,React可能會怎麼來實現 useState 呢?
讓我們來想想react內部會怎麼來實現 useState
呢。在下面的實現里,state
是存放在被render的組件外面,並且這個state
不會和其他組件共享,同時,在這個組件後續render中,能夠通過特定的作用域方式,訪問到這個state
。
1) state初始化
創建兩個空數組,分別用來存放 setters
和 state
,將 指針 指到 0
的位置: