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操作Cookie取值错误的解决方法
Aug 26 Javascript
js验证电话号码与手机支持+86的正则表达式
Jan 23 Javascript
JS获取随机数和时间转换的简单实例
Jul 10 Javascript
微信小程序 location API实例详解
Oct 02 Javascript
Angular实现一个简单的多选复选框的弹出框指令实例
Apr 25 Javascript
JavaScript递归算法生成树形菜单
Aug 15 Javascript
随机生成10个不重复的0-100的数字(实例讲解)
Aug 16 Javascript
vue 实现边输入边搜索功能的实例讲解
Sep 16 Javascript
vue单页面应用打开新窗口显示跳转页面的实例
Sep 21 Javascript
轻松解决JavaScript定时器越走越快的问题
May 13 Javascript
JS实现的对象去重功能示例
Jun 04 Javascript
Vue实现渲染数据后控制滚动条位置(推荐)
Dec 09 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读取MySQL数据代码
2008/06/05 PHP
php中判断文件空目录是否有读写权限的函数代码
2012/08/07 PHP
调试WordPress中定时任务的相关PHP脚本示例
2015/12/10 PHP
php自定义中文字符串截取函数substr_for_gb2312及substr_for_utf8示例
2016/05/28 PHP
PHP面向对象程序设计模拟一般面向对象语言中的方法重载(overload)示例
2019/06/13 PHP
php+layui数据表格实现数据分页渲染代码
2019/10/26 PHP
isArray()函数(JavaScript中对象类型判断的几种方法)
2009/11/26 Javascript
JavaScript对象之间的转换 jQuery对象和原声DOM
2011/03/07 Javascript
jQuery事件绑定与解除绑定实现方法
2015/04/15 Javascript
Node.js本地文件操作之文件拷贝与目录遍历的方法
2016/02/16 Javascript
CSS3 media queries结合jQuery实现响应式导航
2016/09/30 Javascript
深入理解jquery中的each用法
2016/12/14 Javascript
你不知道的 javascript【推荐】
2017/01/08 Javascript
快速使用node.js进行web开发详解
2017/04/26 Javascript
详解angularjs 关于ui-router分层使用
2017/06/12 Javascript
JS实现十字坐标跟随鼠标效果
2017/12/25 Javascript
vue-next/runtime-core 源码阅读指南详解
2019/10/25 Javascript
ES6学习笔记之let与const用法实例分析
2020/01/22 Javascript
基于html+css+js实现简易计算器代码实例
2020/02/28 Javascript
基于javascript canvas实现五子棋游戏
2020/07/08 Javascript
python 获取文件列表(或是目录例表)
2009/03/25 Python
浅谈Python中的作用域规则和闭包
2018/03/20 Python
python针对不定分隔符切割提取字符串的方法
2018/10/26 Python
python用match()函数爬数据方法详解
2019/07/23 Python
Python类如何定义私有变量
2020/02/03 Python
基于Python实现人脸自动戴口罩系统
2020/02/06 Python
Python requests模块cookie实例解析
2020/04/14 Python
python中常见错误及解决方法
2020/06/21 Python
Python实现扫码工具的示例代码
2020/10/09 Python
英国花园、DIY、电器和家居用品商店:Robert Dyas
2019/03/18 全球购物
乌克兰电子和家用电器商店:Foxtrot
2019/07/23 全球购物
波兰在线体育用品商店:Hop-Sport.pl
2019/07/23 全球购物
CHARLES & KEITH台湾官网:新加坡时尚品牌
2019/07/30 全球购物
学习党的群众路线教育实践活动心得体会
2014/03/01 职场文书
人民调解员先进事迹材料
2014/05/08 职场文书
2014年政教处工作总结
2014/12/20 职场文书