使用 Vue 3 Composition API 在花括号中显示加载的数据

Show loaded data in curly braces using Vue 3 Composition API

有人可以解释一下下面的区别吗?

选项API版本

按预期显示 DOM 中加载的数据

export default {
    data() {
        return {
            config: {},
        };
    },
    async mounted() {
        this.config = await fetch('/path/to/file.json');
    },
    template: `<div>{{ config }}</div>`
}

作文API版本

显示配置的初始状态但不显示加载的数据

import { onMounted, reactive } from 'vue';

export default {
    setup() {
        let config = reactive({});

        onMounted(async () => {
            config = await fetch('/path/to/file.json');
        });

        return {
            config,
        };
    },
    template: `<div>{{ config }}</div>`
}

我怀疑 reactive() 被异步数据加载覆盖(我可以在 onMounted 函数中控制台记录新数据)但我在文档中看不到任何内容指示如何像这样批量更新反应对象(尤其是当它在选项 API 中工作时)

编辑:最后的想法:

我已经开始使用 reactive 对象在应用程序周围提供/注入数据,然后使用 toRefs 作为 JIT 方式向我的视图提供反应数据。这似乎是两全其美。

示例:

import { onMounted, reactive, toRefs } from 'vue';

export default {
    setup() {
        const data = reactive({
            config: {},
        });

        onMounted(async () => {
            data.config = await fetch('/path/to/file.json');
        });

        return {
            ...toRefs(data),
        };
    },
    template: `<div>{{ config }}</div>`
}

我认为如果你要覆盖整个配置,你应该使用 ref 而不是 reactive。 参见 HERE

  setup() {
    let config = ref({});

    onMounted(async () => {
        config.value = await fetch('path/to/file.json');
    });

    return {
        config,
    };
}

不过它也可以与反应式一起工作:

  setup() {
    let config = reactive({});

    onMounted(async () => {
        config.value = await fetch('path/to/file.json');
    });

    return {
        config,
    };
}

我认为您提到的两个示例之间的区别在于 this 关键字。根据 Vue 3 documentation,在 setup() 内部,this 不会是对当前活动实例的引用。因此,在您提到的第二个代码(组合 API)中,您不能仅将“配置”字设置为获取过程的输出。最好设置一个 key 让你的对象工作。例如对我来说这段代码工作正常:

<template>
    <div>{{ config }}</div>
</template>

<script>
import { onMounted, reactive } from 'vue';

export default {
    name: "configCompo",
    setup(props) {
        let config = reactive({});

        onMounted(
            async () => {
                console.log("mounted")
                let response = await fetch('https://jsonplaceholder.typicode.com/users');
                console.log(response);
                let data = await response.json();
                console.log(data);
                config.output = data;
            }
            

        );

        return {
            config,
        };
    }
}
</script>