You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

React组件中如何正确引入并初始化AwwBoard白板脚本?

解决React中初始化AwwBoard白板组件的问题

嘿,别担心,新手刚接触React遇到这种脚本加载和初始化的问题太正常啦!我来帮你梳理下问题所在,再给你一个可行的解决方案。

问题根源

你当前的写法用了react-script-tag同时加载外部脚本和执行初始化代码,但这里有两个关键问题:

  1. 脚本加载是异步的,初始化代码可能在aww3.min.js还没加载完成就执行了,导致AwwBoard未定义
  2. React的DOM渲染时机和脚本执行时机没有对齐,可能初始化时目标DOM元素还没完全挂载到页面上

可行解决方案

我们可以用React的useEffect钩子和useRef来精准控制脚本加载和组件初始化的时机,这样能确保依赖的脚本加载完成、DOM元素存在后再初始化白板。

下面是修改后的完整组件代码:

import React, { useEffect, useRef } from 'react';
import './App.css';

function App() {
  // 用useRef获取白板容器的DOM引用,比id更可靠,避免组件复用时的id冲突
  const boardWrapperRef = useRef(null);

  useEffect(() => {
    // 定义初始化白板的函数
    const initBoard = () => {
      if (boardWrapperRef.current && window.AwwBoard) {
        // 把实例挂载到window上,方便后续可能的操作
        window.aww = new window.AwwBoard(boardWrapperRef.current, {});
      }
    };

    // 先检查AwwBoard是否已经全局可用,避免重复加载脚本
    if (window.AwwBoard) {
      initBoard();
      return;
    }

    // 动态创建脚本元素加载外部JS
    const script = document.createElement('script');
    script.src = 'https://awwapp.com/static/widget/js/aww3.min.js';
    script.async = true;
    
    // 脚本加载完成后执行初始化
    script.onload = initBoard;
    
    // 处理脚本加载失败的情况
    script.onerror = () => {
      console.error('Failed to load AwwBoard script');
    };

    document.body.appendChild(script);

    // 组件卸载时的清理操作,避免内存泄漏
    return () => {
      if (window.aww) {
        // 如果AwwBoard实例提供了销毁方法,可以在这里调用,比如:
        // window.aww.destroy();
        // 如果没有,清空容器内容也能达到类似效果
        boardWrapperRef.current?.innerHTML = '';
      }
      // 移除动态创建的脚本元素
      document.body.removeChild(script);
    };
  }, []); // 空依赖数组确保只在组件挂载时执行一次

  return (
    <div className="App">
      <div
        ref={boardWrapperRef}
        style={{ width: '600px', height: '400px' }}
      />
    </div>
  );
}

export default App;

方案说明

  • 用useRef获取DOM元素:相比id选择器,React的ref能确保我们精准拿到当前组件内的DOM元素,不会和页面上其他元素冲突
  • 控制脚本加载时机:动态创建脚本并监听onload事件,确保只有当aww3.min.js完全加载、AwwBoard全局可用后才初始化
  • 组件清理:在useEffect的返回函数中处理白板实例和脚本元素的清理,避免组件卸载后留下内存泄漏问题
  • 容错处理:加入脚本加载失败的错误日志,方便排查问题

试试这个方案,应该就能正常渲染白板啦!如果还是有问题,可以打开浏览器控制台看看有没有具体的错误提示,再针对性解决~

内容的提问来源于stack exchange,提问作者jy152374

火山引擎 最新活动