我的组件。

import useScript from "./useScript";
function MyComponent(): JSX.Element {
useScript("https://dev-kpaymentgateway.kasikornbank.com/ui/v2/kinlinepayment.min.js", "pkey_test_20184OBD88Yvl6uplpR0kY0ZTpVz46h1Tdqyj");
return (
    <div className={greyContainer}>
        <div className={gridContainer}>

            <p id="error-summary">
                Oops something went wrong, please try again.
            </p>

            <div className="flied">
                <label className="label"> name</label>

                <div id="name"></div>
                <label> Name is invalid.</label>
            </div>

            <div className="flied">
                <label className=" label">Number</label>

                <div id="number"></div>
                <label>Number is invalid.</label>
            </div>

        </div>
        <div style={{textAlign: "right", marginBottom: 10, marginTop: 30}}>
            <form method="POST" action="https://httpbin.org/post">
                <button type="submit" className="pay-button">Pay now</button>
            </form>
        </div>

    </div>
);
}


我使用react hook加载脚本。该脚本应该在上面的组件中添加一些字段。

import { useEffect } from "react";

const useScript = (url, dataKey) => {
useEffect(() => {
    const script = document.createElement("script");

    script.src = url;
    script["data-key"] = dataKey;
    script["data-lang"] = "en";
    script["data-write-log"] = true;
    script.async = true;

    document.body.appendChild(script);

    return () => { document.body.removeChild(script);};
    }, [url]);
  };

  export default useScript;


我的脚本正在加载,但仅在刷新使用组件MyComponent的页面之后。我正在使用react-router5进行导航。

谁能解释为什么会这样以及如何克服它。

最佳答案

我最好的猜测是kinlinepayment.min.js脚本执行得很好。但是它为已经发生并且不会再次发生的事件注册一个事件侦听器:

document.addEventListener("DOMContentLoaded",e())


您可以尝试在useEffect中调度该事件(如果需要支持旧的浏览器,则调度所有备份事件):

...
document.body.appendChild(script);

document.dispatchEvent(new Event('DOMContentLoaded')))

return ...

08-06 03:13