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 性能优化指南 (1)
May 21 Javascript
jqgrid 简单学习笔记
May 03 Javascript
javascript中的事件代理初探
Mar 08 Javascript
node.js中的events.emitter.once方法使用说明
Dec 10 Javascript
jQuery鼠标悬浮链接弹出跟随图片实例代码
Jan 08 Javascript
使用pcs api往免费的百度网盘上传下载文件的方法
Mar 17 Javascript
基于angularJS的表单验证指令介绍
Oct 21 Javascript
详解jQuery中基本的动画方法
Dec 14 Javascript
Vue过滤器的用法和自定义过滤器使用
Feb 08 Javascript
Bootstrap 3 按钮标签实例代码
Feb 21 Javascript
react-native中ListView组件点击跳转的方法示例
Sep 30 Javascript
详解Angular5 服务端渲染实战
Jan 04 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后台多用户权限组思路与实现程序代码分享
2012/02/13 PHP
thinkphp区间查询、统计查询与SQL直接查询实例分析
2014/11/24 PHP
php + nginx项目中的权限详解
2017/05/23 PHP
php面向对象程序设计中self与static的区别分析
2019/05/21 PHP
如何在Laravel之外使用illuminate组件详解
2020/09/20 PHP
用于table内容排序
2006/07/21 Javascript
javascript在一段文字中的光标处插入其他文字
2007/08/26 Javascript
Dojo 学习笔记入门篇 First Dojo Example
2009/11/15 Javascript
使用jquery实现图文切换效果另加特效
2013/01/20 Javascript
extjs render 用法介绍
2013/09/11 Javascript
Jquery倒计时源码分享
2014/05/16 Javascript
基于Css3和JQuery实现打字机效果
2015/08/11 Javascript
jQuery网页选项卡插件rTabs用法实例分析
2015/08/26 Javascript
浅谈js中字符和数组一些基本算法题
2016/08/15 Javascript
JS实现手写parseInt的方法示例
2017/09/24 Javascript
深入剖析Express cookie-parser中间件实现示例
2018/02/01 Javascript
JS设计模式之访问者模式定义与用法分析
2018/02/05 Javascript
JavaScript中的E-mail 地址格式验证
2018/03/28 Javascript
微信小程序自定义轮播图
2018/11/04 Javascript
在Koa.js中实现文件上传的接口功能
2019/10/08 Javascript
Vue移动端用淘宝弹性布局lib-flexible插件做适配的方法
2020/05/26 Javascript
[01:11:21]DOTA2-DPC中国联赛 正赛 Phoenix vs CDEC BO3 第三场 3月7日
2021/03/11 DOTA
python抓取京东价格分析京东商品价格走势
2014/01/09 Python
python中字符串变二维数组的实例讲解
2018/04/03 Python
OpenCV-Python 摄像头实时检测人脸代码实例
2019/04/30 Python
基于python实现计算两组数据P值
2020/07/10 Python
HTML5 Canvas实现放大镜效果示例
2020/03/25 HTML / CSS
Champion澳大利亚官网:美国冠军运动服装
2018/05/07 全球购物
打架检讨书100字
2014/01/19 职场文书
六一儿童节主持词
2014/03/21 职场文书
竞选学生会演讲稿
2014/04/25 职场文书
纪委书记群众路线整改措施思想汇报
2014/10/09 职场文书
《怀念母亲》教学反思
2016/02/19 职场文书
Mysql中 unique列插入重复值该怎么解决呢
2021/05/26 MySQL
实现GO语言对数组切片去重
2022/04/20 Golang
python神经网络学习 使用Keras进行简单分类
2022/05/04 Python