更新Vue中的模板引用时找不到模块'./undefined'

tjvv9vkg  于 2023-02-05  发布在  Vue.js
关注(0)|答案(1)|浏览(256)
    • 目标**

根据动态变化的引用(ref)呈现组件。用户可以执行"搜索"功能,返回数据并更新引用。更新的引用应依次更新使用v-for呈现的组件。

    • 我的设置**

我有一个onMounted()生命周期钩子,它发出axios请求并将所有数据返回到引用中。

onMounted(async () => {
    const response = await axios.get('/api/subject/')
    allSubjects.value = await response.data.data;
})

参考:

const allSubjects = ref(null)

模板:

<OneSubject
    v-for="subject in allSubjects" 
    :key="subject.id"
    :subject="subject" 
/>

到目前为止一切都很好...

    • 问题**

当我为"search"特性发出另一个请求时,axios请求工作正常,我能够得到一个带有数据(一个新的对象数组)的响应。
当尝试使用此数据更新我的引用时出现问题,如下所示:

async function search(searchInput) {
    const response = await axios.get(`/api/subject/search/${searchInput}`)
    console.log(response) // <-- RESPONSE HAS DATA
    allSubjects.value = await response.data.data; // <-- CAUSES ERROR
}

抛出的错误来自v-for中呈现的组件:

我可以验证引用是否已成功更新为新数据,但在v-for?中呈现组件时似乎出现了问题。

    • 更新**

下面是它试图在v-for中呈现的组件。

<template>
    <div class="subject-wrapper" v-bind:style="{ background: `rgba(0, 0, 0, .3) url('${imgSrc}') center / cover` }">
        <div class="darken-bg"></div>
        <div class="subject-name">{{ subject.name }}</div>
    </div>
</template>

<script setup>

    import { onMounted, computed } from 'vue'

    const props = defineProps({ subject: Object }) 
    const imgSrc = computed(() => require(`@/assets/images/subject/${props.subject.image}`))

</script>

我更新了组件,如下所示:

<template>
    <div class="subject-wrapper" v-bind:style="{ background: `rgba(0, 0, 0, .3) url('${imgSrc}') center / cover` }">
        <div class="darken-bg"></div>
        <div class="subject-name">{{ subject.name }}</div>
    </div>
</template>

<script setup>
    import { reactive, computed, onUpdated } from 'vue'
    
    const props = defineProps({ subject: Object })
    const subject = reactive(props.subject)
    const imgSrc = computed(() => require(`@/assets/images/subject/${subject.image}`))

    onUpdated(() => {
        console.log('component subject prop:', props.subject)
        console.log('subject reactive:', subject)
    })

</script>

之后,搜索执行时没有错误,但呈现了错误的组件。我在控制台记录了这些值:

正如你所看到的,它从prop传递了正确的数据,但是它呈现了错误的数据?我是否误解了reactive应该如何工作?我不知道subject reactive的错误数据是从哪里来的。

hts6caw3

hts6caw31#

我无法解释问题底部的console.logs,但根据子组件代码,我认为需要进行两项更改来解决整个问题。
1.使用Vite时,不应在代码中使用require,因为require仅为ESM。Vite文档描述了使用new URLimport.meta.url导入动态资产的更好方法。一个警告是,由于Rollup限制(Vite的捆绑包),在构建URL时不能使用@别名。然后,imgSrc应如下所示:

const imgSrc = computed(
  () => new URL(`../assets/images/subject/${subject.value.image}`, import.meta.url).href
);

(本地计算机上的实际相对路径可能不同)
1.在创建subject时,从使用reactive改为使用toRef。由于props是React式的,并且您希望提取单个(非React式)属性,因此您应该专门为该作业使用toRef,因为它使subjectprops.subject保持同步。

const subject = toRef(props, 'subject');

我没有你完全相同的设置,但当我测试它与一些模拟数据/本Map像文件,而不是一个API,它为我工作。如果你仍然有问题,让我知道。

相关问题