将结果从 <script> 导入 <script setup>

Importing result from <script> into <script setup>

我正在尝试枚举 Vue 组件的实例以确保唯一的 ID,为此使用一个简单的生成器。通常我会在 setup 函数之外启动生成器:

const idGen = generateIds("component:my-component");

export default {
  setup() {
    const id = idGen.next().value;

    return {
      id,  // e.g. "component:my-component/0042"
    };
  },
};

但是对于 <script setup> 糖,我不太确定这是怎么做到的。我知道我可以 运行 在另一个只会执行一次的 <script> 块中产生副作用:

<script>
const idGen = generateIds("component:my-component");
</script>

但是我不知道我要访问 <script setup> 中的共享 idGen 来增加枚举数并获得唯一 ID。

<script setup>
// Where do I get idGen from the above <script>?
const id = idGen.next().value;
</script>

在使用 <script setup> 糖时,我能想到的唯一方法是在单独的文件中启动生成器:

<script setup>
import { idGen } from "./id-generator.js";

const id = idGen.next().value;
</script>

唯一的问题是,为这个非常属于组件的微小逻辑创建一个单独的文件有点烦人,所以我会尽可能避免它。

编辑:事实证明顺序根本不相关

任何<script>都会运行正常

<script setup> 中的代码是 converted/compiled 到 组合 API “设置”函数,当它被调用时,所有top-level 其他 <script> 中的代码已经执行,因此 idGen 已经可用

所以

忽略此答案的其余部分


大多数使用另一个 <script> 的 vue3 <script setup> 示例总是显示顺序

<script setup></script>
<script></script>

在你的情况下,这是行不通的。

但是,如果脚本按此顺序排列

<script>
const idGen = generateIds("component:my-component");
</script>

然后

<script setup>
const id = idGen.next().value;
</script>

然后 idGen 将在 <script setup>

内可用

注意:您的 SFC 中可以有任意数量的 <script> 标签,顺序不限,但只能有一个 <script setup>