React实现单例组件

问题背景

在工作中遇到了这样一个场景,写了个通用的弹窗组件,却在同一个页面中多次使用了该组件。当点击打开弹窗时,可想而知,一次性打开了多个弹窗,而业务需求只需要打开一个。

我个人在解决问题过程中的一些已废弃思路

我首先想到的是能不能像mobx的@observer一样用一个譬如@singleton来修饰组件类,然后在像正常组件一样在使用组件的地方使用标签名来使用该组件。google了大半小时,发现行不通,因为每在render方法里使用一个组件,React就会自动实例化一个组件类,所以React本身的设计其实完全不适用于单例

解决问题的核心思路

  1. 采用类似调用方法的形式而非组件标签的形式来调用组件
  2. 只能在一个特定的容器内render组件,从而保证单例

代码


import React from 'react'
import { render, unmountComponentAtNode } from 'react-dom'
//具体单例类代码
export default class Singleton {
  constructor(component){
    this.dom = null;
    this.component = component;
    this.instance = null;
  }

  render(option) {
    if(!this.dom) {
      this.dom = document.createElement('div');
      document.body.appendChild(this.dom);
    }
    this.instance = ReactDOM.render(<this.component {...option}/>, this.dom);
  }

  destroy() {
    unmountComponentAtNode(this.dom);
  }
}

//使用例子
//在适当地方调用如下代码渲染组件
new Singleton(Component).show();

转载于:https://www.cnblogs.com/zhangrenjian/p/8552167.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值