为什么vue3不重新呈现reactive变量的ref,当它没有深度嵌套时

jhkqcmku  于 2023-01-31  发布在  Vue.js
关注(0)|答案(1)|浏览(137)

我试图理解Vue3中的合成APIReact性。我想建立一个搜索栏,它将立即显示模板中的结果。
为此,我有一个React变量搜索和一个React变量结果。
如果我声明results为ref(),它应该自动转换为reactive()due,因为它是一个Array [示例A],或者直接声明这个数组为reactive()[示例B],结果不会直接呈现在模板中。我写了一个字母,什么也没发生,但当我写第二个字母时,我看到了之前用单个字母搜索的结果。
当我把结果嵌套得很深时[例C],它就起作用了,我立即看到了所有结果。
为什么?我不明白为什么A或B不起作用。

<script setup>
let search = ref("");

// EXAMPLE A
// This does not work, the search results are shown one "tick" later
const results = ref([]);

// EXAMPLE B
// This does not work, the search results are shown one "tick" later
const results = reactive([]);

// EXAMPLE C
// This does work, when the result array is deeply-nested in a reactive object
const query = reactive({ results: [] });

watch(search, (value) => {
    axios
        .post("/search", { search: value })
        .then(response => {
            // EXAMPLE A / B
            results = response.data;
            
            // EXAMPLE C
            query.results = response.data;
        })
        .catch();
});
</script>

<template>
    <!-- EXAMPLE A / B -->
    <div v-for="product in results" :key="product.id">
        <div>{{ product.id }}</div>
        <div>{{ product.name }}</div>
    </div>
    
    <!-- EXAMPLE C -->
    <div v-for="product in query.results" :key="product.id">
        <div>{{ product.id }}</div>
        <div>{{ product.name }}</div>
    </div>
</template>
qxsslcnc

qxsslcnc1#

我假设您发布的示例代码是人为的示例,因为它给出了运行时错误。在JS中,您不能重新分配const,您在示例代码中多次这样做。因此,我无法重现您声称看到的行为。
若要修复示例A和示例B,需要更改将响应指定给React对象的方式。

  • 示例A -您正在使用一个ref,您需要将其赋值给ref -results.value = response.datavalue属性。更多信息请参见ref上的Vue文档。
  • 示例B -您不能重新分配到reactive-这是使用reactive的一个限制。您可以通过使用Object.assign(参见https://stackoverflow.com/a/65733741/6767625)或使用示例C来解决此问题,正如您所指出的,示例C工作正常。

相关问题