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 获取对象 基本选择与层级
May 31 Javascript
JavaScript浏览器选项卡效果
Aug 25 Javascript
判断用户是否在线的代码
Mar 05 Javascript
JavaScript学习笔记之创建对象
Mar 25 Javascript
Spring Boot+AngularJS+BootStrap实现进度条示例代码
Mar 02 Javascript
浅谈JavaScript正则表达式-非捕获性分组
Mar 08 Javascript
vue-cli项目修改文件热重载失效的解决方法
Sep 19 Javascript
详解angularjs4部署文件过大解决过程
Dec 05 Javascript
vue实现局部刷新的实现示例
Apr 16 Javascript
Vue使用lodop实现打印小结
Jul 06 Javascript
vue2路由方式--嵌套路由实现方法分析
Mar 06 Javascript
JavaScript进阶(二)词法作用域与作用域链实例分析
May 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
最贵的咖啡是怎么产生的,它的风味怎么样?
2021/03/04 新手入门
PHP callback函数使用方法和注意事项
2015/01/23 PHP
thinkPHP多表查询及分页功能实现方法示例
2017/07/03 PHP
Track Image Loading效果代码分析
2007/08/13 Javascript
JQuery this 和 $(this) 的区别
2009/08/23 Javascript
讨论javascript(一)工厂方式 js面象对象的定义方法
2009/12/15 Javascript
JavaScript高级程序设计(第3版)学习笔记9 js函数(下)
2012/10/11 Javascript
JavaScript Math.floor方法(对数值向下取整)
2015/01/09 Javascript
javascript与css3动画结合使用小结
2015/03/11 Javascript
详谈LABJS按需动态加载js文件
2015/05/07 Javascript
JavaScript中的this,call,apply使用及区别详解
2016/01/29 Javascript
AngularJs Javascript MVC 框架
2016/06/20 Javascript
JS本地刷新返回上一页代码
2016/07/25 Javascript
Vue中fragment.js使用方法详解
2017/03/09 Javascript
详解nodeJS之二进制buffer对象
2017/06/03 NodeJs
jQuery简单实现向列表动态添加新元素的方法示例
2017/12/25 jQuery
Vue 父子组件的数据传递、修改和更新方法
2018/03/01 Javascript
解决IE11 vue +webpack 项目中数据更新后页面没有刷新的问题
2018/09/25 Javascript
[原创]微信小程序获取网络类型的方法示例
2019/03/01 Javascript
如何编写一个 Webpack Loader的实现
2020/10/18 Javascript
python 基础学习第二弹 类属性和实例属性
2012/08/27 Python
Django 项目重命名的实现步骤解析
2019/08/14 Python
Python中的 ansible 动态Inventory 脚本
2020/01/19 Python
Selenium+BeautifulSoup+json获取Script标签内的json数据
2020/12/07 Python
什么是CSS3 HSLA色彩模式?HSLA模拟渐变色条
2016/04/26 HTML / CSS
农业大学毕业生的个人自我评价
2013/10/11 职场文书
上课说话检讨书大全
2014/01/22 职场文书
综合实践活动方案
2014/02/14 职场文书
高中学生期末评语
2014/04/25 职场文书
学习经验演讲稿
2014/05/10 职场文书
文明礼仪标语
2014/06/13 职场文书
优秀班集体事迹材料
2014/12/25 职场文书
关于MySQL中的 like操作符详情
2021/11/17 MySQL
Nginx+Windows搭建域名访问环境的操作方法
2022/03/17 Servers
一文简单了解MySQL前缀索引
2022/04/03 MySQL
Oracle删除归档日志及添加定时任务
2022/06/28 Oracle