全面掌握 React — useReducer

react

在 hooks 中提供了的 useReducer 功能灵迫,可以增強(qiáng) ReducerDemo 函數(shù)提供類似 Redux 的功能就缆,引入 useReducer 后宪萄,useReducer 接受一個(gè) reducer 函數(shù)作為參數(shù)州叠,reducer 接受兩個(gè)參數(shù)一個(gè)是 state 另一個(gè)是 action 后众。然后返回一個(gè)狀態(tài) count 和 dispath放闺,count 是返回狀態(tài)中的值祟昭,而 dispatch 是一個(gè)可以發(fā)布事件來(lái)更新 state 的。

import React,{useReducer} from 'react'

export default function ReducerDemo() {
    const [count, dispath] = useReducer((state,action)=> {
        //...
    }, 0);
    return (
        <div>
            <h1 className="title">{count}</h1>
        </div>
    )
}

  • 在 useReducer 傳入 reducer 函數(shù)根據(jù) action 來(lái)更新 state怖侦,如果 action 為 add 正增加 state 也就是增加 count从橘。
    在 button 中調(diào)用 dispatch 發(fā)布 add 事件,發(fā)布 add 事件后就會(huì)在 reducer 根據(jù)其類型對(duì) state 進(jìn)行對(duì)應(yīng)操作础钠,更新 state恰力。
export default function ReducerDemo() {
    const [count, dispath] = useReducer((state,action)=> {
        if(action === 'add'){
            return state + 1;
        }
        return state;
    }, 0);
    return (
        <div>
            <h1 className="title">{count}</h1>
            <button className="btn is-primary"
                onClick={()=> dispath('add')}
                >Increment</button>
        </div>
    )
}

下面的代碼并不沒(méi)有什么特別,只是在上面代碼基礎(chǔ)進(jìn)行鞏固旗吁,大家可以自己閱讀一下踩萎。

import React,{useReducer} from 'react'

export default function ReducerDemo() {
    const [count, dispath] = useReducer((state,action)=> {
       switch(action){
           case 'add':
                return state + 1;
            case 'sub':
                return state - 1;
            default:
                return state;
       }
    }, 0);
    return (
        <div>
            <h1 className="title">{count}</h1>
            <button className="btn is-primary"
                onClick={()=> dispath('add')}
                >Increment</button>
            <button className="btn is-warnning"
                onClick={()=> dispath('sub')}
                >Decrement</button>
        </div>
    )
}

在下面的代碼中 action 不再是字符串而變成對(duì)象,通過(guò) type 來(lái)表示 action 類型很钓,然后通過(guò) name 來(lái)帶來(lái)更多的信息香府。其實(shí)這些代碼雖然變得復(fù)雜但是本質(zhì)和上面分享內(nèi)容并沒(méi)有什么不同。

import React,{ useReducer,useRef } from 'react'

export default function ShoppingList() {
    const inputRef = useRef();
    const [items, dispatch] = useReducer((state,action)=> {
        switch(action.type){
            case 'add':
                return [...state,
                    {
                        id:state.length,
                        name:action.name
                    }]
                }
    },[])
    
    function handleSubmit(event){
        event.preventDefault();
        dispatch({
            type:'add',
            name:inputRef.current.value
        });
        inputRef.current.value = '';
    }
    
    return (
        <>
            <form onSubmit={handleSubmit}>

                <input ref={inputRef}/>
            </form>
            <ul>
                {items.map(item => (
                    <li key={item.id}>{item.name}</li>
                ))}
            </ul>
        </>
    )
}

這里值得說(shuō)一下就是 ...state 這是每一次我們需要 copy 一個(gè) state 然后修改 state 而不是在 state 原有對(duì)象進(jìn)行修改码倦。這就是 immutable 數(shù)據(jù)吧企孩。

import React,{ useReducer,useRef } from 'react'

export default function ShoppingList() {
    const inputRef = useRef();
    const [items, dispatch] = useReducer((state,action)=> {
        switch(action.type){
            case 'add':
                return [...state,
                    {
                        id:state.length,
                        name:action.name
                    }]

            case 'remove':
                return state.filter((_,index) => index != action.index)

            case 'clear':
                return [];
            default:
                return state;
            }
    },[])
    
    function handleSubmit(event){
        event.preventDefault();
        dispatch({
            type:'add',
            name:inputRef.current.value
        });
        inputRef.current.value = '';
    }
    
    return (
        <>
            <form onSubmit={handleSubmit}>

                <input ref={inputRef}/>
            </form>
            <button
                className="button is-danger"
                onClick={
                () => dispatch({type:'clear'})
            }>clear</button>
            <ul>
                {items.map((item,index) => (
                    <li className="section" key={item.id}>{item.name}
                        <button className="button" onClick={
                            () => dispatch({type:'remove',index})
                        }>X</button>
                    </li>
                ))}
            </ul>
        </>
    )
}

react-dev
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市袁稽,隨后出現(xiàn)的幾起案子勿璃,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,744評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件补疑,死亡現(xiàn)場(chǎng)離奇詭異歧沪,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)莲组,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門诊胞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人锹杈,你說(shuō)我怎么就攤上這事撵孤。” “怎么了竭望?”我有些...
    開封第一講書人閱讀 163,105評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵早直,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我市框,道長(zhǎng),這世上最難降的妖魔是什么糕韧? 我笑而不...
    開封第一講書人閱讀 58,242評(píng)論 1 292
  • 正文 為了忘掉前任枫振,我火速辦了婚禮,結(jié)果婚禮上萤彩,老公的妹妹穿的比我還像新娘粪滤。我一直安慰自己,他們只是感情好雀扶,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評(píng)論 6 389
  • 文/花漫 我一把揭開白布杖小。 她就那樣靜靜地躺著,像睡著了一般愚墓。 火紅的嫁衣襯著肌膚如雪予权。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,215評(píng)論 1 299
  • 那天浪册,我揣著相機(jī)與錄音扫腺,去河邊找鬼。 笑死村象,一個(gè)胖子當(dāng)著我的面吹牛笆环,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播厚者,決...
    沈念sama閱讀 40,096評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼躁劣,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了库菲?” 一聲冷哼從身側(cè)響起账忘,我...
    開封第一講書人閱讀 38,939評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后闪萄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體梧却,經(jīng)...
    沈念sama閱讀 45,354評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評(píng)論 2 333
  • 正文 我和宋清朗相戀三年败去,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了放航。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,745評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡圆裕,死狀恐怖广鳍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情吓妆,我是刑警寧澤赊时,帶...
    沈念sama閱讀 35,448評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站行拢,受9級(jí)特大地震影響祖秒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜舟奠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評(píng)論 3 327
  • 文/蒙蒙 一竭缝、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧沼瘫,春花似錦抬纸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至膜蛔,卻和暖如春坛猪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背皂股。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工砚哆, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人屑墨。 一個(gè)月前我還...
    沈念sama閱讀 47,776評(píng)論 2 369
  • 正文 我出身青樓躁锁,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親卵史。 傳聞我的和親對(duì)象是個(gè)殘疾皇子战转,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評(píng)論 2 354

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