美文网首页前端分享
实现基于react-redux的状态管理库

实现基于react-redux的状态管理库

作者: RudolphWang | 来源:发表于2019-02-25 13:51 被阅读68次

react-redux是基于context的特性实现了父子组件的状态共享,查看组件Provider源码我们可以发现很多有用的信息:

Provider.propTypes = {
  store: PropTypes.shape({
    subscribe: PropTypes.func.isRequired,
    dispatch: PropTypes.func.isRequired,
    getState: PropTypes.func.isRequired
  }),
  context: PropTypes.object,
  children: PropTypes.any
};

store属性必须带有函数subscribedispatchgetState

subscribe的作用是订阅更新,getState获取最新 state,而dispatch的作用是通过mapDispatchToProps传给子组件去调用的。

这里,subscribe扮演了很重要的角色,它通知了状态的更新,让Provider能更新本地的状态storeState,然后通过context的特性实现子组件状态的更新!具体细节可以查看Provider源码中subscribe函数的实现细节。

subscribe() {
    const { store } = this.props
    this.unsubscribe = store.subscribe(() => {
        // 详情省略
    });
}

以上分析我们是不是可以想到:react-redux给我们提供了一个 API 接口,只要实现了subscribedispatchgetState,我们就能自己实现一个状态管理库?

当然可以,接下来开始实现一个简单的状态管理库。

class Store {
    private _observers = [];
    private _currentState = {};
    constructor(initialState) {
        this._currentState = initialState;
    }
    dispacth(type/*no-use*/, payload) {
        // 处理state
        const newState = {
            ...this.getState(),
            ...payload
         };
         this._setState(newState);
    }
    getState(){
        return this._currentState;
    }

    private _setState(state) {
        this._currentState = state;
        this._notify();
    }

    private subscribe(fn/*Function*/){
        //订阅方法,返回可取消订阅函数,这点很重要
        this._observers.push(fn);
        return () => {
            this._observers = this._observers.filter(f => f !== fn);
        }
    };
    private _notify(fn/*Function*/) {
        //执行所有订阅
        this._observers.forEach(fn => fn());
    };
}

以上就是状态库的简单实现。当然可以实现更复杂的,这依赖于我们的创造力!
附上一个类似Vuex的react状态管理库的实现,点击链接查看。

相关文章

  • 实现基于react-redux的状态管理库

    react-redux是基于context的特性实现了父子组件的状态共享,查看组件Provider源码我们可以发现...

  • react-redux

    redux 全局状态管理 react-redux 优化模块 优化redux的使用过程 通过react-redux ...

  • React实战之Redux

    Redux、React-Redux 简介 Redux 是 JavaScript 状态容器,提供可预测化的状态管理。...

  • 分布式锁入门

    目前主流的有三种: 基于数据库实现 基于Redis实现 基于ZooKeeper实现 1. 基于数据库实现: 基于数...

  • 六、Admin 站点管理

    Admin 站点管理 用处 :提供数据库管理功能:基于admin模块,可以实现类似数据库客户端的功能,对数据进行增...

  • Angular技术点(NgRxStore)

    NgRx/Store @ngrx/store是基于RxJS的状态管理库。在NgRx中,状态是由一个包含action...

  • Flutter MVVM 开发范式

    基于Provider状态管理用来实现MVVM框架,采用的是 ViewModel 继承于 ChangeNotifie...

  • 基于hook实现的全局状态管理

    全局状态管理方式 1 .context 2 .redux 3 .hook 实现全局 简单版本 1 .使用

  • react-redux 源码解析

    前提 了解 redux,查看 Redux 分析 react-redux 解决的问题 负责应用的状态管理,保证单向数...

  • 分布式锁的实现方案

    一,分布式锁的实现方案 1,基于数据库实现分布式锁 2,基于缓存实现数据库锁(redis) 3,基于zookeep...

网友评论

    本文标题:实现基于react-redux的状态管理库

    本文链接:https://www.haomeiwen.com/subject/vwzwyqtx.html