如何从 index.html 发送消息到 Vue.js 3 实例?

How to send a message from index.html to Vue.js 3 instance?

所以,想象一下 Vue index.html 也加载了一些自定义脚本:

<!DOCTYPE html>
<html lang="en">
<head>
    ...
    ...
    <script type="text/javascript">
    languagePluginLoader.then(function () {
        pyodide.loadPackage("someName").then(() => {
            // Send message to Vue that everything is fine
        }).catch((err) => {
            // Send message to Vue that it failed
        })
    })
    </script>
    ...
    ...
</head>
<body>
<div id="app"></div>
<!-- built files will be auto injected -->
</body>
</html>

有没有办法从 index.html 文件与 运行 Vue 实例 or/and Vuex 通信?例如,我想显示“正在加载...”直到脚本完全加载等

所以,任何建议都行:)

解决方案是第三个 - 通过 mounted 手动注入脚本并将所有逻辑放入 script.onload 部分。 Google 地图示例:

mounted: function () {
    if (window.google && window.google.maps) {
        this.create_map();
        return;
    }

    var self = this;
    var script = document.createElement("script");
    script.onload = function () {
        if (!window.google && !window.google.maps)
            return void (console.error("no google maps script included"));

        self.create_map();
    };

    script.async = true;
    script.defer = true;
    script.src = "https://maps.googleapis.com/maps/api/js?key=googleapikeyxxxx&callback=initMap";
    document.getElementsByTagName("head")[0].appendChild(script);
}

从另一个 SO 问题的答案中选择逻辑:。

我会走外部事件中心的路线。由于 Vue 3 移除了 $on、$off 和 $once 实例方法,官方 migration strategy for an event hub is to use an external library, such as mitt。使用例如一旦加载了其他自定义脚本,您应该能够轻松地向 Vue 发出信号。