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的动画类 Fx.js
Nov 05 Javascript
SeaJS 与 RequireJS 的差异对比
Dec 08 Javascript
node.js中的fs.writeFile方法使用说明
Dec 14 Javascript
AngularJS国际化详解及示例代码
Aug 18 Javascript
利用JQuery阻止事件冒泡
Dec 01 Javascript
AngularJS中的Promise详细介绍及实例代码
Dec 13 Javascript
H5实现中奖记录逐行滚动切换效果
Mar 13 Javascript
angular directive的简单使用总结
May 24 Javascript
AngularJS路由删除#符号解决的办法
Sep 28 Javascript
Vue 莹石摄像头直播视频实例代码
Aug 31 Javascript
基于Vue+ElementUI的省市区地址选择通用组件
Nov 20 Javascript
vue + el-form 实现的多层循环表单验证
Nov 25 Vue.js
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的无限分类实现想法~
2007/01/02 PHP
让PHP支持页面回退的两种方法
2008/01/10 PHP
thinkPHP+phpexcel实现excel报表输出功能示例
2017/06/06 PHP
通过PHP的Wrapper无缝迁移原有项目到新服务的实现方法
2020/04/02 PHP
PHP中类与对象功能、用法实例解读
2020/03/27 PHP
使用PHP+JQuery+Ajax分页的实现
2013/04/23 Javascript
JavaScript的strict模式与with关键字介绍
2014/02/08 Javascript
简单易用的倒计时js代码
2014/08/04 Javascript
jquery使用slideDown实现模块缓慢拉出效果的方法
2015/03/27 Javascript
微信小程序 欢迎界面开发的实例详解
2016/11/30 Javascript
jquery 实时监听输入框值变化的完美方法(必看)
2017/01/26 Javascript
使用jQuery卸载全部事件的思路详解
2017/04/03 jQuery
浅谈react前后端同构渲染
2017/09/20 Javascript
Node.js 使用AngularJS的方法示例
2018/05/11 Javascript
Vue-Router的使用方法
2018/09/05 Javascript
深入理解Angularjs 脏值检测
2018/10/12 Javascript
vue中v-for循环给标签属性赋值的方法
2018/10/18 Javascript
vue.js实现双击放大预览功能
2020/06/23 Javascript
vue-列表下详情的展开与折叠案例
2020/07/28 Javascript
Python文件及目录操作实例详解
2015/06/04 Python
Python 文件处理注意事项总结
2017/04/10 Python
Python对列表中的各项进行关联详解
2017/08/15 Python
Python的CGIHTTPServer交互实现详解
2018/02/08 Python
完美解决Pycharm无法导入包的问题 Unresolved reference
2018/05/18 Python
Django后端发送小程序微信模板消息示例(服务通知)
2019/12/17 Python
python 实现线程之间的通信示例
2020/02/14 Python
python sklearn包——混淆矩阵、分类报告等自动生成方式
2020/02/28 Python
Python 调用有道翻译接口实现翻译
2020/03/02 Python
Python新手学习函数默认参数设置
2020/06/03 Python
Django QuerySet查询集原理及代码实例
2020/06/13 Python
解决pytorch 模型复制的一些问题
2021/03/03 Python
实现向右循环移位
2014/07/31 面试题
个人股份转让协议书范本
2015/01/28 职场文书
领导激励员工的演讲稿,各种会上用得到,建议收藏
2019/08/13 职场文书
分享MySQL常用 内核 Debug 几种常见方法
2022/03/17 MySQL
Linux中sftp常用命令整理
2022/06/28 Servers