• 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
        }
    }
  • 相关阅读:
    ES6 变量的解构赋值
    【js重学系列】new
    【js面试系列】手写常见js方法
    【js重学系列】this
    js-继承
    【js重学系列】数组高阶函数
    【js面试系列】数组去重
    云服务器部署项目-基本使用流程
    mongodb-基本使用
    移动端适配
  • 原文地址:https://www.cnblogs.com/hellolol/p/11285092.html
Copyright © 2020-2023  润新知