react hook 學(xué)習隨記

這里記錄的主要針對用法 咱也不是什么大佬看看源碼文檔隨便就能用了 先學(xué)習怎么用 才好幫助理解實現(xiàn)原理 如果你對hook還沒有一個基本的概念 請先看看官方文檔

useState useRef

const App = (props) => {
    const [value, setValue] = useState('')
    const input = useRef(null)
    
    const inputChange = ({ target: { value } }) => {
        setValue(value)
        input.current = value
    }
    const _click = () => {
        setTimeout(() => {
            console.log(value)
            console.log(input.current)
        }, 1000)
      }
    return (
        <div>
            <input value={state.value} onChange={inputChange} type="text"/>
            <span>{state.show}</span>
            <Button onClick={_click}>點擊</Button>
        </div>
    )
}

useState顧名思義是用來聲明和設(shè)置當前組件內(nèi)部的state變量的侣集。value是當前state里的變量名 而setValue則是修改他的方法

接收的參數(shù)為初始的默認值 例如可以是props.value由父數(shù)據(jù)流拿到的值

useRef原意是用來獲取dom節(jié)點 可以用input.current來訪問但我們也可以用他來解決一些作用域的問題
上述代碼console的結(jié)果 value里是點擊前入框的內(nèi)容飞蚓。而input.current里是打印時輸入框的內(nèi)容

useEffect 副作用

useEffect(() => {
    const timer = setInterval(() => {}, 1000)
    return () => clearInterval(timer)
}, [value])

useEffect 可以執(zhí)行一些副作用 替代了componentDidMount境钟、componentDidUpdatecomponentWillUNmount

我們就不用再考慮某些變量在componentDidMount的時候是否可以拿到。如果可以就要去執(zhí)行一次update也要執(zhí)行 UnMount還要再清除這種繁瑣的操作了

return里執(zhí)行的是要清除訂閱或是計時器一類的做法類似于componentWillUNmount

第二個參數(shù)的數(shù)組所接受的變量 則代表會觸發(fā)執(zhí)行副作用的條件 如果發(fā)生改變才會觸發(fā)副作用

若沒有改變會直接跳過 如果傳遞[] 則只會在掛載和卸載時執(zhí)行一次

在寫法上useEffect副作用需要緊跟著上一個useState并且保證他在最外層 沒有循環(huán)沒有判斷
遵循官方的規(guī)則才能避免一些不必要的問題出現(xiàn)

useContext useReducer

組件之間數(shù)據(jù)共享 自己構(gòu)建一個數(shù)據(jù)流 做一個局部的store

useReducer

  • 接收的第一個參數(shù)是一個回調(diào)函數(shù) 接收一個stateaction 會用redux的童鞋應(yīng)該就知道咋用了
  • 第二個參數(shù)是可選參數(shù) 為state的默認值對象
  • 而前面的statedispatch 應(yīng)該更好理解了 暴露出來的store和用來突變的方法
  • 當然 以上的應(yīng)該都建立在你已經(jīng)會使用redux的情況下 如果你還不會 請先去了解一下redux

父組件

import React, { useReducer, useEffect } from 'react'
import './style.css'
const initialState = {
    value: '',
    show: '展示'
}
export const CountContext = React.createContext()
    
const handleStore = (state, action) => {
    switch(action.type) {
      case 'change':
        return { ...state, value: action.value }
      case 'set':
        return { ...state, show: action.show }
      default:
        new Error()
  }
}
// 父組件
const App = () => {
    const [state, dispatch] = useReducer(handleStore, initialState)
    
    const inputChange = ({ target: { value } }) => {
        dispatch({ type: 'change', value })
    }
    return (
        <CountContext.Provider value={{ state, dispatch }}>
            <div className="content">
                <input value={state.value} onChange={inputChange} type="text"/>
                <span>{state.show}</span>
                <Child/>
            </div>
        </CountContext.Provider>
      )
}

我們可以把state也就是store通過CountContext.Providervalue讓數(shù)據(jù)流下去 包括dispatch方法

子組件

在子組件使用需要引入創(chuàng)建context的組件里的CountContext

    import React, { useContext } from 'react'
    import { CountContext } from '@/components/page'
    
    const Child = () => {
      const { state, dispatch } = useContext(CountContext)
      
      const handleClick = () => {
        let value = +state.value + 1
        dispatch({ type: 'change', value })
      }
      return (
        <div>
          <div className='child' onClick={handleClick}>點擊</div>
          <div>{state.value}</div>
        </div>
        
      )
    }

這個時候我們已經(jīng)可以成功修改store的數(shù)據(jù)并使用他

掘金同步

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末同辣,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌橡伞,老刑警劉巖捶惜,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件田藐,死亡現(xiàn)場離奇詭異,居然都是意外死亡吱七,警方通過查閱死者的電腦和手機汽久,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來踊餐,“玉大人景醇,你說我怎么就攤上這事×吡耄” “怎么了三痰?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長窜管。 經(jīng)常有香客問我散劫,道長,這世上最難降的妖魔是什么幕帆? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任获搏,我火速辦了婚禮,結(jié)果婚禮上失乾,老公的妹妹穿的比我還像新娘常熙。我一直安慰自己纬乍,他們只是感情好,可當我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布裸卫。 她就那樣靜靜地躺著蕾额,像睡著了一般。 火紅的嫁衣襯著肌膚如雪彼城。 梳的紋絲不亂的頭發(fā)上诅蝶,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天,我揣著相機與錄音募壕,去河邊找鬼调炬。 笑死,一個胖子當著我的面吹牛舱馅,可吹牛的內(nèi)容都是我干的缰泡。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼代嗤,長吁一口氣:“原來是場噩夢啊……” “哼棘钞!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起干毅,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤宜猜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后硝逢,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體姨拥,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年渠鸽,在試婚紗的時候發(fā)現(xiàn)自己被綠了叫乌。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡徽缚,死狀恐怖憨奸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情凿试,我是刑警寧澤排宰,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站红省,受9級特大地震影響额各,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜吧恃,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一虾啦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦傲醉、人聲如沸蝇闭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽呻引。三九已至,卻和暖如春吐咳,著一層夾襖步出監(jiān)牢的瞬間逻悠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工韭脊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留童谒,地道東北人。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓沪羔,卻偏偏與公主長得像饥伊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蔫饰,可洞房花燭夜當晚...
    茶點故事閱讀 43,527評論 2 349

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