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 相关文章推荐
基于jQuery的左右滚动实现代码
Dec 03 Javascript
jquery获取下拉列表的值为null的解决方法
Mar 18 Javascript
JavaScript继承基础讲解(原型链、借用构造函数、混合模式、原型式继承、寄生式继承、寄生组合式继承)
Aug 16 Javascript
node.js中的http.response.removeHeader方法使用说明
Dec 14 Javascript
js使用post 方式打开新窗口
Feb 26 Javascript
EasyUI中combobox默认值注意事项
Mar 01 Javascript
js中scrollTop()方法和scroll()方法用法示例
Oct 03 Javascript
解决OneThink中无法异步提交kindeditor文本框中修改后的内容方法
May 05 Javascript
jQuery实现的自定义轮播图功能详解
Dec 28 jQuery
JavaScript自定义超时API代码实例
Apr 30 Javascript
vue项目接口域名动态获取操作
Aug 13 Javascript
原生js实现自定义滚动条
Jan 20 Javascript
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
PHP 上传文件大小限制
2009/07/05 PHP
PHP 获取客户端真实IP地址多种方法小结
2010/05/15 PHP
PHP中include和require的区别实例分析
2017/05/07 PHP
PHP 裁剪图片
2021/03/09 PHP
jQuery EasyUI API 中文文档 - Panel面板
2011/09/30 Javascript
面向对象的Javascript之一(初识Javascript)
2012/01/20 Javascript
子页向父页传值示例
2013/11/27 Javascript
JavaScript 中对象的深拷贝
2016/12/04 Javascript
微信小程序开发探究
2016/12/27 Javascript
清空元素html(&quot;&quot;) innerHTML=&quot;&quot; 与 empty()的区别和应用(推荐)
2017/08/14 Javascript
JQuery 获取多个select标签option的text内容(实例)
2017/09/07 jQuery
js + css实现标签内容切换功能(实例讲解)
2017/10/09 Javascript
微信小程序实现添加手机联系人功能示例
2017/11/30 Javascript
JavaScript实现封闭区域布尔运算的示例代码
2018/06/25 Javascript
微信小程序开发实现消息推送
2020/11/18 Javascript
[02:20]2014DOTA2西雅图邀请赛 MVP外卡赛首胜采访
2014/07/09 DOTA
python实现系统状态监测和故障转移实例方法
2013/11/18 Python
Python的Bottle框架中获取制定cookie的教程
2015/04/24 Python
探究Python的Tornado框架对子域名和泛域名的支持
2015/05/02 Python
分享Python文本生成二维码实例
2016/01/06 Python
基于Python函数的作用域规则和闭包(详解)
2017/11/29 Python
解决pyttsx3无法封装的问题
2018/12/24 Python
对python多线程中Lock()与RLock()锁详解
2019/01/11 Python
Python如何将图像音视频等资源文件隐藏在代码中(小技巧)
2020/02/16 Python
Python scrapy爬取小说代码案例详解
2020/07/09 Python
Html5 滚动穿透的方法
2019/05/13 HTML / CSS
建筑自我鉴定
2013/10/19 职场文书
工程业务员岗位职责
2013/12/31 职场文书
拓展策划方案
2014/06/03 职场文书
幼儿园感恩节活动方案2014
2014/10/11 职场文书
六查六看心得体会
2014/10/14 职场文书
小马王观后感
2015/06/11 职场文书
2016父亲节感恩话语
2015/12/09 职场文书
2016秋季运动会开幕词
2016/03/04 职场文书
残联2016年全国助残日活动总结
2016/04/01 职场文书
JS的深浅复制详细
2021/10/16 Javascript