zoukankan      html  css  js  c++  java
  • 1、redux源码探索

    一、创建store

    const {createStore} = Redux;
    //reducer是研发自己写的reducer函数
    //preloadState是初始state数据
    //enhancer这是对dispatch进行加强,即中件间
    const store = createStore(reducer, preloadState, enhancer)

    store作为一个对象,提供了以下方法

    {
        dispatch, //触发更新store的方法
        getState, //直接获取页面数据状态的方法
        subscribe, //订阅store状态变化的方法
        replaceReducer //替换reducer
    } = store

    上面的方法使用方式(不依赖 react):

    //订阅store状态的变化,适时渲染
    const render = () => {
        document.body.innerText = store.getState();
    }
    store.subscribe(render);
    render();
    //响应页面交互
    document.addEventListener('click', () => {
        store.dispatch({
            type: 'example'
        })
    })

    分析:

    //1、store实例持有当前状态。使用闭包的方式
    const createStore = () => {
        //存储当前状态
        let state;
        const getState = () => state;
        const display = (action) => {...};
        const subscribe = () => {...};
        return {
            getState, display, subscribe
        }
    }

    以上是基本的方案。

    然后经分析可以用发布订阅模式实现:

    const createStore = (reducer) => {
        let state;
        //listeners用来存储所有的监听函数
        let listeners = []
        const getState = () => state;
        const display = (action) => {
            state = reducer(state, action);
            //每一次状态更新后,都需要调用listeners数组中的每一个监听函数
            listeners.forEach(listener => listener());
        }
        const subscribe = (listener) => {
            //subscribe可能会被调用多次,每一次调用时,都将相关的监听函数存入listeners数组中
            listeners.push(listener);
            //返回一个函数,进行取消订阅
            return () => {
                listeners = listeners.filter(item => item !== listener);
            }
        }
        return {
            getState,
            dispatch,
            subscribe
        }
    }
  • 相关阅读:
    在下拉框中选择数据
    代码添加批处理类
    重置用户状态(初始化用户)
    当前窗口控制(显示、隐藏、破坏)
    窗体分隔符实现
    使用USB移动硬盘 遭遇 "Windows无法为Volume加载安装程序。请于硬件供应商联系,寻求协助" 错误,“灰鸽子”后遗症的处理
    使用IDL创建TypeLib(.tlb)文件
    ngrep使用方法
    常用的正则表达式
    治疗鼻炎的药
  • 原文地址:https://www.cnblogs.com/hellolol/p/11285092.html
Copyright © 2011-2022 走看看