博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Redux源码了解一下
阅读量:6804 次
发布时间:2019-06-26

本文共 2041 字,大约阅读时间需要 6 分钟。

开始阅读前先回顾一下Redux的几个基本的API

  1. const store = createStore(reducer)
  2. store.dispatch(action)发起一个动作让reducer匹配
  3. const state = store.getState()获取当前的state
  4. store.subscribe(listener)添加监听,每次dispatch都会触发监听函数
  5. bindActionCreators(actions,dispatch)

具体的调用

const reducer = (state=initialState,action){    switch(action.type){        case add:            return state+1;        case delete:             return state-1;        default:            return 0;    }}const store = createStore(reducer)const state = store.getState()const listener = () =>{    console.log(`现在有${store.getState()把枪}`)}store.subscribe(listener);store.dispatch({
type:add})复制代码

Redux/createStore的简单实现

先理清思路

  1. createStore函数创建的对象有getState、dispatch、subscribe方法
  2. 创建完就可以获取到初始值default,那么在内部是不是就默认dispatch了一个特别特别特殊的action,来区别用户的action.type
  3. 每次dispatch都会触发subscribe订阅的监听函数
export function createStore(reducer){    let currentState = {};  // 注意这里,在后面的react-redux源码中应该判断是否为空来返回initialState    let currentListeners = [];    // getState比较简单就是返回当前state就行了    function getState(){        return currentState;    }    // 每订阅一个监听函数就推到监听函数数组里面    function subscribe(listener){        currentListener.push(listener);    }    /*    *   最主要就是dispatch如何实现了    *   1. 首先是要改变state对吧?    *   2. 然后要触发listener    *   3. 返回一个action对象    */    function dispatch(action){        currentState = reducer(currentState,action);        currentListeners.forEach(v=>v())        return action    }    // 这里手动dispatch一个动作来返回初始state    dispatch({
type:'@huangbin-redux-study'}) return {getState,subscribe,dispatch}}复制代码

bindActionCreator实现:其实就是给action绑定上dispatch

// function bindActionCreator(action,dispatch){
// return (...args)=> dispatch(action(...args))// }export function bindActionCreators(actions,dispatch){ const bound = {}; // 绑定后的 Object.keys(actions).forEach(item=>{ // bound[item] = bindActionCreator(actions[item],dispatch) bound[item] = (...args) =>dispatch(actions[item](...args)); }) console.log(bound); return bound;}复制代码

转载于:https://juejin.im/post/5adc1198518825670f7b6f36

你可能感兴趣的文章
配置阿里yum源
查看>>
Spring MVC基础了解
查看>>
金九银十中,看看这31道Android面试题
查看>>
static 语句块
查看>>
函数节流和函数防抖
查看>>
51CTO专访:谈谈SOC安全管理平台
查看>>
使用USB直接方式解决ESXi识别加密狗的问题
查看>>
创新团队中常见的几种“怪人”
查看>>
FreeBSD从零开始---Web服务器搭建(二)
查看>>
磁盘空间未释放异常案例
查看>>
Windows Server 2008 R2的DHCP高可用
查看>>
《网络工程师软考辅导——3年真题详解与全真模拟》主要创新点、关注点
查看>>
判断网址能不能访问
查看>>
Puppet 笔记 package file services
查看>>
CentOS 6.6 HAProxy安装配置指南
查看>>
用例设计大全(整理)
查看>>
C++对象数组的实例学习
查看>>
SQL Server 2012内存
查看>>
向云上迁移数据时如何避免停机和中断
查看>>
Spacewalk 1.7 With PostgreSQL
查看>>