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
        }
    }
  • 相关阅读:
    Dockerfile简介及基于centos7的jdk镜像制作
    docker数据卷(Data Volumes)
    docker入门及常用命令
    Failed to start bean ‘org.springframework.kafka.config.internalKafkaListenerEndpointRegistry
    dubbo服务启动报:qos-server can not bind localhost:22222s
    Dubbo服务调用Failed to invoke the method错误记录
    java8-list转Map
    git remote: HTTP Basic: Access denied 错误解决办法
    SSH整合(二)
    SSH整合
  • 原文地址:https://www.cnblogs.com/hellolol/p/11285092.html
Copyright © 2011-2022 走看看