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 相关文章推荐
Google AJAX 搜索 API实现代码
Nov 17 Javascript
js购物车实现思路及代码(个人感觉不错)
Dec 23 Javascript
javascript间隔定时器(延时定时器)学习 间隔调用和延时调用
Jan 13 Javascript
javascript实现存储hmtl字符串示例
Apr 25 Javascript
JS在IE下缺少标识符的错误
Jul 23 Javascript
jQuery截取指定长度字符串代码
Aug 21 Javascript
jQuery获取checkbox选中的值
Jan 28 Javascript
js实现类bootstrap模态框动画
Feb 07 Javascript
浅谈JavaScript的innerWidth与innerHeight
Oct 12 Javascript
对vue事件的延迟执行实例讲解
Aug 28 Javascript
Vue+Element-UI实现上传图片并压缩
Nov 26 Javascript
Vue和React有哪些区别
Sep 12 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实现文件上传二法
2006/10/09 PHP
967 个函式
2006/10/09 PHP
在php中使用sockets:从新闻组中获取文章
2006/10/09 PHP
关于文本留言本的分页代码
2006/10/09 PHP
php中将图片gif,jpg或mysql longblob或blob字段值转换成16进制字符串
2011/08/23 PHP
ThinkPHP有变量的where条件分页实例
2014/11/03 PHP
php过滤输入操作之htmlentities与htmlspecialchars用法分析
2017/02/17 PHP
PHP实现基于图的深度优先遍历输出1,2,3...n的全排列功能
2017/11/10 PHP
PHP面向对象五大原则之接口隔离原则(ISP)详解
2018/04/04 PHP
实现PHP中session存储及删除变量
2018/10/15 PHP
实测jquery data()如何存值
2013/08/18 Javascript
利用jquery写的左右轮播图特效
2014/02/12 Javascript
js检测输入内容全为空格的方法
2014/05/03 Javascript
js实现class样式的修改、添加及删除的方法
2015/01/20 Javascript
Jquery 实现table样式的设定
2015/01/28 Javascript
JS实现pasteHTML兼容ie,firefox,chrome的方法
2016/06/22 Javascript
jQuery 遍历map()方法详解
2016/11/04 Javascript
vue调用高德地图实例代码
2017/04/28 Javascript
React Native 截屏组件的示例代码
2017/12/06 Javascript
vue自定义指令之面板拖拽的实现
2019/04/14 Javascript
vue中keep-alive组件的入门使用教程
2019/06/06 Javascript
微信小程序下拉加载和上拉刷新两种实现方法详解
2019/09/05 Javascript
ES5新增数组的实现方法
2020/05/12 Javascript
解决Vue-cli无法编译es6的问题
2020/10/30 Javascript
详解Vite的新体验
2021/02/22 Javascript
以一段代码为实例快速入门Python2.7
2015/03/31 Python
解决python opencv无法显示图片的问题
2018/10/28 Python
在Python中通过getattr获取对象引用的方法
2019/01/21 Python
用纯css3和html制作泡沫对话框实现代码
2013/03/21 HTML / CSS
html5拖曳操作 HTML5实现网页元素的拖放操作
2013/01/02 HTML / CSS
犹他州最古老的体育用品公司:Al’s
2020/12/18 全球购物
运动会表扬稿大全
2014/01/16 职场文书
物流管理专业毕业生求职信
2014/03/23 职场文书
CSS+HTML 实现顶部导航栏功能
2021/08/30 HTML / CSS
MySQ InnoDB和MyISAM存储引擎介绍
2022/04/26 MySQL
python playwright之元素定位示例详解
2022/07/23 Python