国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

ES6-Generator與react狀態機(13)

alphahans / 1740人閱讀

摘要:同理,你只要知道改變狀態能夠實現要的功能,大體上的原理就是狀態機就可以了。總結,本文重點狀態機模式的使用場景,復雜多狀態的管理,這里注意你沒必要寫個選項卡之類的用狀態機,那反而是給自己找麻煩。

大家在寫App和一些單頁面程序的時候,經常會遇到這樣的情況:

當點擊左邊的箭頭的時候,會出現灰黑色的抽屜效果,再點擊一下向左的箭頭,就會收起來,當然向右滑動和向左滑動也能實現抽屜效果的開關。還有,當抽屜效果開著的時候,點擊右側區域也會自動收起抽屜。點擊左側抽屜里面的圖標,那么也會發生抽屜效果的開關。

如果我們用原生js去手動控制抽屜的開關效果,隨著邏輯的復雜,會存在兩個嚴重的問題:

1.如果只是向左箭頭點擊一次開,再點擊一次關成對兒出現還好,但是如果出現比如點擊一下左側按鈕或者點擊右側內容區域關閉就容易出現點擊關閉不掉或者不該關閉的情況下關閉了,抽屜狀態的控制會隨著業務邏輯的復雜度增加變得十分不可控。

2.如果要想增加一個邏輯控制抽屜開關,那么就得從一堆的if else 詳細代碼里,找到最后的else 部分增加else if,一來是修改起來非常困難,而來如果遇上條件組合判斷和嵌套,對于開發者簡直是一個噩夢,如果出現一個bug,你得把所有的邏輯捋順一遍,這對于一個復雜的項目是非常耗時,幾乎是不可能的。

由于app越來越復雜,視圖隨著數據和邏輯的手動更新狀態變得越來越困難。在這種情況下,Angualr、React、Vue等框架應運而生。尤其是React,在狀態管理無出其右。那么問題來了,為什么React就在狀態管理方面游刃有余呢?

因為它使用了狀態模式。這事兒其實非常的簡單,我們看看怎么回事兒。

狀態模式(狀態機)

什么是狀態模式或狀態機?

一個對象在其內部狀態改變時改變它的行為,這個對象看起來就像改變了它的類一樣。

當大家看到定義的時候,是不是有一種單個字都認識合起來完全看不懂的感覺?這就好比直播吃翔四個字,單看這四個字感覺沒啥,合起來就感覺怎么這么惡心。

不過沒關系,我們來看看狀態模式到底是個啥玩意。大家千萬別聽見設計模式和狀態機之類的詞語自己先蒙圈嚇到了,我直接寫一個狀態機,你一看就明白。

大家家里都用過冰箱吧,點擊電源按鈕.如果是洗衣機是開著的on狀態, 當你點擊它會發出off的信號,如果你是off狀態,則會發出on的信號.代碼實現如下:

var switches = (function(){
    var state = "off";
    return function(){
        if(state === "off"){
            console.log("打開洗衣機");
            state = "on";
        }else if(state === "on"){
            console.log("關閉洗衣機");
            state = "off";
        }
    }
})();
//按下開關按鈕
oBtn.onclick = function(){
    switches();
};

上面的代碼完全符合我們學過的js的東西,簡單的一個匿名函數自執行,加一個變量,ok這就是一個狀態機,是不是so easy。

但是作為一個有追求的洗衣機,得能夠針對不同的洗衣機選擇的不同的程序,沒錯洗衣機面板上也是程序這兩個字,發明洗衣機的一定是程序員。

程序里面有很多的洗滌方式,比如智能、標準、快速、強力,輕柔等等。我們豐富一下我們的面板。

var switches = (function(){  
    var state = "智能";
    return function(){
        if(state === "智能"){
            console.log("智能洗衣模式");
            state = "標準";
        }else if(state === "標準"){
            console.log("標準洗衣模式");
            state = "快速";
        }else if(state === "快速"){
            console.log("快速洗衣模式");
            state = "強力";
        }else if(state === "強力"){
            console.log("強力洗衣模式");
            state = "輕柔";
        }else if(state === "輕柔"){
            console.log("輕柔洗衣模式");
            state = "智能";
        }
    }
})();
//按下程序按鈕
oBtn.onclick = function(){
    switches();
};

