react-17-hook-基礎(chǔ)

1. 前言

what Hook

HookReact 16.8的新增特性蔑赘。它可以讓你在不編寫class組件 的情況下使用state以及其他的React 特性镀脂。


2. why

之前的組件形式缺點(diǎn)

  1. 函數(shù)組件一般是無狀態(tài)組件
  2. 類組件可以有狀態(tài),也可以無狀態(tài)
  3. 組件之間復(fù)用狀態(tài)邏輯很難,組件維護(hù)越來越復(fù)雜
  4. class組件中的 this難以理解

3. Hook 基本概念

現(xiàn)在的函數(shù)組件也可以是有狀態(tài)的組件殴俱,內(nèi)部也可以維護(hù)自身的狀態(tài)以及做一些邏輯方面的處理

  1. 避免地獄式嵌套,可讀性提高
  2. 函數(shù)式組件,比class組件更容易理解
  3. UI和邏輯更容易分離
  4. 基本不需要 this

4. 引入hook之前的代碼問題

簡(jiǎn)單的計(jì)數(shù)器案例

   function MyCom(){
            let count = 0
            function add(){
                count ++
                console.log(count)
            }
            return (
                <div>
                    {count}
                    <button onClick={add}>點(diǎn)我</button>
                </div>
            )
        }
        
        ReactDOM.render(
            <MyCom/>,
            document.getElementById("app")
        )

點(diǎn)擊按鈕界面變量不跟著變


5. Hooks 有哪些常用的API

Hooks讓我們的函數(shù)組件擁有了類組件的特性,例如組件內(nèi)的狀態(tài)主籍、生命周期

1.useState 組件內(nèi)的狀態(tài)
2.useEffect 生命周期
3.其他


6. 語法-State

const [state,setState] = useState(initialState)

1.state為變量
2.initialState state變量的初始值

3.setState 修改state值的方法
4.setState異步執(zhí)行


7.hook -useState

包含--基本類型寫法
包含--引用類型寫法

  function MyCom(){
// 聲明一個(gè)叫 count 的state變量,  初始值為0
            let [count, setCount] = React.useState(0)
// 聲明一個(gè) 叫obj的 state變量 初始值為空對(duì)象
            let [obj, setObj] = React.useState({})
            function add(){
// 基本類型的修改
                setCount(++count)
// 引用類型的修改
                setObj({
                    name: 'a'+count
                })
                console.log(count)
            }
            return (
                <div>
                    {count}-{obj.name}
                    <button onClick={add}>點(diǎn)我</button>
                </div>
            )
        }
        

在函數(shù)組件中通過useState實(shí)現(xiàn)函數(shù)內(nèi)部維護(hù)state鲤嫡,參數(shù)為state默認(rèn)的值,返回值是一個(gè)數(shù)組柿祈,
第一個(gè)值為當(dāng)前的state哈误,
第二個(gè)值為更新state的函數(shù)


8 類組件 VS 函數(shù)式組件

1.state聲明方式:
在函數(shù)組件中通過useState 直接獲取,類組件通過constructor構(gòu)造函數(shù)中設(shè)置

2.state讀取方式:
在函數(shù)組件中直接使用變量躏嚎,類組件通過this.state.count的方式獲取

3.state更新方式:
在函數(shù)組件中通過setCount更新蜜自,類組件通過this.setState()

總結(jié)就是useState使用起來更為簡(jiǎn)潔,減少了this指向不明確的情況


9. hook-鉤子 -useEffect

9.1語法

React.useEffect(參數(shù)1,參數(shù)2)
參數(shù)1 是回調(diào)函數(shù)
參數(shù)2 是參數(shù)1 這個(gè)函數(shù)監(jiān)聽的變量


9.2 useEffect 相當(dāng)于3個(gè)鉤子的綜合

1.componentDidMount
2.componentDidUpdate
3.componentWillUnMount


9.3 分析

參數(shù)2 為空 不寫: DidMount+DidUpdate
在第一次渲染和更新之后都會(huì)執(zhí)行


參數(shù)2 空數(shù)組[] ,DidMount
第一次渲染后


