dva,清除模块数据
前言:
在项目中,模块过多,dva使用namespace分离模块后,若没有在模块卸载后清除对应的数据,下次进入时,有可能会有上一次数据的残留。
比如详情页,从A商品的详情页离开后,返回选择B商品进入,此时在B商品信息加载之前可能存在A的残留信息。
诸如此类,若模块过多,需要在每个模块的WillUnmount中去clear又太麻烦。
方法:
在model层扩展。大概思路如下:
在model-extend.js中配置各种扩展model的[enhanceItems]对象,里面存储各种扩展model的function,这些function接收来自model的参数,然后返回一个接受model,返回扩展后的model的函数。
返回上面的需求,在enhanceItems里配置一个enhanceClear,然后监听路由的变化,在满足条件的时候,dispatch(clear)
伪代码:
enhanceItems = {
enhance1,
enhance2
}
enhance1 = (param) => {
.....//扩展
return model => newModel
}
show me the code
// model.js
enhanceModel({
enhanceClear: {
reg: /\/detail/,
clearReducer: { type: 'clearDetail' },
},
})(model) // utils/model-extend.js
const enhanceClear = (param) => {
const { reg, clearReducer } = param;
if (reg && clearReducer) {
const clearWrapped = (subscriber) => { // 包装clearWrapped
return (props) => {
const { dispatch, history } = props;
history.listenBefore(({ pathname }) => { // 监听跳转前的动作
const isout = reg.test(history.getCurrentLocation().pathname)
&& !reg.test(pathname);
isout && dispatch(clearReducer);
});
subscriber({ ...props });
};
};
return (model) => {
if (!model.subscriptions) model.subscriptions = { setup() {} };
model.subscriptions.setup = clearWrapped(model.subscriptions.setup || (() => {}));
return model;
};
}
return model => model;// 若没有相应参数,则返回原数据函数
}; const enhanceItems = {
enhanceClear,
};
export const enhanceModel = (param) => {
const enhanceFuns = [];
Object.keys(param).forEach((key) => {
enhanceItems[key] && enhanceFuns.push(enhanceItems[key](param[key]));
});
return (model) => {
if (enhanceFuns.length === ) return model;
return enhanceFuns.reduce((newModel, fun) => {
return (typeof fun === 'function') ? fun(newModel) : newModel;
}, model);
};
};
dva,清除模块数据的更多相关文章
- Android清除本地数据缓存代码案例
Android清除本地数据缓存代码案例 直接上代码: /* * 文 件 名: DataCleanManager.java * 描 述: 主要功能有清除内/外缓存,清除数据库,清除shar ...
- chrome打开清除浏览数据窗口快捷键
Ctrl+Shift+Del 打开清除浏览数据窗口 热键组合 实现的功能 F1 Google浏览器帮助中心 F12 打开Chrome控制台 Ctrl+J 进入“下载内容”页面 Ctrl+H 查看“历史 ...
- 从 vCenter Server 使用的数据库中清除旧数据 (2075138)(转)
Document Id 2075138 Symptoms 免责声明: 本文为 Purging old data from the database used by VMware vCenter Ser ...
- kafka 清除topic数据脚本
原 kafka 清除topic数据脚本 2018年07月25日 16:57:13 pete1223 阅读数:1028 #!/bin/sh param=$1 echo " ...
- odoo10学习笔记二:继承(扩展)、模块数据
转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/11189252.html 一:继承 在不改变底层对象的时候添加新的功能——这是通过继承机制来实现的,作为在现有 ...
- 第五章 Odoo 12开发之导入、导出以及模块数据
大多数Odoo 模块的定义,如用户界面和安全规则,实际是存储在对应数据表中的数据记录.模块中的 XML 和 CSV 文件不是 Odoo 应用运行时使用,而是载入数据表的手段.正是因为这个原因,Odoo ...
- sqlserver 清除表数据和拷贝表结构的操作
最近在做一个ERP系统需要导入数据,因此用到了sql的一些操作,在这里记录一下. 1.清除表数据: Delete from 表名称 where XXX 2.拷贝表结构,需求是新增一个和某个表数据格式一 ...
- 【Android】Android清除本地数据缓存代码
最近做软件的时候,遇到了缓存的问题,在网上看到了这个文章,感觉不错.分享给大家看看 文章出处:http://www.cnblogs.com/rayray/p/3413673.html /* * 文 件 ...
- Android清除本地数据缓存代码
/* * 文 件 名: DataCleanManager.java * 描 述: 主要功能有清除内/外缓存,清除数据库,清除sharedPreference,清除files和清除自定义目 ...
随机推荐
- Javascript的千分位和去除千分位
1.转成千分位,保留两位 comdify(n) { let num = Number(n); let re = /\d{1,3}(?=(\d{3})+$)/g; let n1 = num.toFixe ...
- Python游戏编程入门4
Math和Graphics:Analog Clock示例程序本章介绍Python的math模块,该模块可以执行计算,如常见的三角正弦函数.余弦函数.正切函数等. 使用正弦和余弦函数绘制圆创建Anlog ...
- vue-cli3.0 笔记
vue-cli 3.0 npm install -g @vue/cli # OR yarn global add @vue/cli ui 界面创建项目 vue ui 命令行创建项目 步骤 vu ...
- Go 嵌入类型
文章转载地址:https://www.flysnow.org/2017/04/06/go-in-action-go-embedded-type.html 嵌入类型或嵌套类型,这是一种可以把已有类型的声 ...
- django项目上线环境部署
django项目上线环境部署 第一步 安装python虚拟环境 1 安装虚拟环境virtualenv 2 安装virtualenvwrapper工具 3 确认virtualenvwrapper.sh脚 ...
- PowerDesigner大小写转换
在菜单栏找到:Tools-->Execute Commands --> Edit/Run Script 快捷键:Ctrl+Shift+X 输入下边的代码就可以了.(UCase大写 LCas ...
- postgis 随笔
一.表的定义: 对于任何一种关系型数据库而言,表都是数据存储的最核心.最基础的对象单元.现在就让我们从这里起步吧. 1. 创建表: CREATE TABLE products ( ...
- 自动生成CHANGELOG.md
$ npm install -g conventional-changelog-cli $ cd my-project $ conventional-changelog -p angular -i C ...
- 使用npm私有服务器保存公司内部强业务类型组件(三):关于业务性组件的一点思考
编写业务性组件最难的地方不在于技术,而在于沟通, 1:前端将业务给封装了起来,必然导致产品在设计的时候多了一层考虑,在新增功能的时候 他要考虑这个功能是不是在其他项目也需要,如果不是的话,就不应该放在 ...
- Dividing the numbers CodeForces - 899C (构造)
大意: 求将[1,n]划分成两个集合, 且两集合的和的差尽量小. 和/2为偶数最小差一定为0, 和/2为奇数一定为1. 显然可以通过某个前缀和删去一个数得到. #include <iostrea ...