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 相关文章推荐
从JavaScript的函数重名看其初始化方式
Mar 08 Javascript
一些常用且实用的原生JavaScript函数
Sep 08 Javascript
js常用代码段收集
Oct 28 Javascript
『jQuery』名称冲突使用noConflict方法解决
Apr 22 Javascript
js 获取屏幕各种宽高的方法(浏览器兼容)
May 15 Javascript
JS实现点击复选框将按钮或文本框变为灰色不可用的方法
Aug 11 Javascript
jQuery Validate验证框架详解(推荐)
Dec 17 Javascript
基于vue+ bootstrap实现图片上传图片展示功能
May 17 Javascript
layui table 获取分页 limit的方法
Sep 20 Javascript
ElementUI之Message功能拓展详解
Oct 18 Javascript
js实现查询商品案例
Jul 22 Javascript
vuex存取值和映射函数使用说明
Jul 24 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_Cooikes不同页面无法传递的解决方法
2014/03/07 PHP
常用PHP框架功能对照表
2014/10/23 PHP
php版银联支付接口开发简明教程
2016/10/14 PHP
js的表单操作 简单计算器
2011/12/29 Javascript
JS中的substring和substr函数的区别说明
2013/05/07 Javascript
js 动态修改css文件的方法
2014/08/05 Javascript
jquery制作 随机弹跳的小球特效
2015/02/01 Javascript
js兼容火狐显示上传图片预览效果的方法
2015/05/21 Javascript
五种js判断是否为整数类型方式
2015/12/03 Javascript
jquery实现倒计时功能
2015/12/28 Javascript
node.js请求HTTPS报错:UNABLE_TO_VERIFY_LEAF_SIGNATURE\的解决方法
2016/12/18 Javascript
JS基于递归算法实现1,2,3,4,5,6,7,8,9倒序放入数组中的方法
2017/01/03 Javascript
Javascript调试之console对象——你不知道的一些小技巧
2017/07/10 Javascript
IScroll那些事_当内容不足时下拉刷新的解决方法
2017/07/18 Javascript
vue router使用query和params传参的使用和区别
2017/11/13 Javascript
jquery中有哪些api jQuery主要API
2017/11/20 jQuery
vue-cli webpack配置文件分析
2019/05/20 Javascript
Vue-cli3.X使用px2 rem遇到的问题及解决方法
2019/08/08 Javascript
从零搭一个自用的前端脚手架的方法步骤
2019/09/23 Javascript
webpack+express实现文件精确缓存的示例代码
2020/06/11 Javascript
浅谈vue生命周期共有几个阶段?分别是什么?
2020/08/07 Javascript
JavaScript实现单点登录的示例
2020/09/23 Javascript
详解webpack的clean-webpack-plugin插件报错
2020/10/16 Javascript
[03:09]2014DOTA2国际邀请赛 Mushi前队友送上祝福
2014/07/12 DOTA
Python中使用partial改变方法默认参数实例
2015/04/28 Python
python 中的list和array的不同之处及转换问题
2018/03/13 Python
Python 3.8中实现functools.cached_property功能
2019/05/29 Python
python与C、C++混编的四种方式(小结)
2019/07/15 Python
Python pandas 列转行操作详解(类似hive中explode方法)
2020/05/18 Python
python小白切忌乱用表达式
2020/05/29 Python
Pycharm打开已有项目配置python环境的方法
2020/07/03 Python
班级德育工作实施方案
2014/02/21 职场文书
大学生活动总结怎么写
2014/04/29 职场文书
学校四群教育实施方案
2014/06/12 职场文书
2014年小学数学教师工作总结
2014/12/03 职场文书
pytorch 如何把图像数据集进行划分成train,test和val
2021/05/31 Python