Vue:有没有办法检测来自 API 的变化数据

Vue: Is there a way to detect changes data coming from API

我看的很简单。一旦我呈现我的模板,它就会对我的网络服务器进行 API-Call 并将数据呈现给模板。现在我想在 vue 组件中查看这些数据以了解即将发生的变化。每当发生变化时,我想用来自 API 的数据更新模板。

一个解决方案是我可以编写类似于每 10 秒调用一次的刷新方法。 (老实说,那是我不想要的东西)

我想要一种类似于 Angular 的观察者方式。

顺便说一句。我是 vue 的新手,我开始学习 Vue Laravel

编辑: 我的代码:

Vue.component

<template>
<div class="w-50">
    <table class="table ">
        <thead>
        <tr>
            <th scope="col"></th>
            <th scope="col"></th>
        </tr>
        </thead>
        <tbody>
            <tr v-for="user in users" v-bind:key="user.id">
                <td>{{ user.name }}</td>
                <td>{{ user.timer }}</td>
            </tr>
        </tbody>
    </table>
</div>
</template>

<script>
    export default {
        data() {
            return {
                users: [],
                user: {
                    id: '',
                    active: ''
                }
            };
        },
        mounted() {
            axios.get('/users')
                .then(res => {
                    this.users = res.data;
                    console.log(res.data);
                })
        }
    }
</script>

我按照你下面提到的做了。但是如果数据发生变化,视图不会更新。

你没有包含任何代码,所以我只添加我的例子:

这是一个模板标签:

<template>
    <div>
        <h1> {{title}} </h1>
    </div>
</template>

脚本:

data(){
    return {
        title: '',
    },
},
mounted(){
    axios.get('/api/items/all').then(response => {
        this.title = response.data.title;
    });
}

这应该足以让 Vue.js 进行更改并正确呈现新标题(在我的示例中)。如果你想在渲染之前观察变化,你可以添加一个 watch 属性 这样的:

watch:{
    'title': function (newVal, oldVal) {
        // you can work with a new value here
    },
}

如果您需要这方面的更多信息,可以阅读 Computed Properties and Watchers 上的 Vue 文档。

您有点同时问了 2 或 3 个问题,所以我会尝试部分回答。

Angular Vue 中的可观察对象

Angular 可观察对象的直接替代是 Vue 事件系统。您可以使用 this.$on 监听事件并使用 this.$off 停止监听。要在整个应用程序范围内执行此操作,您需要制作类似事件总线的东西:

Vue.prototype.$bus = new Vue();

// in components
mounted () {
  this.$bus.$on('myMessage', this.handleMyMessage);
},

beforeDestroy () {
  this.$bus.$off('myMessage', this.handleMyMessage);
}

也就是说,这听起来不像是您真正想要使用的。

正在刷新数据

我怀疑您想滥用 retry() 方法一遍又一遍地重做请求,但老实说没有理由使用它。你可以把请求放在一个方法中,然后在一个时间间隔内调用它。

更新数据的更好方法可能是使用 websocket 服务器,但这是您需要设置的。没有它,您要么必须重复执行 api 请求,要么在用户想要之前不要刷新它。

正在更新模板

Vue 中的数据始终是反应性的。如果模板中引用的数据发生变化,模板会自动重新呈现。如果您更改对象,您可能需要使用辅助方法 Vue.setVue.delete (docs)。这将确保数据保持反应性,从而更新呈现的模板。

您可以使用 vue-rx 在 Vue.js 中使用 Observables。

以下演示每 10 秒对 API 服务进行一次 AJAX 调用,returns 是一个随机笑话:

new Vue({
  el: '#demo',
  subscriptions: function () {
    return {
      joke: rxjs.timer(0, 10000).pipe(
        rxjs.operators.switchMap(() => rxjs.ajax.ajax('https://geek-jokes.sameerkumar.website/api')),
        rxjs.operators.map(res => res.response) 
      )
    }
  }
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<script src="https://unpkg.com/rxjs/bundles/rxjs.umd.js"></script>
<script src="https://unpkg.com/vue-rx@6.1.0/dist/vue-rx.js"></script>
<div id="demo">{{ joke }}</div>

我会看一下 Socket.IO。它利用 websocket 的方式,这是一种往返于客户端和服务器的双向连接。这允许服务器告诉您的网站有关更改并提供该数据,而无需您对其进行轮询(值得注意的是,socketio 将轮询信息,但不支持 websocket)。

Laravel 为我的问题提供了开箱即用的解决方案。关键词是 Broadcast 事件。使用这种方法,处理套接字连接真的很容易。除了这个奇妙的功能,您还可以使用 Socket.io 和 Redis。

Laravel 文档:https://laravel.com/docs/5.7/broadcasting

因为我不知道 vue 总是在我的数据发生变化时重新渲染模板,所以不再需要某物。就像 Angular

中的观察员