成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

redux原理分析

jubincn / 3077人閱讀

摘要:介紹是一個(gè)針對(duì)應(yīng)用的可預(yù)測的狀態(tài)管理器。中的設(shè)計(jì)模式裝飾者模式定義裝飾者模式用于給對(duì)象動(dòng)態(tài)地增加職責(zé)。連接操作不會(huì)改變?cè)瓉淼慕M件類,而是返回一個(gè)新的已與連接的組件類。的這行代碼表示它對(duì)的數(shù)據(jù)進(jìn)行訂閱。

redux介紹

redux是一個(gè)針對(duì)JavaScript應(yīng)用的可預(yù)測的狀態(tài)管理器。

redux中的設(shè)計(jì)模式 裝飾者模式

定義:裝飾者模式用于給對(duì)象動(dòng)態(tài)地增加職責(zé)。

我們來看看redux最早期(v0.2.0)的github代碼:

//Counter.js
import React from "react";
import { performs, observes } from "redux";

@performs("increment", "decrement","double")
@observes("CounterStore")
export default class Counter {
  render() {
    const { increment, decrement } = this.props;
    return (
      

Clicked: {this.props.counter} times {" "} {" "} {" "}

); } }

經(jīng)過observes的包裝后,react組件可以訪問Redux store里的couter數(shù)據(jù);經(jīng)過performs的包裝后,react組件可以發(fā)起increment、decrement和double這3個(gè)Action。

我們來看看performs是怎么包裝react組件的:

//performs.js
import React, { Component, PropTypes } from "react";
import pick from "lodash/object/pick";
import identity from "lodash/utility/identity";

const contextTypes = {
    getActions: PropTypes.func.isRequired
};

export default function performs(...actionKeys) {
    
    let mapActions = identity;

    return function (DecoratedComponent) {
        
        const wrappedDisplayName = DecoratedComponent.name;

        return class extends Component {
            static displayName = `ReduxPerforms(${wrappedDisplayName})`;
            static contextTypes = contextTypes;

            constructor(props, context) {
                super(props, context);
                this.updateActions(props);
            }
            
            updateActions(props) {
                this.actions = mapActions(
                    pick(this.context.getActions(), actionKeys),
                    props
                );
            }

            render() {
                return (
                    
                );
            }
        };
    };
}

很簡單對(duì)不對(duì),performs實(shí)質(zhì)上是一個(gè)高階函數(shù),接收一個(gè)react組件類型的參數(shù)DecoratedComponent,然后返回一個(gè)高階組件,該組件包裝了傳遞進(jìn)來的react組件,并向該組件傳遞了action相關(guān)的props.

通過可以看上面的圖可以看出,Counter組件被Observes包裝后,又被performs包裝,形成了一條包裝鏈。

redux提供的API中,有一個(gè)重要的方法connect,用于連接 React 組件與 Redux store。連接操作不會(huì)改變?cè)瓉淼慕M件類,而是返回一個(gè)新的已與 Redux store 連接的組件類。典型的裝飾者模式有木有?

觀察者模式

定義:觀察者模式又叫發(fā)布-訂閱模式,它定義對(duì)象間的一種一對(duì)多的依賴關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴它的對(duì)象都將得到通知。

@observes("CounterStore")

counter.js的這行代碼表示它對(duì)Redux的CounterStore數(shù)據(jù)進(jìn)行訂閱。我們來看看objserves的實(shí)現(xiàn):

//observes.js
import React, { Component, PropTypes } from "react";
import pick from "lodash/object/pick";

const contextTypes = {
    observeStores: PropTypes.func.isRequired
};

export default function connect(...storeKeys) {

    return function (DecoratedComponent) {

        const wrappedDisplayName = DecoratedComponent.name;

        return class extends Component {
            static displayName = `ReduxObserves(${wrappedDisplayName})`;
            static contextTypes = contextTypes;

            constructor(props, context) {
                super(props, context);
                this.handleChange = this.handleChange.bind(this);
                this.unobserve = this.context.observeStores(storeKeys , this.handleChange); //訂閱store數(shù)據(jù)
            }
            
            handleChange(stateFromStores) {
                this.currentStateFromStores = pick(stateFromStores, storeKeys);
                this.updateState(stateFromStores);
            }
            
            updateState(stateFromStores, props) {
                stateFromStores = stateFromStores[storeKeys[0]];
                const state = stateFromStores;
                this.setState(state);//通過setState進(jìn)行組件更新
            }

            componentWillUnmount() {
                this.unobserve();//退訂
            }

            render() {
                return (
                    
                );
            }
        };
    };
}

