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 valueOf 使用方法
Dec 28 Javascript
Textarea与懒惰渲染实现代码
Jan 04 Javascript
javascript 控制input只允许输入的各种指定内容
Jun 19 Javascript
js兼容pc端浏览器并有多种弹出小提示的手机端浮层控件实例
Apr 29 Javascript
jQuery ajax调用后台aspx后台文件的两种常见方法(不是ashx)
Jun 28 Javascript
AngularJS基础 ng-if 指令用法
Aug 01 Javascript
Bootstrap 模态对话框只加载一次 remote 数据的完美解决办法
Jul 09 Javascript
在vue中获取dom元素内容的方法
Jul 10 Javascript
详解VUE中v-bind的基本用法
Jul 13 Javascript
npm 下载指定版本的组件方法
May 17 Javascript
create-react-app修改为多页面支持的方法
May 17 Javascript
javascript中函数的写法实例代码详解
Oct 28 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实现模拟http请求的方法分析
2017/12/20 PHP
php防止表单重复提交实例讲解
2019/02/11 PHP
浅析PHP反序列化中过滤函数使用不当导致的对象注入问题
2020/02/15 PHP
document 和 document.all 分别什么时候用
2006/06/22 Javascript
JS提交并解析后台返回的XML的代码
2008/11/03 Javascript
JavaScript 基础篇之对象、数组使用介绍(三)
2012/04/07 Javascript
jQuery表单域选择器用法分析
2015/02/10 Javascript
javascript编写实用的省市选择器
2015/02/12 Javascript
快速掌握Node.js模块封装及使用
2016/03/21 Javascript
JS函数的定义与调用方法推荐
2016/05/12 Javascript
Bootstrap登陆注册页面开发教程
2016/07/12 Javascript
Highcharts学习之数据列
2016/08/03 Javascript
js实现点击图片自动提交action的简单方法
2016/10/16 Javascript
JS创建对象的写法示例
2016/11/04 Javascript
JavaScript实现浅拷贝与深拷贝的方法分析
2018/07/05 Javascript
javascript的delete运算符知识点总结
2019/11/19 Javascript
[07:20]2014DOTA2西雅图国际邀请赛 选手讲解积分赛第二天
2014/07/11 DOTA
树莓派+摄像头实现对移动物体的检测
2019/06/22 Python
python实现XML解析的方法解析
2019/11/16 Python
使用jupyter notebook直接打开.md格式的文件
2020/04/10 Python
windows上彻底删除jupyter notebook的实现
2020/04/13 Python
python调用win32接口进行截图的示例
2020/11/11 Python
皇家道尔顿官网:Royal Doulton
2017/12/06 全球购物
如何利用XMLHTTP检测URL及探测服务器信息
2013/11/10 面试题
行政总经理岗位职责
2013/12/05 职场文书
网络编辑岗位职责
2014/03/18 职场文书
学历公证委托书
2014/04/09 职场文书
优秀学生干部先进事迹材料
2014/05/26 职场文书
欢度春节标语
2014/07/01 职场文书
新闻学专业职业生涯规划范文:我的人生我做主
2014/09/12 职场文书
2015年乡镇信访工作总结
2015/04/07 职场文书
介绍信应该怎么开?
2019/04/03 职场文书
图解排序算法之希尔排序Java实现
2021/06/26 Java/Android
PyMongo 查询数据的实现
2021/06/28 Python
用Python爬取英雄联盟的皮肤详细示例
2021/12/06 Python
详解Python内置模块Collections
2022/03/22 Python