Create Vue 3 Apps with the Composition API — Read-Only Properties and Side Effects

Photo by Mert Kahveci on Unsplash

Vue 3 comes with the Composition API built-in.

It lets us extract logic easily an not have to worry about the value of this in our code.

It also works better with TypeScript because the value of this no longer has to be typed.

In this article, we’ll look at how to create Vue 3 apps with the Composition API.

Read-Only Property

We can add a read-only property to our Vue 3 app with the composition API.

To add it, we use the readonly property:

<template>
<div>{{ copy }}</div>
</template>
<script>
import { reactive, readonly } from "vue";
export default {
name: "App",
setup() {
const original = reactive({ count: 0 });
const copy = readonly(original);
return {
copy,
};
},
};
</script>

We define the original reactive property with reactive .

Then we call readonly with original to create a read-only deep copy of the original.

And we return it, so we can use it.

Watch Reactive Properties

We can watch reactive properties with the watchEffect method.

For instance, we can write:

<template>
<div>{{ count }}</div>
</template>
<script>
import { ref, watchEffect } from "vue";
export default {
name: "App",
setup() {
const count = ref(0);
watchEffect(() => console.log(count.value));
    setTimeout(() => {
count.value++;
}, 100);
    return {
count,
};
},
};
</script>

We call watchEffect with a callback to log the value of count when it’s updated in the setTimeout callback.

watchEffect returns a function that we can use to stop the watcher.

To use it, we write:

<template>
<div>{{ count }}</div>
</template>
<script>
import { onBeforeUnmount, ref, watchEffect } from "vue";
export default {
name: "App",
setup() {
const count = ref(0);
const stop = watchEffect(() => console.log(count.value));
    setTimeout(() => {
count.value++;
}, 100);
    onBeforeUnmount(() => stop());
    return {
count,
};
},
};
</script>

We call stop in the onBeforeUnmount callback to stop the watcher when we’re unmounting the component.

Also, we can invalidate side effects with the onInvalidate function.

For instance, we can write:

<template>
<div>{{ size }}</div>
</template>
<script>
import { onBeforeMount, reactive, watchEffect } from "vue";
export default {
name: "App",
setup() {
const size = reactive({
width: 0,
height: 0,
});
    const onResize = () => {
size.width = window.innerWidth;
size.height = window.innerHeight;
};
onBeforeMount(() => window.addEventListener("resize", onResize));
    watchEffect((onInvalidate) => {
onInvalidate(() => {
window.removeEventListener("resize", onResize);
});
});
    return {
size,
};
},
};
</script>

to call window.removeEventListener to remove the event listener in the onInvalidate callback.

The onResize function sets the size when we change the screen by attaching it as the listener for the resize event.

Conclusion

We can add read-only properties and watch side effects with Vue 3’s composition API.

More content at plainenglish.io


Create Vue 3 Apps with the Composition API — Read-Only Properties and Side Effects was originally published in JavaScript in Plain English on Medium, where people are continuing the conversation by highlighting and responding to this story.