參數(shù)2 [變量], 監(jiān)聽變量的改變 componentDidUpdate
React 將對(duì)前一次渲染的變量值count和后一次渲染的 count 值進(jìn)行比較


9.4 代碼

  function MyCom(){
            let [count, setCount] = React.useState(0)
            let [obj, setObj] = React.useState({})
            function add(){
                // setCount(++count)
                setObj({
                    name: 'a'+count
                })
                console.log(count)
            }
            React.useEffect(() => {
               console.log("初始化或更新1")
            })
            React.useEffect(() => {
               console.log("初始化2")
            }, [])
            React.useEffect(() => {
               console.log("初始化或count更新3")
            }, [count,obj])
            return (
                <div>
                    {count}-{obj.name}
                    <button onClick={add}>點(diǎn)我</button>
                </div>
            )
        }

這個(gè)建議 還是自己寫寫,因?yàn)榇a本身也很簡(jiǎn)單


10. 清除函數(shù)

回調(diào)函數(shù)中可以返回一個(gè)清除函數(shù)卢佣,這是effect可選的清除機(jī)制重荠,相當(dāng)于類組件中componentwillUnmount生命周期函數(shù),可做一些清除副作用的操作,比如定時(shí)器

    // 創(chuàng)建響應(yīng)數(shù)據(jù)以及修改方法
        let [num,setNum]=useState(20);
        // 會(huì)在更新之前 執(zhí)行指定的銷毀函數(shù)
        // 防止初始化的代碼 重復(fù)綁定  定時(shí)器
        useEffect(()=>{
            console.log("useEffect")
            // 綁定定時(shí)器 讓num遞增
            let timer=setInterval(()=>{
                console.log("定時(shí)器");
                num++;
                setNum(num);//num發(fā)生變化
            },1000);
            return ()=>{//銷毀 
                clearInterval(timer);
            }
        })

11. 總結(jié)

1.每調(diào)用useHook一次都會(huì)生成一份獨(dú)立的狀態(tài)
2.通過自定義hook能夠更好的封裝我們的功能
3.useEffect相當(dāng)于componentDidMount珠漂,componentDidUpdate 和 componentWillUnmount 這三個(gè)生命周期函數(shù)的組合


12.其他hooks

useReducer
useCallback
useMemo
useRef


13. 這里再梳理個(gè) useReducer

其實(shí)就是 useState的替代版 主要用來 結(jié)合redux 中的reducer

13.1 簡(jiǎn)單的看下 store 中 redux的結(jié)構(gòu)

import { createStore } from "redux";

let  defaultState = {
    counter:0
} 
export const reducer = (state=defaultState,{type,payload=10})=>{
    switch (type){
        case "counter/incremented":{
            let tempState = JSON.parse(JSON.stringify(state));
            tempState.counter += payload
            return tempState
        }
        case "counter/decremented":{
             return{
                 ...state,
                 counter:state.counter - payload
             }
        }
        default:{
            console.log("switch  默認(rèn)")
            return state
        }
    }
}

let store = createStore(reducer)
export default store

13.2 使用 useReducer

import { useState, useEffect ,useReducer} from 'react';
import {reducer} from "../store"
function HookPage() {
  const [state, dispatch] = useReducer(reducer, {counter:99})
  } 

  return (
    <div className="App">
      <h1>{state.counter}</h1>
      <button onClick={()=>{
        dispatch({type:"counter/decremented",payload:100})
      }}> redux</button>
    </div>
  );
}
export default HookPage;

13.3 分析

useReducer()
參數(shù)1: 就是reducer
參數(shù)2:就是初始值
參數(shù)3:是個(gè)初始化的回調(diào)函數(shù)


14. 完整的 組件內(nèi)使用 hook

