前言:

  在项目中,模块过多,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,清除模块数据的更多相关文章

  1. Android清除本地数据缓存代码案例

    Android清除本地数据缓存代码案例 直接上代码: /*  * 文 件 名:  DataCleanManager.java  * 描    述:  主要功能有清除内/外缓存,清除数据库,清除shar ...

  2. chrome打开清除浏览数据窗口快捷键

    Ctrl+Shift+Del 打开清除浏览数据窗口 热键组合 实现的功能 F1 Google浏览器帮助中心 F12 打开Chrome控制台 Ctrl+J 进入“下载内容”页面 Ctrl+H 查看“历史 ...

  3. 从 vCenter Server 使用的数据库中清除旧数据 (2075138)(转)

    Document Id 2075138 Symptoms 免责声明: 本文为 Purging old data from the database used by VMware vCenter Ser ...

  4. kafka 清除topic数据脚本

    原 kafka 清除topic数据脚本 2018年07月25日 16:57:13 pete1223 阅读数:1028     #!/bin/sh       param=$1   echo " ...

  5. odoo10学习笔记二:继承(扩展)、模块数据

    转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/11189252.html 一:继承 在不改变底层对象的时候添加新的功能——这是通过继承机制来实现的,作为在现有 ...

  6. 第五章 Odoo 12开发之导入、导出以及模块数据

    大多数Odoo 模块的定义,如用户界面和安全规则,实际是存储在对应数据表中的数据记录.模块中的 XML 和 CSV 文件不是 Odoo 应用运行时使用,而是载入数据表的手段.正是因为这个原因,Odoo ...

  7. sqlserver 清除表数据和拷贝表结构的操作

    最近在做一个ERP系统需要导入数据,因此用到了sql的一些操作,在这里记录一下. 1.清除表数据: Delete from 表名称 where XXX 2.拷贝表结构,需求是新增一个和某个表数据格式一 ...

  8. 【Android】Android清除本地数据缓存代码

    最近做软件的时候,遇到了缓存的问题,在网上看到了这个文章,感觉不错.分享给大家看看 文章出处:http://www.cnblogs.com/rayray/p/3413673.html /* * 文 件 ...

  9. Android清除本地数据缓存代码

    /*  * 文 件 名:  DataCleanManager.java  * 描    述:  主要功能有清除内/外缓存,清除数据库,清除sharedPreference,清除files和清除自定义目 ...

随机推荐

  1. Bigger-Mai 养成计划,Python基础巩固四

    一.装饰器:定义:本质是函数,(装饰其他函数)就是为其他函数添加附加功能.原则:1.不能修改被装饰的函数的源代码 2.不能修改被装饰函数的调用方式实现装饰器的知识储备:1.函数即‘变量’2.高阶函数 ...

  2. Java — CommonUtil

    一些Java的公用方法: 1:获取当前时间 2:判断当前时间是否在时间date2之前3:比较时间大小4:获取某个时间的前n个小时5:返回某个字符串时间的Calendar对象6:判断两个时间段是否有重叠 ...

  3. 虚拟现实外包—动点飞扬软件专门承接VR/AR场景、游戏、项目外包

    VR外包AR外包公司(虚拟现实外包公司)承接虚拟现实项目开发(企业.教育.游戏.企业大数据展示等) 有VR/AR.Unity3D项目.游戏外包业务欢迎 联系我们 QQ:372900288 TEL:13 ...

  4. 详细分析Java中断机制-转载

    1. 引言 当我们点击某个杀毒软件的取消按钮来停止查杀病毒时,当我们在控制台敲入quit命令以结束某个后台服务时……都需要通过一个线程去取消另一个线程正在执行的任务.Java没有提供一种安全直接的方法 ...

  5. centos7 mysql数据库的安装与使用

    一:数据库的安装 第一步 下载数据库到主机,, 第二步 通过xshell将数据库压缩包上传至centos7虚拟主机(#注意:服务器主机需下载上传工具lrzsz   命令:yun -y install ...

  6. leecode第二百一十七题(存在重复元素)

    class Solution { public: bool containsDuplicate(vector<int>& nums) { set<int> s; for ...

  7. spring xml配置注入改为手动注入过程

    项目中需要使用MQ组件来接受消息,但是有的时候,在使用的时候,并不能满足spring注入的条件,无法注入.例如 在jfinal的config的afterJFinalStart中,由于jfinal集成s ...

  8. C语言实验一(2)

    #include<stdio.h>int main(){ char c1,c2; c1=97; c2=98; printf("c1=%c,c2=%c\n",c1,c2) ...

  9. 对mybatis的Handler 从使用角度介绍

    最近在开发中,涉及到了讲数据库查询的类型,直接转为java需要的类型. 由于对handler 理解不到位 和 使用不当.躺了一些坑. 主要涉及的有2种. 1.varchar 转 List<T&g ...

  10. 新版seqseq接口说明

    attention_mechanism = tf.contrib.seq2seq.BahdanauAttention(num_units=FLAGS.rnn_hidden_size, memory = ...