Vue在我从API获取属性后没有迭代我的对象?

lstz6jyr  于 2023-01-21  发布在  Vue.js
关注(0)|答案(2)|浏览(123)

我有一个对象,我想用v-for迭代并显示为一个表,但对象v-for似乎没有检测到该对象已更改。

<tr v-for="(value, key) in translations">
<td>@{{ value.ar }}</td>
<td>@{{ value.en }}</td>
<td>@{{ key }}</td>
</tr>

Vue代码

import {createApp} from "vue";
import axios from 'axios';

const translationApp = createApp({
    data() {
        return {
            translations:{}
        }
    },
    created() {
        axios.get("/api/translation").then(response => {
            if (response.status === 200) {
                this.translations = response.data;
            }
        });
    }
});

translationApp.mount("#translations-app");

很明显,对象被填充:
注:
@{{}}语法是因为我使用的是Laravel Blade。

olmpazwi

olmpazwi1#

将转换设置为如下所示的新值后

this.translations = newValue

Vue不知道它的属性已经改变,因为你已经覆盖了它的代理对象。
试试这样做

this.$set(this, 'translations', newValue)

这样你就告诉Vue代理这个新对象(使它成为“reactive”),这样它就知道它的属性何时改变。
您可以在该对象上执行console.log,并亲自查看它是否具有由Vue定义的新属性,这些属性不是您显式设置的。
另一种选择是在属性初始化时定义所有可能的键,并重写这些键的值,而不是整个对象。

return {
  translations: {
    key1: null,
    key2: null
    ...
...
this.translations.key1 = newKey1Value

Read more about reactivity on Vue docs

czq61nw1

czq61nw12#

您的代码应该可以正常工作,因为我没有看到您的实现中有任何问题。我假设您正在从API响应中获取一个对象数组,并将其分配回translations数据变量。
现场演示**:**

const app = Vue.createApp({
  data() {
    return {
      translations:{}
    }
  },
  created() {
    // Just for a demo purpose I am using setTimeout and mock data.
    setTimeout(() => {
      this.translations = [{
        ar: 'a',
        en: 'b'
      }, {
        ar: 'c',
        en: 'd'
      }]
    }, 500)
  }
})

app.mount('#app')
<script src="https://unpkg.com/vue@3.2.36/dist/vue.global.js"></script>
<div id="app">
  <table>
    <tr v-for="(value, index) in translations">
      <td>{{ value.ar }}</td>
      <td>{{ value.en }}</td>
      <td>{{ index }}</td>
    </tr>
  </table>
</div>

您可以快速浏览一下上面的演示,并尝试找到您所面临问题的根本原因。

相关问题