Skip to content

Introduction to VueJS and RxJS

This article was written over 18 months ago and may contain information that is out of date. Some content may be relevant but please refer to the relevant official documentation or available resources for the latest information.

Let's start with a brief introduction.

What is VueJS

Vue.js is a progressive open-source front end JavaScript framework for building user interfaces, and single-page applications.

What is RxJS

RxJS is a library for reactive programming, and has components that enable the composition of asynchronous code. This means it takes data as streams (Observables) that can be subscribe to.

Installation/Setup

Following these steps, let's set-up our Vue application, and install RxJS:

Vue create <AppName>

yarn i rxjs

yarn serve

Creating an Observable

To create an observable

  new Observable(function subscribe(subscriber) {});

An observer of an observable is an object with three functions: next, error, & complete.

observable.subscribe({
  next: value => console.log(value),
  error: err => console.log(err),
  complete: () => console.log(`Completed`),
})

Let's take a look at an example to better understand Observables.

<script lang="ts">
import { defineComponent, onMounted, onBeforeUnmount } from "vue";
import { Observable, Subscription} from "rxjs";

export default defineComponent({
  setup() {
    const time = 2500;
    let observableID: Subscription
    onMounted(() => {
      const observable$ = new Observable(function subscribe(subscriber) {
        const intervalId = setInterval(() => {
          subscriber.next("Vuejs and Rxjs");
          subscriber.complete();
          clearInterval(intervalId);
        }, time);
      });
      observableID = observable$.subscribe(
        (value) => console.log(`Introduction to ${value}`),
        (err) => console.log(err),
        () => console.log("completed")
      );
    });
    onBeforeUnmount(() => observableID.unsubscribe()); 
  },
});
</script>

From the example above, we can see that “Introduction to Vuejs and Rxjs” is printed out after 2.5 seconds, and then "completed" is printed after.

RxjS operators

Creating an observable manually every time can make code become very lengthy and difficult to read. Therefore, RxJS has alot of useful operators.

Some of the most commonly used operators are

  • Creation Operators
  • Transformation Operators
  • Filtering Operators
  • Combination Operators
  • Conditional Operators
  • Join Operators
  • Multicasting Operators
  • Error Handling Operators

We would be discussing examples on Creation, Transformation, and Filtering operators in this post:

Creation operators

These operators make creating an observable easy for various usecase. Some examples are 'interval', 'from', and 'of'.

  • interval: Creates an observable that emits sequential numbers every specified interval of time.
  interval(10).subscribe(console.log);
  • from: Creates an observable from an array, promise, iterables or string
const frameworks = of("VueJS", "ReactJS", "Svelte", "AngularJS", "Lit", "RiotJS").subscribe(val => console.log(val));

//output: "VueJS", "ReactJS", "Svelte", "AngularJS",  "Lit", "RiotJS",

const promiseSource = from(new Promise(resolve => resolve('Hello World!'))).subscribe(val => console.log(val));

//output: 'Hello World!'
  • of: Creates an observable from a sequence of values
const frameworks = of("VueJS", "ReactJS", "Svelte", "AngularJS", "Lit", "RiotJS").subscribe(val => console.log(val));

//output: "VueJS", "ReactJS", "Sevelte", "AngularJS",  "Lit", "RiotJS"

Transformation operators

These operators provide data transformation techniques for values passing through.

An example is 'map'. For the example below, we use map to transform our array of objects ([{name: "VueJS", language: "js"}]) into an array of strings(["VueJS"]).

    const source = [
      { name: "VueJS", language: "js" },
      { name: "ReactJS", language: "js" },
      { name: "Laravel", language: "PHP" },
      { name: "Sevelte", language: "js" },
      { name: "AngularJS", language: "js" },
      { name: "Spring", language: "java" },
      { name: "Lit", language: "js" },
      { name: "CodeIgniter", language: "PHP" },
      { name: "RiotJS", language: "js" },
    ];

    from(source).pipe(map(({ name }) => name));
    jsFrameworks.subscribe((value) => {
      frameworks.value.push(value);
    });

Filtering Operator

This operator helps in choosing and refining how and when data is obtained from an observable.

An example is "Filter". For the example below, we use "filter" to obtain an array of objects where language is "js".

    const source = [
      { name: "VueJS", language: "js" },
      { name: "ReactJS", language: "js" },
      { name: "Laravel", language: "PHP" },
      { name: "Svelte", language: "js" },
      { name: "AngularJS", language: "js" },
      { name: "Spring", language: "java" },
      { name: "Lit", language: "js" },
      { name: "CodeIgniter", language: "PHP" },
      { name: "RiotJS", language: "js" },
    ];
    from(source).pipe(
      filter(({ language }) => language === "js"),
      map(({ name }) => name)
    );

Example

Now that we have discussed some of the basics, lets try building a page that shows a list of frameworks. Each item of the list should be delayed before being displayed.

<template>
  <div>
    Test Rxjs
    <h2>Filter Frameworks</h2>
    <ul>
      <li v-for="item in frameworks" :key="item">{{ item }}</li>
    </ul>
  </div>
</template>

<script lang="ts">
import { defineComponent, ref, onMounted } from "vue";
import { interval } from "rxjs";
import { map, filter } from "rxjs/operators";

export default defineComponent({
  setup() {
    let frameworks = ref([]);
    const time = 1000;

    const source = [
      { name: "VueJS", language: "js" },
      { name: "ReactJS", language: "js" },
      { name: "Laravel", language: "PHP" },
      { name: "Svelte", language: "js" },
      { name: "AngularJS", language: "js" },
      { name: "Spring", language: "java" },
      { name: "Lit", language: "js" },
      { name: "CodeIgniter", language: "PHP" },
      { name: "RiotJS", language: "js" },
    ];

    onMounted(() => {
      const jsFrameworks = interval(time).pipe(
        filter((i) => source[i].language === "js"),
        map((i) => source[i].name)
      );
      const observable$ = jsFrameworks.subscribe(
        (value) => {
          frameworks.value.push(value);
        },
        () => observable$.unsubscribe()
      );
    });
    return {
      frameworks,
    };
  },
});
</script>

Live Demo

This is a codesandbox demo for you to play around with:

Conclusion

RxJS is really expansive, and can't be covered in just a single blog post. To learn more about RxJs, checkout the official documentation here: https://rxjs.dev/ or https://www.learnrxjs.io/. There is also a very good Vue plugin for Rxjs here.

If you have any questions or run into any trouble, feel free to reach out on Twitter or Github.

This Dot is a consultancy dedicated to guiding companies through their modernization and digital transformation journeys. Specializing in replatforming, modernizing, and launching new initiatives, we stand out by taking true ownership of your engineering projects.

We love helping teams with projects that have missed their deadlines or helping keep your strategic digital initiatives on course. Check out our case studies and our clients that trust us with their engineering.

Let's innovate together!

We're ready to be your trusted technical partners in your digital innovation journey.

Whether it's modernization or custom software solutions, our team of experts can guide you through best practices and how to build scalable, performant software that lasts.

Prefer email? hi@thisdot.co