封装redux中的createStore

2023-12-18 15:32
文章标签 封装 redux createstore

本文主要是介绍封装redux中的createStore,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

redux用于react中的状态管理,其中不能直接修改redux中的状态,需要通过dispatch方法才能修改react中的状态。

createStore函数中存放着状态信息state,它的执行结果返回一个store对象,返回的对象包含:

getState(获取store中的state状态信息,但是不能直接修改store中的state信息)
dispatch(修改store中的state信息)
subscribe(用于订阅事件)
<div>
    <div id="title"></div>
    <div id="content"></div>
</div>
<script>
    function createStore(reducer) {
        // 定义store对象中的状态信息对象,此处必须是只定义不赋值,因为这样在下面的dispatch初始化state时才能使用默认值初始化state
        let state;
        // listener是一个事件池,存储订阅的方法
        let listener = [];
        // 在createStore作用域下创建getState函数,该函数需要返回一个新对象,该对象需要和state一样。这个方法只用于获取state
        // 深克隆:将当前作用域下的state深克隆一份,让外界利用这个方法只能获取state不能修改state
        let getState = () => JSON.parse(JSON.stringify(state));
        // 定义修改state的函数dispatch。action中的type一般是const大写的常量
        function dispatch(action) {
            state = reducer(state,action);
            // 在dispatch中执行订阅的方法
            listener.forEach((item,index)=>{
                if(typeof item==="function"){
                    item();
                }
            });
        }
        // 这个函数的执行是在初始化state对象
        dispatch({});
        // 在createStore中有一个订阅方法subscribe,该函数返回取消订阅的函数
        let subscribe = (fn)=>{
            listener.push(fn);
            // 返回取消订阅的方法,当返回值执行时就会取消该订阅
            return ()=>{
                listener = listener.filter(item=>item!==fn);
            };
        };
        return {
            getState, dispatch,subscribe
        };
    }
    let initState = {
        title: { color: 'red', text: '你好' },
        content: { color: 'yellow', text: '中国' }
    };
    const CHANGE_TITLE_TEXT = "CHANGE_TITLE_TEXT";
    const CHANGE_CONTENT_COLOR = "CHANGE_CONTENT_COLOR";
    function reducer(state = initState, action) {
        switch (action.type) {
            case CHANGE_TITLE_TEXT:
                // 当解构出现重名,后面覆盖前面
                return { ...state, title: { ...state.title, text: action.text } };
            case CHANGE_CONTENT_COLOR:
                return { ...state, content: { ...state.content, color: action.color } };
            default:
                return state;
        }
    }
    let store = createStore(reducer);
    // 数据渲染title、content
    function renderTile() {
        let title = document.getElementById("title");
        title.innerHTML = store.getState().title.text;
        title.style.color = store.getState().title.color;
    }
    function renderContent() {
        let content = document.getElementById("content");
        content.innerHTML = store.getState().content.text;
        content.style.color = store.getState().content.color;
    }
    function renderApp() {
        renderTile();
        renderContent();
    }
    renderApp();
    // redux中规定,不能直接修改state中的数据,必须通过dispatch来修改state中的数据
    let f = store.subscribe(renderApp);
    // f();//这个方法执行就会取消订阅的方法
    setTimeout(() => {
        store.dispatch({ type: CHANGE_TITLE_TEXT, text: '加油' });
        store.dispatch({ type: CHANGE_CONTENT_COLOR, color: 'black' });
        // renderApp();
    }, 3000);
</script>

————————————————
版权声明:本文为CSDN博主「fengyezi159」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u010510187/article/details/101557187

这篇关于封装redux中的createStore的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/508924

相关文章

C++实现封装的顺序表的操作与实践

《C++实现封装的顺序表的操作与实践》在程序设计中,顺序表是一种常见的线性数据结构,通常用于存储具有固定顺序的元素,与链表不同,顺序表中的元素是连续存储的,因此访问速度较快,但插入和删除操作的效率可能... 目录一、顺序表的基本概念二、顺序表类的设计1. 顺序表类的成员变量2. 构造函数和析构函数三、顺序表

