React中异步引入script标签

公众号:程序员波波

React中支持异步加载script,通过react-loadable可以在React中异步import。

但是目前遇到一个问题,引入全局的script标签。但是如果把所有标签全部写在index.html中的话,那么第一页加载的速度会变慢,所以希望实现异步引入script标签的方法。

目前通过document.createElement的方法来动态创建脚本标签,然后通过document.body.appendChild将脚本加入body中。然后在页面componentDidMount的时候调用改方法。做了一些状态处理。

封装在Tools类中:

class Tools
{
    static asyncLoadScript(url, callback)
    {
        let old_script = document.getElementById(url);
        if (old_script)
        {
            if (old_script.ready == true)
            {
                // console.log("INFO:already load:" + url);
                callback();
                return;
            }
            else
            {
                document.body.removeChild(old_script);
                // console.log("INFO:remove an old script that not ready:" + url);
            }
        }
        let script = document.createElement('script');
        script.id = url;
        script.src = url;
        script.onload = script.onreadystatechange = function() {
            if (script.ready) {
                return false;
            }
            if (!script.readyState //这是FF的判断语句,因为ff下没有readyState这个值,IE的readyState肯定有值
                || script.readyState == "loaded" || script.readyState == 'complete' // 这是IE的判断语句
            ) {
                // console.log("INFO:load:" + url);
                script.ready = true;
                callback();
            }
        };
        document.body.appendChild(script);
    }

    static asyncLoadScripts(scripts, callback)
    {
        var ok = 0;
        for (var i=0; i < scripts.length; i++) {
            Tools.asyncLoadScript(scripts[i], function() {
                ok++;
                if (ok==scripts.length)
                {
                    callback();
                }
            })
        }
    }
}

export default Tools;

然后调用:

Tools.asyncLoadScripts(_dependScripts, function(){
    initView()
});

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
百度地图提供了丰富的 JavaScript API,可以在 React 前端项目轻松使用。要使用百度地图的雷达图功能,需要先引入百度地图的 JavaScript API,并在合适的位置创建地图实例。然后,可以使用百度地图提供的 Radar 类来创建雷达图。 以下是一个基本的示例代码: ```jsx import React, { useEffect } from "react"; function Map() { useEffect(() => { const script = document.createElement("script"); script.src = "http://api.map.baidu.com/api?v=2.0&ak=你的AK值&callback=init"; script.async = true; document.body.appendChild(script); window.init = () => { const map = new window.BMap.Map("map-container"); map.centerAndZoom(new window.BMap.Point(116.404, 39.915), 11); const points = [ new window.BMap.Point(116.387, 39.920), new window.BMap.Point(116.385, 39.913), new window.BMap.Point(116.394, 39.917), new window.BMap.Point(116.380, 39.920), ]; const options = { positions: points, shape: "circle", color: "#ff0000", opacity: 0.8, zIndex: 10, }; const radar = new window.BMapLib.Radar(map, options); }; }, []); return <div id="map-container" style={{ height: "500px" }}></div>; } export default Map; ``` 在这个示例,我们首先使用 useEffect 钩子在组件挂载时异步加载百度地图的 JavaScript API,并在 window 对象定义了一个 init 函数。在这个函数,我们创建了一个地图实例,指定了地图的心点和缩放级别。然后,定义了一个 points 数组,包含了雷达图的多个点位,以及雷达图的参数。最后,使用 BMapLib.Radar 类创建了一个雷达图实例,并将其添加到地图。 需要注意的是,在使用百度地图的 JavaScript API 时,需要将你的 AK 值替换掉示例代码的“你的AK值”。另外,百度地图的 JavaScript API 是通过异步加载的方式使用的。因此,在组件卸载时,需要手动删除页面上加载的 script 标签,以避免内存泄漏。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值