看起來沒問題,但是你懂的,首先寫10中洗衣模式if寫法會被寫死,switch方式也很不好。

我有一個大膽的想法,能不能不用判斷語句?大家看我這么思考能不能搞定這件事?

其實洗衣機面板其實就是一個狀態對應一個行為,

一個對象在其內部狀態改變時改變它的行為,這個對象看起來就像改變了它的類一樣。

這句話就好理解了,大家想洗衣機如果本來是浸泡狀態,但是我把它改成脫水狀態,洗衣機從最開始的浸泡衣服變成甩干衣服,看起來就好像洗衣機從一個浸泡機器變成了甩干機器一樣。

換成這種思路理解,我們就可以不用判斷了,只要記住狀態改變,行為改變就行了。我們試著實現一下洗衣模式。




    
    
    
    Document
    


    


這樣就拜托了if判斷,我們想要什么模式,只需要通過改變對應的狀態就好了。但是很多人會想說:

大量重復代碼太難受了啊,針對這樣的情況,es6中推出了狀態機這個偽函數,能夠幫助我們快速實現狀態化。

也就是傳說中的generator函數。 目前FF,edge,chrome 最新版本已經支持。

generator

我們用generator優化一下我們上面的代碼:





    
    
    
    Document
    



    



這里我解釋下,Generator 函數是一個普通函數,但是有三個特征:

1.function關鍵字與函數名之間有一個星號;

2.函數體內部使用yield表達式,定義不同的內部狀態

3.遍歷器對象的next方法,使得指針移向下一個狀態

簡單的說generator就是讓函數排隊一個一個去執行了,很簡單對不對。

上面我們說過react的狀態管理無出其右,那我們看看它的狀態管理跟我們寫的有什么異同之處呢?

react的狀態管理

我們平時開發組件時很多時候要切換組件的狀態,每種狀態有不同的處理方式,這個時候就可以使用狀態模式進行開發。

用和上面一樣的思路,我們來舉一個React組件的小例子,比如一個Banner導航,最基本的兩種狀態,顯示和隱藏,如下:

我們先把generator思路翻篇,我們回到狀態模式,先看一段代碼

        const States = {
            "show": function () {
                console.log("banner展現狀態,點擊關閉");
                this.setState({
                    currentState: "hide"
                })
            },
            "hide": function () {
                console.log("banner關閉狀態,點擊展現");
                this.setState({
                    currentState: "show"
                })
            }
        };

大家現在來看,這個不就是“react版本的洗衣機”嘛。只不過我們定義的是單個的狀態變量,而這里通過一個對象States來定義banner的狀態,這里有兩種狀態show和hide,分別擁有相應的處理方法,調用后再分別把當前banner改寫為另外一種狀態。
接下來來看導航類Banner,這里吧狀態要給拿過來做對照了,這樣看著醒目:

const States = {
    "show": function () {
        console.log("banner展現狀態,點擊關閉");
        this.setState({
            currentState: "hide"
        })
    },
    "hide": function () {
        console.log("banner關閉狀態,點擊展現");
        this.setState({
            currentState: "show"
        })
    }
};
//上面代碼不該出現在這只是為了說明問題
class Banner extends Component {
    constructor(props) {
        super(props);
        this.state = {
            currentState: "hide"
        }
        this.toggle = this.toggle.bind(this);
    }
    toggle() {
        const s = this.state.currentState;
        States[s] && States[s].apply(this);
    }

    render() {
        const { currentState } = this.state;
        return (
            
); } }; export default Banner;

通過導航組件大家這么想,其實react就是有很多種洗衣狀態但是一定能數出來多少種洗衣模式的洗衣機,我們每一次的操作都是在按洗衣機的按鈕。上面的代碼只不過是再開關洗衣機而已。

你不用糾結為什么這么做就能夠進行狀態管理。

