发布于 2026-01-06 2 阅读
0

使用 Vue + Supabase 实现实时订阅

使用 Vue + Supabase 实现实时订阅

嘿,如果你不知道我在说什么,你应该点击这个链接阅读我的第一篇文章

语境:

我们使用VueSupabase (一个开源的 Firebase 替代方案)创建了一个微博平台。今天,我们将展示数据库中每新增一条微博时,该微博都会被显示出来。


我们的起点是上一篇文章中创建的代码,您可以访问存储库查看源代码

我们的 Git 主分支名为 `<main_branch_name>` main,我们将从中创建一个名为 `<branch_name>` 的分支feat/add-subscription您可以在这里访问它),我们可以使用以下命令行命令来完成此操作:

// git clone git@github.com:ftonato/vue-supabase-microblog.git
// cd vue-supabase-microblog

git checkout -b feat/add-subscription
Enter fullscreen mode Exit fullscreen mode

通过浏览文档,我们可以详细了解订阅方式。

订阅就像实时监控数据库中的变化。这意味着每次发生事件(例如INSERTUPDATE更新、DELETE删除等*)时,我们都可以触发一个函数。

例如:

const mySubscription = supabase
  .from('*')
  .on('*', payload => {
    console.log('Change received!', payload)
  })
  .subscribe()
Enter fullscreen mode Exit fullscreen mode

在上面的示例中,我们告诉应用程序:“无论何时发生事件,无论表格是什么,使用console.log.

我们的做法与示例类似,但有两个细节不同:

  1. 我们只会从一张桌子观看(posts)。
  2. 我们只想在INSERT现场观看比赛。

在我们的List.vue文件中,我们将创建一个名为 的新变量subscriptionPosts和一个 方法subscribePosts

我们将在组装mounted组件时调用此方法,其职责如下:

  • 每当向此表中插入一条新记录时,将其添加到posts变量(存储出版物的本地变量)中。

以下是我们的实现代码:

<template>
  <section class="px-2 pt-16 pb-6 bg-white md:px-0">
    <div class="container items-center max-w-6xl px-8 mx-auto xl:px-5">
      <template v-for="(post, index) in posts">
        <list-item
          :key="`post-${index}`"
          :id="post.id"
          :title="post.title"
          :description="post.description"
        />
      </template>
    </div>
  </section>
</template>

<script>
import ListItem from "./ListItem";
import DatabaseService from "../Database.service";

export default {
  name: "List",
  components: {
    ListItem,
  },
  data: () => ({
    posts: [],
    database: null,
    subscriptionPosts: undefined,
  }),
  created() {
    const database = new DatabaseService();
    this.database = database.getInstance();
  },
  async mounted() {
    await this.fetchPosts();
    this.subscribePosts();
  },
  methods: {
    async fetchPosts() {
      let { error, data } = await this.database
        .from("posts")
        .select()
        .order("id");
      if (error) {
        console.error(error);
        return;
      }

      this.setPosts(data);
    },
    setPosts(posts) {
      this.posts = posts;
    },
    subscribePosts() {
      this.subscriptionPosts = this.database
        .from("posts")
        .on("INSERT", (message) => {
          if (message.new) {
            this.posts.push(message.new);
          }
        })
        .subscribe();
    },
  },
};
</script>
Enter fullscreen mode Exit fullscreen mode

这是实现实时订阅所需的代码。

你准备好看到结果了吗?

实时订阅

绝对精彩!


上面所做的已经足够了,但是让我们稍微注意一下我们的应用程序,并在destroyed组件的拆卸过程中删除订阅()。

当订阅流中的新值不再需要或无关紧要时,请务必取消订阅,这样可以大大减少触发次数,并在某些情况下提高性能。

我们创建了一个名为 ` unsubscribePostsremove the subscription` 的方法。

<template>
  <section class="px-2 pt-16 pb-6 bg-white md:px-0">
    <div class="container items-center max-w-6xl px-8 mx-auto xl:px-5">
      <template v-for="(post, index) in posts">
        <list-item
          :key="`post-${index}`"
          :id="post.id"
          :title="post.title"
          :description="post.description"
        />
      </template>
    </div>
  </section>
</template>

<script>
import ListItem from "./ListItem";
import DatabaseService from "../Database.service";

export default {
  name: "List",
  components: {
    ListItem,
  },
  data: () => ({
    posts: [],
    database: null,
    subscriptionPosts: undefined,
  }),
  created() {
    const database = new DatabaseService();
    this.database = database.getInstance();
  },
  async mounted() {
    await this.fetchPosts();
    this.subscribePosts();
  },
  destroyed() {
    this.unsubscribePosts();
  },
  methods: {
    async fetchPosts() {
      let { error, data } = await this.database
        .from("posts")
        .select()
        .order("id");
      if (error) {
        console.error(error);
        return;
      }

      this.setPosts(data);
    },
    setPosts(posts) {
      this.posts = posts;
    },
    subscribePosts() {
      this.subscriptionPosts = this.database
        .from("posts")
        .on("INSERT", (message) => {
          if (message.new) {
            this.posts.push(message.new);
          }
        })
        .subscribe();
    },
    unsubscribePosts() {
      this.database.removeSubscription(this.subscriptionPosts);
    },
  },
};
</script>
Enter fullscreen mode Exit fullscreen mode

就到这里啦!

想想这能给应用程序带来多大的力量,正如我在上一篇文章中所说:让你的想象力引导你,探索新的领域。

如果您对我们创建的项目的源代码感兴趣,请访问 GitHub 上的项目目录,并实现更多令人兴奋的功能,例如:

如有任何疑问,请随时联系我(ademilsonft@outlook.com / @ftonatoSupabase 团队)。

文章来源:https://dev.to/ftonato/realtime-subscriptions-using-vue-supabase-1e11