react 创建单例组件的方法


Posted in Javascript onApril 26, 2018

需求背景

最近有个需求,需要在项目中添加一个消息通知弹窗,告知用户一些信息。

用户看过消息后,就不再弹窗了。

问题

很明显,这个需要后端的介入,提供相应的接口(这样可扩展性更好)。

在开发过程中,遇到个问题:由于我们的系统是多页面的,所以每次切换页面,都会去请求后端的消息接口。。有一定的性能损耗。

因为是多页面系统,使用单例组件貌似也没啥意义(不过是个机会学习学习单例组件是怎么写的)。
于是,想到使用浏览器缓存来记录是否弹过窗了(当然,得设定过期时间)。

如何写单例组件

1、工具函数:

import ReactDOM from 'react-dom';

/**
 * ReactDOM 不推荐直接向 document.body mount 元素
 * 当 node 不存在时,创建一个 div
 */
function domRender(reactElem, node) {
 let div;
 if (node) {
  div = typeof node === 'string'
   ? window.document.getElementById(node)
   : node;
 } else {
  div = window.document.createElement('div');
  window.document.body.appendChild(div);
 }
 return ReactDOM.render(reactElem, div);
}

2、组件:

export class SingletonLoading extends Component {
 globalLoadingCount = 0;
 pageLoadingCount = 0;

 state = {
  show: false,
  className: '',
  isGlobal: undefined
 }

 delayTimer = null;

 start = (options = {}) => {
  // ...
 }

 stop = (options = {}) => {
  // ...
 }

 stopAll() {
  if (!this.state.show) return;
  this.globalLoadingCount = 0;
  this.pageLoadingCount = 0;
  this.setState({show: false});
 }

 get isGlobalLoading() {
  return this.state.isGlobal && this.state.show;
 }

 get noWaiting() {
  return this.noGlobalWaiting && this.pageLoadingCount < 1;
 }

 get toPageLoading() {
  return this.noGlobalWaiting && this.isGlobalLoading;
 }

 get noGlobalWaiting() {
  return this.globalLoadingCount < 1;
 }

 render() {
  return <BreakLoading {...this.state} />;
 }
}

// 使用上面的工具函数
export const loading = domRender(<SingletonLoading />);

3、使用组件:

import loading from 'xxx';

// ...
loading.start();
loading.stop();

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
document.compatMode介绍
May 21 Javascript
javascript实现的DES加密示例
Oct 30 Javascript
JavaScript+CSS无限极分类效果完整实现方法
Dec 22 Javascript
Easyui Datagrid自定义按钮列(最后面的操作列)
Jul 13 Javascript
javascript 中select框触发事件过程的分析
Aug 01 Javascript
Vue实现typeahead组件功能(非常靠谱)
Aug 26 Javascript
vue组件父与子通信详解(一)
Nov 07 Javascript
浅谈angularJs函数的使用方法(大小写转换,拷贝,扩充对象)
Oct 08 Javascript
Vue常用的几个指令附完整案例
Nov 06 Javascript
js实现指定时间倒计时效果
Aug 26 Javascript
Vue实现可移动水平时间轴
Jun 29 Javascript
vue中div禁止点击事件的实现
Apr 02 Vue.js
node打造微信个人号机器人的方法示例
Apr 26 #Javascript
Vue 使用中的小技巧
Apr 26 #Javascript
基于Vue实现拖拽功能
Jul 29 #Javascript
vuex操作state对象的实例代码
Apr 25 #Javascript
微信小程序商品详情页的底部弹出框效果
Nov 16 #Javascript
你点的 ES6一些小技巧,请查收
Apr 25 #Javascript
vue 组件使用中的一些细节点
Apr 25 #Javascript
You might like
用PHP4访问Oracle815
2006/10/09 PHP
使用PHP实现阻止用户上传成人照片或者裸照
2014/12/25 PHP
JQuery.Ajax之错误调试帮助信息介绍
2013/07/04 Javascript
node.js实现逐行读取文件内容的代码
2014/06/27 Javascript
JavaScript基本数据类型及值类型和引用类型
2015/08/25 Javascript
探究JavaScript函数式编程的乐趣
2015/12/14 Javascript
详解js图片轮播效果实现原理
2015/12/17 Javascript
jQuery常用的一些技巧汇总
2016/03/26 Javascript
js获取客户端操作系统类型的方法【测试可用】
2016/05/27 Javascript
js+css3实现旋转效果
2017/01/20 Javascript
Angular2下使用pdf插件的方法详解
2017/04/29 Javascript
javascript canvas检测小球碰撞
2020/04/17 Javascript
vue页面跳转实现页面缓存操作
2020/07/22 Javascript
[00:32]2016完美“圣”典风云人物:Maybe宣传片
2016/12/05 DOTA
Python带动态参数功能的sqlite工具类
2018/05/26 Python
Python批处理更改文件名os.rename的方法
2018/10/26 Python
python3.7环境下安装Anaconda的教程图解
2019/09/10 Python
python hmac模块验证客户端的合法性
2020/11/07 Python
css3中background新增的4个新的相关属性用法介绍
2013/09/26 HTML / CSS
美国顶级品牌男士大码服装店:DXL
2017/08/30 全球购物
英国性能汽车零件和发动机配件在线:Maxpeedingrods
2019/11/05 全球购物
英国书籍、CD、DVD和游戏的第一道德零售商:Awesome Books
2020/02/22 全球购物
网络技术支持面试题
2013/04/22 面试题
软件配置管理有什么好处
2015/04/15 面试题
如何用Java实现列出某个目录下的所有子目录
2015/07/20 面试题
护士检查书
2014/01/17 职场文书
聘用意向书范本
2014/04/01 职场文书
社会学专业求职信
2014/07/17 职场文书
工厂标语大全
2014/10/06 职场文书
公司经营目标责任书
2015/01/29 职场文书
2015年公务员工作总结
2015/04/24 职场文书
光荣之路观后感
2015/06/12 职场文书
2015年防灾减灾工作总结
2015/07/24 职场文书
2015年秋学期师德师风建设工作总结
2015/10/23 职场文书
《中华上下五千年》读后感3篇
2019/11/29 职场文书
python-opencv 中值滤波{cv2.medianBlur(src, ksize)}的用法
2021/06/05 Python