當(dāng)數(shù)據(jù)變化時(shí),通過調(diào)用setState方法,進(jìn)而對(duì)Counter組件進(jìn)行UI更新。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/86901.html

相關(guān)文章

  • Redux原理分析

    摘要:調(diào)用鏈中最后一個(gè)會(huì)接受真實(shí)的的方法作為參數(shù),并借此結(jié)束調(diào)用鏈??偨Y(jié)我們常用的一般是除了和之外的方法,那個(gè)理解明白了,對(duì)于以后出現(xiàn)的問題會(huì)有很大幫助,本文只是針對(duì)最基礎(chǔ)的進(jìn)行解析,之后有機(jī)會(huì)繼續(xù)解析對(duì)他的封裝 前言 雖然一直使用redux+react-redux,但是并沒有真正去講redux最基礎(chǔ)的部分理解透徹,我覺得理解明白redux會(huì)對(duì)react-redux有一個(gè)透徹的理解。 其實(shí),...

    sumory 評(píng)論0 收藏0
  • Redux原理分析

    摘要:原理分析是什么很多人認(rèn)為必須要結(jié)合使用,其實(shí)并不是的,是狀態(tài)容器,只要你的項(xiàng)目中使用到了狀態(tài),并且狀態(tài)十分復(fù)雜,那么你就可以使用管理你的項(xiàng)目狀態(tài),它可以使用在中,也可以使用中在中,當(dāng)然也適用其他的框架。 Redux原理分析 Redux是什么 很多人認(rèn)為redux必須要結(jié)合React使用,其實(shí)并不是的,Redux 是 JavaScript 狀態(tài)容器,只要你的項(xiàng)目中使用到了狀態(tài),并且狀態(tài)十...

    cooxer 評(píng)論0 收藏0
  • 【源碼解析】redux-thunk

    摘要:的返回值是函數(shù),這個(gè)函數(shù)經(jīng)調(diào)用,傳入?yún)?shù),之后會(huì)在中間件鏈上進(jìn)行傳遞,只要保證每個(gè)中間件的參數(shù)是并且將傳遞給下一個(gè)中間件。 了解了Redux原理之后,我很好奇Redux中間件是怎么運(yùn)作的,于是選了最常用的redux-thunk進(jìn)行源碼分析。 此次分析用的redux-thunk源碼版本是2.2.0,redux源碼版本是3.7.2。并且需要了解Redux原理 redux中間件都是由redu...

    simpleapples 評(píng)論0 收藏0
  • redux源碼分析

    摘要:背景如今在如此復(fù)雜的前端交互和邏輯中,如果是單靠框架,,是遠(yuǎn)遠(yuǎn)不夠的,還需要一個(gè)對(duì)內(nèi)部的數(shù)據(jù)狀態(tài)進(jìn)行管理的機(jī)制才行,而對(duì)于這種數(shù)據(jù)管理機(jī)制如今較為熱門是主要有幾個(gè),,這次主要講述的就是對(duì)源碼進(jìn)行分析。 由于這段時(shí)間一直很忙,所以本想六月初研究完redux源碼就寫一篇博客記錄一下自己的心得,但一直現(xiàn)在才空閑出來,廢話不多說了,直接說主題吧。 背景:如今在如此復(fù)雜的前端交互和邏輯中,如果是...

    Sike 評(píng)論0 收藏0
  • 基于react+react-router+redux+socket.io+koa開發(fā)一個(gè)聊天室

    摘要:最近練手開發(fā)了一個(gè)項(xiàng)目,是一個(gè)聊天室應(yīng)用。由于我們的項(xiàng)目是一個(gè)單頁面應(yīng)用,因此只需要統(tǒng)一打包出一個(gè)和一個(gè)。而就是基于實(shí)現(xiàn)的一套基于事件訂閱與發(fā)布的通信庫。比如說,某一個(gè)端口了,而如果端口訂閱了,那么在端,對(duì)應(yīng)的回調(diào)函數(shù)就會(huì)被執(zhí)行。 最近練手開發(fā)了一個(gè)項(xiàng)目,是一個(gè)聊天室應(yīng)用。項(xiàng)目雖不大,但是使用到了react, react-router, redux, socket.io,后端開發(fā)使用了...

    NusterCache 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<