Hook是React在16.8以上版本新增的API,此概念一出就引發界內強烈的反響,尤大大也悄咪的整出了vue-hook來跟風一波。
javascript
class App extends React.Component {}
複製代碼
const ListItem = (props) => (<div>{props.content}</div>)
複製代碼
const HOC = (Component) => {
// ...公共邏輯
return <Component/>
}
複製代碼
這三種組件是構建最多的,咱們構建組件的時候也會根據業務需求進行思考,根據組件是否須要自身state來選擇類組件或者無狀態組件,並將複用的公共邏輯抽離到高階組件,可是實話說,組件分的越多,對開發者的考驗就越多,在開發前進行總體性思考的需求就越必要,而對於大多數人來講,對於類組件來講,更爲喜歡編寫無狀態組件,緣由不外乎就是由於:
構造類組件有必定的難度,尤爲是生命週期在16.4版本更新後,不只鉤子函數難以掌握(名字都老長了,還新增了static靜態方法來充當鉤子函數),生命週期學習成本高。vue
總結一下Hook想要解決的問題:java
React對於目前存在的這些問題就一句話:「各位走好(各類組件),之後,這裏的一切,都交給Hook吧!」
Hook是怎麼解決這些問題的呢:react
最最主要的是,Hook是漸進式提出的,意思就是說不會讓用戶一會兒就改寫爲Hook的開發模式,而是能夠慢慢來適應的,而在將來的某個版本纔會真正的移除class的寫法。git
聽了這麼多,你們是否是對Hook已經充滿興趣了呢?Ok,讓咱們繼續往下走。github
Hook究竟是什麼呢,Hook 是一些可讓你在無狀態組件裏「鉤入」 React state 及生命週期等特性的函數。Hook 不能在 class 組件中使用 —— 這使得你不使用 class 也能使用 React。api
也就是說Hook只是一種「工具」,這種工具可讓咱們在無狀態組件中使用到state以及生命週期等特性,而在無狀態組件中使用來Hook工具後,咱們就稱這個組件爲**「函數組件」(其實我習慣稱爲Hook組件)。**數組
那麼就來看一個函數組件是怎麼變身的吧:babel
首先咱們先來看一個class組件的例子,咱們想要實現一個點擊按鈕就會計數的效果:函數
import React, { Component } from 'react';
class Example extends Component {
constructor () {
super()
// 想辦法先搞一個狀態出來
this.state = { count: 0 }
// 對方法中this的綁定
this.setCount = this.setCount.bind(this)
}
// 更改狀態的方法
setCount () {
this.setState((prevState) => ({ count: prevState.count + 1 }))
}
render () {
// 最煩在這裏解構賦值
let { count } = this.state
return (
<div> <p>You clicked {count} times</p> <button onClick={this.setCount}> Click me </button> </div>
);
}
}
複製代碼
相信上面的代碼你們都能看明白,就很少說了,再看一下Hook實現的函數組件:
import React, { useState } from 'react';
function Example (props) {
// 聲明一個叫 「count」 的 state 變量。
const [count, setCount] = useState(0);
return (
<div> <p>You clicked {count} times</p> <button onClick={() => setCount(count + 1)}> Click me </button> </div>
);
}
複製代碼
是否是感受眼前一亮呀,你們能夠看到,useState其實就是一個Hook函數,它能夠爲Example這個普普統統的無狀態組件添加一個叫作count的數據,並且還提供了一個setCount的專屬方法(一物降一物的感受)來更改這個count數據。傳入的0就是這個count數據的默認值,由於使用的是數組的解構賦值,因此數據和方法的名字能夠根據我的喜歡去命名,好比count + updateCount均可以。
你們能夠看到,轉換爲函數組件後不用再操心this的問題,編寫方法也簡單了不少,把構建狀態、設置默認值、構建更改狀態的方法都融合到短短的一行代碼中,並且也保留了無狀態組件使用傳入的props的方法,完美!
Ok,初識就到這裏,這裏只是爲給你們展現一下Hook的魅力,由於不喜歡枯燥的講解API,由於你們徹底能夠去官網查閱API文檔,因此在接下來的內容中,我將利用一個Todolist的例子來進行闡述,而這裏也更多的以代碼的展現爲主,想要學習更多的api的使用以及概念,仍是要去查閱問題喲。
記住:文檔基本沒有廢話,因此每句話都應該是知識點,讀文檔的時候要耐着性子一句一句的看完喲。