Go语言利用泛型封装常见的Map操作

《Go语言利用泛型封装常见的Map操作》Go语言在1.18版本中引入了泛型,这是Go语言发展的一个重要里程碑,它极大地增强了语言的表达能力和灵活性,本文将通过泛型实现封装常见的Map操作,感... 目录什么是泛型泛型解决了什么问题Go泛型基于泛型的常见Map操作代码合集总结什么是泛型泛型是一种编程范式,允

JavaSE——封装、继承和多态

1. 封装 1.1 概念      面向对象程序三大特性:封装、继承、多态 。而类和对象阶段,主要研究的就是封装特性。何为封装呢?简单来说就是套壳屏蔽细节 。     比如:对于电脑这样一个复杂的设备,提供给用户的就只是:开关机、通过键盘输入,显示器, USB 插孔等,让用户来和计算机进行交互,完成日常事务。但实际上:电脑真正工作的却是CPU 、显卡、内存等一些硬件元件。

哈希表的封装和位图

文章目录 2 封装2.1 基础框架2.2 迭代器(1)2.3 迭代器(2) 3. 位图3.1 问题引入3.2 左移和右移?3.3 位图的实现3.4 位图的题目3.5 位图的应用 2 封装 2.1 基础框架 文章 有了前面map和set封装的经验,容易写出下面的代码 // UnorderedSet.h#pragma once#include "HashTable.h"

封装MySQL操作时Where条件语句的组织

在对数据库进行封装的过程中,条件语句应该是相对难以处理的,毕竟条件语句太过于多样性。 条件语句大致分为以下几种: 1、单一条件,比如:where id = 1; 2、多个条件,相互间关系统一。比如:where id > 10 and age > 20 and score < 60; 3、多个条件,相互间关系不统一。比如:where (id > 10 OR age > 20) AND sco

Java封装构造方法

private/public的分装 被public修饰的成员变量或者是成员方法,可以被类的调用对象直接使用 而private修饰的成员变量和方法,不能被类的调用对象使用 例如: 可以看到我们是不能在main方法中直接调用被private修饰的变量 当然我们可以在我们定义的TestMode类中可以定一个方法show,然后在调用show方法实现 这里我们可以清楚了解 private 不光可以修

C++数据结构重要知识点(5)(哈希表、unordered_map和unordered_set封装)

1.哈希思想和哈希表 (1)哈希思想和哈希表的区别 哈希(散列、hash)是一种映射思想,本质上是值和值建立映射关系,key-value就使用了这种思想。哈希表(散列表,数据结构),主要功能是值和存储位置建立映射关系,它通过key-value模型中的key来定位数组的下标,将value存进该位置。 哈希思想和哈希表数据结构这两个概念要分清,哈希是哈希表的核心思想。 (2)unordered

OOP三个基本特征:封装、继承、多态

OOP三个基本特征:封装、继承、多态 C++编程之—面向对象的三个基本特征 默认分类 2008-06-28 21:17:04 阅读12 评论1字号:大中小     面向对象的三个基本特征是:封装、继承、多态。     封装 封装最好理解了。封装是面向对象的特征之一,是对象和类概念的主要特性。   封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信

Android 优雅封装Glide

文章目录 Android 优雅封装Glide核心思想定义策略接口定义图片选项实现Glide策略图片管理类使用 Android 优雅封装Glide 核心思想 使用策略模式实现不同图片加载框架的切换,使用建造者设计模式处理不同参数,最后通过 ImageLoader 进行管理。 定义策略接口 interface ILoaderStrategy {fun loadImage(co

JS 封装方式

引言:本人是后台服务端开发的,前端的 js 都是在 html 中的 script 标签中写的,处理下数据啥,如果要有需要公共使用的方法啥的都是把方法直接丢在一个 js 文件里,然后 html 引入使用,没有关注过 js 的封装。这天突然对 js 的封装有了兴趣所以有了本文,一下是本人的一些见解。不深见谅。 素材使用的是若依框架中的 ry-ui.js 以及 vue.js ,这里只说封装,不说功能。