首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在更新第三方JSON时,Vue.js可以自动更新视图吗?

在更新第三方JSON时,Vue.js可以自动更新视图吗?
EN

Stack Overflow用户
提问于 2019-08-24 12:50:04
回答 2查看 2.3K关注 0票数 1

我正在努力完成以下工作,但我甚至不知道Vue是否可能实现,因为我正在努力获得所需的结果:

我有一个API的端点,它返回数组中的许多对象。

我正在成功地呈现Vue应用程序中的数据,但我想知道Vue是否有可能“跟踪”数组何时更新了更多的对象,然后呈现出视图中的对象。

我使用setInterval每10分钟执行一次GET请求,新数据正确地进入了data()中的对象,但是更改没有反映在视图中。

目前,我在开始和结束时分别将布尔值从true更改为false,以便视图再次用v-if呈现。

我的目标是创建一个简单的Twitter提要应用程序,它每10分钟执行一次GET请求,收集tweet,将它们放到我的Vue实例中,并在视图中显示它们,而不必重新加载页面/重新呈现组件。就像一个自动的Twitter提要,它每10分钟就会不断地加载新的推文。

这有可能吗?我尝试过使用Vue.set()方法,但这并没有起到任何作用。

如果不可能,实现类似的东西的最好方法是什么?

这是我的代码:

JavaScript:

代码语言:javascript
复制
new Vue({
  el: '#app',
  data: {
    items: [],
  },
  created() {
    this.load();
    setInterval(() => this.load(), 5000);
  },
  methods: {
    load() {
      axios.get('https://reqres.in/api/users?page=2')
      .then(response => {
        this.items = response.data.data;
      });
    }
  }
});

HTML

代码语言:javascript
复制
<div id="app">
  <p v-for="item in items">
    {{ item.first_name }}
  </p>
</div>

CodePen:https://codepen.io/tomhartley97/pen/VwZpZNG

在上面的代码中,如果数组是由GET请求更新的,那么在视图中没有反映机会?

EN

回答 2

Stack Overflow用户

发布于 2019-08-24 13:13:12

是的是可能的。在Vue实例中设置新的反应性属性的方式如下:

对于对象属性:Vue.set(this.baseObject, key, value),baseObject不能是Vue实例或基本data()对象,因此必须声明容器属性。

对于数组条目,使用本机数组方法:例如,Array.prototype.push()。使用Vue.set(array, arrayIndex, newArrayElement)不工作

因此,您的解决方案看起来可能是这样的:

代码语言:javascript
复制
<script>
export default {
  data() {
    return {
      response: [],
    };
  },

  mounted() {
    setInterval = (() => this.getData), 600000);
  }

  methods: {
    async getData() {
      const res = await request();
      const resLength = res.data.length;
      for (let i = 0; i < resLength; i++) {
        // check if entry is already in array
        const entryExists = this.response.some((entry) => {
          return entry.id === res.data[i].id
        })
        if (!entryExists) {
          // this will make the array entries responsive, but not nested Objects
          this.response.push(res.data[i]);
          // to create nested responsive Objects you will have to set them explicitly
          // e.g. Vue.set(this.response[this.response.indexOf(res.data[i])], nestedObjectKey, res.data[i].nestedObject)
        }
      }
    }
  }
};
</script>
票数 0
EN

Stack Overflow用户

发布于 2019-08-24 13:15:08

那么,我查看代码页,我知道了为什么您的视图没有得到更新: api响应总是返回相同的数组!

尝试返回不同的数据。

api返回一个数组,因此data定义

代码语言:javascript
复制
data() {
  return {
    array: [] // array that api returns
  }
}

模板可能如下所示

代码语言:javascript
复制
<div v-for="item in array">
</div>

以及更新方法

代码语言:javascript
复制
update() {
  setInterval(async () => {
    let resp = await api()

    this.array = resp.data.concat(this.array)

  }, TEN_MINUTES)
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57638118

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档