记一次dom.appendChild 的坑

现象

首先,登录有两种方式,二维码和帐号,默认是二维码登录。

有个有趣的现象:每次打开默认的二维码可以正常显示,二维码失效后,点击刷新二维码也可以正常显示,但是当我切换成帐号登录,再切换成二维码登录后,二维码消失了。

获取二维码接口
//返回qrcode生成的链接qrCodeContent
const qrcodeInfo = await PassportSDK.refreshQRCode()

//真正生成二维码并放到我提供的domId下面
PassportSDK.generateByDom('qrcode', qrcodeInfo.qrCodeContent)

按理说调的都是同样的接口,为什么一开始以及点击刷新就可以正常生成二维码,但是切换登录方式之后就拿不到呢,我们看下接口实现方式

function generateByDom(domId, text) {
    //重新生成qrcode
    if (text) {
        this.qrCodeOrigin.makeCode(text);
    }
    
    //根据domId拿dom
    var dom = document.getElementById(domId);
    if (!dom) {
        return false;
    }
    
    //找到img
    var img = (0, _lodash4.default)(this.tempElement, ['children', 1]);
    if (!img) {
        return false;
    }
    
    //放到dom里
    dom.appendChild(img);
}

看起来真的没毛病,但仔细想想这句话

dom.appendChild(img);

下面上图


Screen Shot 2018-06-25 at 10.18.33 PM.png

执行完这句话,img就从tempElement移动到dom下了,所以后续刷新显示的都是同一个二维码

Screen Shot 2018-06-25 at 10.18.40 PM.png

当切换tab以后,之前的dom Unmount,但是img还是指向之前的img对象,tempElement还是没有img,导致切回二维码登录,component重新渲染,新的dom一直拿不到img

Screen Shot 2018-06-25 at 10.18.47 PM.png

不能直接移动img,那么我克隆一个它的副本,每次把副本放进dom总可以了吧

Screen Shot 2018-06-25 at 10.20.03 PM.png

又犯错了,不能一直往里面移呀,要去判断dom里面是不是已经有了img,有了就replace掉哦


Screen Shot 2018-06-25 at 10.20.08 PM.png
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明AI阅读 16,050评论 3 119
  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,891评论 8 265
  • 走向远方, 那广阔的天空; 我朝向你而来; 抛弃身后一切的繁琐。 走向远方, 那宽广的大路;...
    源通思想阅读 936评论 0 2
  • 1.通过Bitmap的compress()函数压缩 先看一下官方文档的解释: CompressFormat参数支持...
    Perk阅读 3,660评论 0 0
  • 全片以一只黑猫为复仇而害人,一个日本法师和白居易为查案一步步揭开黑猫害人的真相为主线。 开始还以为...
    涵无君阅读 1,209评论 0 0