import { useState, useEffect ,useReducer} from 'react';
import {reducer} from "../store"
function HookPage() {
  let [counter, setCounter] = useState(0)
  let [person, setPerson] = useState({ name: "yzs" })

  const [state, dispatch] = useReducer(reducer, {counter:99})
  function increase(v) {
    counter += v
    setCounter(counter)
  }
  function update() {
    setPerson({
      name: "鄭州"
    })
  } 
  // **************鉤子
  useEffect(() => {
    console.log("初始化或者更新")
  })
  useEffect(() => {
    console.log("[]  初始化")
  },[])
  useEffect(() => {
    console.log("初始化或 對(duì)應(yīng)的值變化")
  },[counter,person])

  return (
    <div className="App">

      <h1>{counter}</h1>
      <button onClick={() => {
        increase(10)
      }}>增加</button>
      <hr />
      <h1>{person.name}</h1>
      <button onClick={update}> name</button>
      <hr/>
      <h1>{state.counter}</h1>
      <button onClick={()=>{
        dispatch({type:"counter/decremented",payload:100})
      }}> redux</button>
    </div>
  );
}

export default HookPage;

15. 總結(jié)性hook

可參考這篇文章 react常用-hook總結(jié)


參考資料

react-hook-常用總結(jié)
react-hook


初心

我所有的文章都只是基于入門晚缩,初步的了解尾膊;是自己的知識(shí)體系梳理;
如果能幫助到有緣人,非常的榮幸,一切為了部落的崛起;
共勉
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末媳危,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子冈敛,更是在濱河造成了極大的恐慌待笑,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件抓谴,死亡現(xiàn)場(chǎng)離奇詭異暮蹂,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)癌压,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門仰泻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人滩届,你說我怎么就攤上這事集侯。” “怎么了?”我有些...
    開封第一講書人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵棠枉,是天一觀的道長(zhǎng)浓体。 經(jīng)常有香客問我,道長(zhǎng)辈讶,這世上最難降的妖魔是什么命浴? 我笑而不...
    開封第一講書人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮贱除,結(jié)果婚禮上生闲,老公的妹妹穿的比我還像新娘。我一直安慰自己勘伺,他們只是感情好跪腹,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著飞醉,像睡著了一般冲茸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上缅帘,一...
    開封第一講書人閱讀 51,182評(píng)論 1 299
  • 那天轴术,我揣著相機(jī)與錄音,去河邊找鬼钦无。 笑死逗栽,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的失暂。 我是一名探鬼主播彼宠,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼弟塞!你這毒婦竟也來了凭峡?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤决记,失蹤者是張志新(化名)和其女友劉穎摧冀,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體系宫,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡索昂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了扩借。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片椒惨。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖潮罪,靈堂內(nèi)的尸體忽然破棺而出康谆,到底是詐尸還是另有隱情凄杯,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布秉宿,位于F島的核電站戒突,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏描睦。R本人自食惡果不足惜膊存,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望忱叭。 院中可真熱鬧隔崎,春花似錦、人聲如沸韵丑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽撵彻。三九已至钓株,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間陌僵,已是汗流浹背轴合。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留碗短,地道東北人受葛。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像偎谁,于是被迫代替她去往敵國(guó)和親总滩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • Hook 是 react 16.8 推出的新特性巡雨,具有如下優(yōu)點(diǎn):Hook 使你在無需修改組件結(jié)構(gòu)的情況下復(fù)用狀態(tài)邏...
    林木木road閱讀 789評(píng)論 0 1
  • 一闰渔、React介紹 溫馨提醒:想要獲取更好的觀看效果,可以點(diǎn)擊查看本篇文章的原文檔(React-Hook快速入門(...
    SwiftBirds閱讀 450評(píng)論 0 1
  • 前言 自react16.8發(fā)布了正式版hook用法以來鸯隅,我們公司組件的寫法逐漸由class向函數(shù)式組件+hook的...
    大春春閱讀 3,964評(píng)論 3 7
  • Tip: hook使用規(guī)則: 1.只能在函數(shù)最外層調(diào)用 Hook澜建。不要在循環(huán)向挖、條件判斷或者子函數(shù)中調(diào)用 2.只能在...
    Calvin_Wu0720閱讀 259評(píng)論 0 0
  • 函數(shù)式組件在不編寫class的情況下使用state以及其他的React特性(比如生命周期) 一蝌以、Hooks結(jié)合函數(shù)...
    諾城閱讀 1,138評(píng)論 2 0