你用洗衣機強力模式的時候,你也沒考慮過洗衣機桶和馬達怎么運作的吧?你只要知道按下哪個按鈕能洗干凈衣服,大體上知道洗衣機里面是通過馬達帶動衣服和滾筒之間摩擦清除污漬就夠了。
同理,你只要知道改變狀態能夠實現要的功能,大體上的原理就是狀態機就可以了。

有了這個基礎,如果想繼續深入就可以去看react源碼以及進行各種開發了。

總結,本文重點:

1.狀態機模式的使用場景,復雜多狀態的管理,這里注意你沒必要寫個選項卡之類的用狀態機,那反而是給自己找麻煩。技術源于生活和解決問題,你洗一雙襪子也不會扔洗衣機里面吧?

2.generaor的使用,這個大家要學會和靈活運用,我只是淺顯的講了基礎的應用,這個對你的開發和代碼簡化會大有用途。

3.react的狀態管理,大家要知道原理,重在應用,等用多了你再去看源碼,就能夠更加深刻的體會作者為什么那么寫,原理和熟練應用一個都不能少,但是要注意先后順序和特定學習階段該了解到的程度。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/109591.html

相關文章

  • 初入ES6-Generator和Iterator

    摘要:根據百度百科的說法迭代器模式,又叫做游標模式。給出的定義為提供一種方法訪問一個容器對象中各個元素,而又不需暴露該對象的內部細節。從定義可見,迭代器模式是為容器而生。很明顯,對容器對象的訪問必然涉及到遍歷算法。這兩種情況好像都能夠解決問題。 Iterator根據百度百科的說法: 迭代器(Iterator)模式,又叫做游標(Cursor)模式。GOF給出的定義為:提供一種方法訪問一個容器(...

    waltr 評論0 收藏0
  • 聽飛狐聊JavaScript設計模式系列13

    摘要:介一回聊狀態模式,官方描述允許一個對象在其內部狀態改變時改變它的行為。有限狀態機有限狀態機是一個非常有用的模型,可以模擬世界上大部分事物。這個是官方說法,簡單說,她有三個特征,狀態總數是有限的。,任一時刻,只處在一種狀態之中。 本回內容介紹 上一回聊了聊組合模式(Composite),用組合模式模擬了個圖片庫,聊了遞歸。介一回聊狀態模式(State),官方描述允許一個對象在其內部狀態改...

    linkin 評論0 收藏0
  • React類、ES7屬性初始化(第二部分)

    摘要:組建屬性初始化默認值類型在中將下面的代碼替換成下面的代碼最后一步將初始狀態從構造函數中轉變成屬性初始化。在構造函數的后天添加正確的代碼你需要把狀態初始化代碼從構造函數中刪除。 這是React和ECMAScript6結合使用系列文章的第二篇。 下面是所有系列文章章節的鏈接: React 、 ES6 - 介紹(第一部分) React類、ES7屬性初始化(第二部分) React類,方法綁定...

    VioletJack 評論0 收藏0
  • 狀態決定視圖——基于狀態的前端開發思考

    摘要:前端與狀態現在的前端開發中,對于狀態的管理是重中之重。有限狀態機那么如何更好的管理前端軟件的復雜度的狀態機思想給出了自己的答案。有限狀態機并不是一個復雜的概念簡單說,它有三個特征狀態總數是有限的。 前提 在現在的前端社區,關于MVVM、Model driven view 之類的概念,已經算是非常普及了。React/Vue 這類框架可以算是代表。而自己雖然有 React/Vue 的使用經...

    miya 評論0 收藏0
  • 使用有限狀態管理狀態

    摘要:集成到去使用如果想在中使用,想到比較方便的使用形式是高階組件,需要用到有限狀態機的組件傳進高階組件,就立馬擁有了使用有限狀態機的能力。 背景 近年來由于一些前端框架的興起而后逐漸成熟,組件化的概念已經深入人心,為了管理好大型應用中錯綜復雜的組件,又有了單向數據流的思想指引著我們,Vuex、Redux、MobX等狀態管理工具也許大家都信手拈來。我們手握著這些工具,不斷思考著哪些數據應該放...

    hiyang 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<