Options API vs Composition API: Choosing the Right Approach for Your Team

A presentation at Vue London 2021 in October 2021 in by Ben Hong

Slide 1

Slide 1

Option API vs Composition API: Choosing the Right Approach for Your Team Ben Hong @bencodezen

Slide 2

Slide 2

Sta DX Engineer at Netlify Vue.js Core Team Member A little about me Nuxt Ambassador Vue Mastery Instructor Google Developer Expert ff Options API vs Composition API @bencodezen Vue.js London 2021

Slide 3

Slide 3

Before Vue 3, things were “simpler”… Options API vs Composition API @bencodezen Vue.js London 2021

Slide 4

Slide 4

Because there was only one way to write your components: Options API Options API vs Composition API @bencodezen Vue.js London 2021

Slide 5

Slide 5

options api.vue <script> export default { data: () => ({ count: 0 }), computed: { doubleCount() { return this.count * 2 } }, methods: { incrementCount() { this.count++ } } } </script>

<template> <h1>Standard Counter</h1> <p>Current Count: {{ count }}</p> <p>Double Count: {{ doubleCount }}</p> <button @click=”incrementCount”>+</button> Options API vs Composition API @bencodezen Vue.js London 2021 </template>

Slide 6

Slide 6

But with Vue 3 introducing the Composition API, it got a little more complicated… Options API vs Composition API @bencodezen Vue.js London 2021

Slide 7

Slide 7

composition api.vue <script> export default { data: () => ({ count: 0 }), computed: { doubleCount() { return this.count * 2 } }, methods: { incrementCount() { this.count++ } } } </script>

<template> <h1>Standard Counter</h1> <p>Current Count: {{ count }}</p> <p>Double Count: {{ doubleCount }}</p> <button @click=”incrementCount”>+</button> Options API vs Composition API @bencodezen Vue.js London 2021 </template>

Slide 8

Slide 8

composition api.vue <script> export default { setup() { }, data: () => ({ count: 0 }), computed: { doubleCount() { return this.count * 2 } }, methods: { incrementCount() { this.count++ } } } </script>

<template> <h1>Standard Counter</h1> Options API vs Composition API @bencodezen Vue.js London 2021 <p>Current Count: {{ count }}</p>

Slide 9

Slide 9

composition api.vue <script> export default { setup() { const count = 0 }, computed: { doubleCount() { return this.count * 2 } }, methods: { incrementCount() { this.count++ } } } </script>

<template> <h1>Standard Counter</h1> <p>Current Count: {{ count }}</p> <p>Double Count: {{ doubleCount }}</p> <button @click=”incrementCount”>+</button> Options API vs Composition API @bencodezen Vue.js London 2021 </template>

Slide 10

Slide 10

composition api.vue <script> import { ref } from ‘vue’ export default { setup() { const count = ref(0) }, computed: { doubleCount() { return this.count * 2 } }, methods: { incrementCount() { this.count++ } } } </script>

<template> <h1>Standard Counter</h1> <p>Current Count: {{ @bencodezen count }}</p> Vue.js London 2021 Options API vs Composition API <p>Double Count: {{ doubleCount }}</p>

Slide 11

Slide 11

composition api.vue <script> import { ref } from ‘vue’ export default { setup() { const count = ref(0) const doubleCount = computed(() => count.value * 2) }, methods: { incrementCount() { this.count++ } } } </script> <template> <h1>Standard Counter</h1> <p>Current Count: {{ count }}</p> <p>Double Count: {{ doubleCount }}</p> <button @click=”incrementCount”>+</button> </template>

Options API vs Composition API @bencodezen Vue.js London 2021

Slide 12

Slide 12

composition api.vue <script> import { computed, ref } from ‘vue’ export default { setup() { const count = ref(0) const doubleCount = computed(() => count.value * 2) }, methods: { incrementCount() { this.count++ } } } </script> <template> <h1>Standard Counter</h1> <p>Current Count: {{ count }}</p> <p>Double Count: {{ doubleCount }}</p> <button @click=”incrementCount”>+</button> </template>

Options API vs Composition API @bencodezen Vue.js London 2021

Slide 13

Slide 13

composition api.vue <script> import { computed, ref } from ‘vue’ export default { setup() { const count = ref(0) const doubleCount = computed(() => count.value * 2) const incrementCount = () => { count.value++ } } } </script> <template> <h1>Standard Counter</h1> <p>Current Count: {{ count }}</p> <p>Double Count: {{ doubleCount }}</p> <button @click=”incrementCount”>+</button> </template>

Options API vs Composition API @bencodezen Vue.js London 2021

Slide 14

Slide 14

composition api.vue <script> import { computed, ref } from ‘vue’ export default { setup() { const count = ref(0) const doubleCount = computed(() => count.value * 2) const incrementCount = () => { count.value++ } return { count, doubleCount, incrementCount } } } </script>

<template> <h1>Standard Counter</h1> <p>Current Count: {{ count }}</p> <p>Double Count: {{ doubleCount }}</p> <button @click=”incrementCount”>+</button> Options API vs Composition API @bencodezen Vue.js London 2021 </template>

Slide 15

Slide 15

And with Vue 3.2’s release of the new script setup syntax, it adds yet another style of writing components… Options API vs Composition API @bencodezen Vue.js London 2021

Slide 16

Slide 16

script setup.vue <script> import { computed, ref } from ‘vue’ export default { setup() { const count = ref(0) const doubleCount = computed(() => count.value * 2) const incrementCount = () => { count.value++ } return { count, doubleCount, incrementCount } } } </script>

<template> <h1>Standard Counter</h1> <p>Current Count: {{ count }}</p> <p>Double Count: {{ doubleCount }}</p> <button @click=”incrementCount”>+</button> Options API vs Composition API @bencodezen Vue.js London 2021 </template>

Slide 17

Slide 17

script setup.vue <script> import { computed, ref } from ‘vue’ setup() const const const { count = ref(0) doubleCount = computed(() => count.value * 2) incrementCount = () => { count.value++ } return { count, doubleCount, incrementCount } } </script> <template> <h1>Standard Counter</h1> <p>Current Count: {{ count }}</p> <p>Double Count: {{ doubleCount }}</p> <button @click=”incrementCount”>+</button> </template>

Options API vs Composition API @bencodezen Vue.js London 2021

Slide 18

Slide 18

script setup.vue <script setup> import { computed, ref } from ‘vue’ const count = ref(0) const doubleCount = computed(() => count.value * 2) const incrementCount = () => { count.value++ } return { count, doubleCount, incrementCount } </script> <template> <h1>Standard Counter</h1> <p>Current Count: {{ count }}</p> <p>Double Count: {{ doubleCount }}</p> <button @click=”incrementCount”>+</button> </template>

Options API vs Composition API @bencodezen Vue.js London 2021

Slide 19

Slide 19

script setup.vue <script setup> import { computed, ref } from ‘vue’ const count = ref(0) const doubleCount = computed(() => count.value * 2) const incrementCount = () => { count.value++ } </script> <template> <h1>Standard Counter</h1> <p>Current Count: {{ count }}</p> <p>Double Count: {{ doubleCount }}</p> <button @click=”incrementCount”>+</button> </template>

Options API vs Composition API @bencodezen Vue.js London 2021

Slide 20

Slide 20

So which one is the “right” one? Options API vs Composition API @bencodezen Vue.js London 2021

Slide 21

Slide 21

Approach #1: Options API Options API vs Composition API @bencodezen Vue.js London 2021

Slide 22

Slide 22

options api.vue <script> export default { data: () => ({ count: 0 }), computed: { doubleCount() { return this.count * 2 } }, methods: { incrementCount() { this.count++ } } } </script>

<template> <h1>Standard Counter</h1> <p>Current Count: {{ count }}</p> <p>Double Count: {{ doubleCount }}</p> <button @click=”incrementCount”>+</button> Options API vs Composition API @bencodezen Vue.js London 2021 </template>

Slide 23

Slide 23

Approach #1: Options API Pros: • Easy to learn • Consistency • Simplicity Options API vs Composition API @bencodezen Vue.js London 2021

Slide 24

Slide 24

Approach #1: Options API Pros: • Easy to learn • Consistency • Simplicity Options API vs Composition API @bencodezen Cons: • Opinionated • Less flexibility • Not as TS friendly Vue.js London 2021

Slide 25

Slide 25

Approach #2: Composition API Options API vs Composition API @bencodezen Vue.js London 2021

Slide 26

Slide 26

composition api script setup.vue <script setup> import { computed, ref } from ‘vue’ const count = ref(0) const doubleCount = computed(() => count.value * 2) const incrementCount = () => { count.value++ } </script> <template> <h1>Standard Counter</h1> <p>Current Count: {{ count }}</p> <p>Double Count: {{ doubleCount }}</p> <button @click=”incrementCount”>+</button> </template>

Options API vs Composition API @bencodezen Vue.js London 2021

Slide 27

Slide 27

Approach #2: Composition API Pros: • Flexibility • “Just JavaScript” • TS friendly Options API vs Composition API @bencodezen Vue.js London 2021

Slide 28

Slide 28

Approach #2: Composition API Pros: • Flexibility • “Just JavaScript” • TS friendly Options API vs Composition API @bencodezen Cons: • More flexibility • Higher barrier of entry • Lack of structure Vue.js London 2021

Slide 29

Slide 29

Approach #3: Options API + Composition API Options API vs Composition API @bencodezen Vue.js London 2021

Slide 30

Slide 30

options and composition api.vue <script> import { computed, ref } from ‘vue’ export default { setup() { const count = ref(0) const doubleCount = computed(() => count.value * 2) const incrementCount = () => { count.value++ } return { count, doubleCount, incrementCount } } } </script>

<template> <h1>Standard Counter</h1> <p>Current Count: {{ count }}</p> <p>Double Count: {{ doubleCount }}</p> <button @click=”incrementCount”>+</button> Options API vs Composition API @bencodezen Vue.js London 2021 </template>

Slide 31

Slide 31

options and composition api.vue <script> import { computed, ref } from ‘vue’ export default { setup() { const count = ref(0) const doubleCount = computed(() => count.value * 2) const incrementCount = () => { count.value++ } return { count, doubleCount, incrementCount } }, computed: { tripleCount() { return this.count * 3 } } } </script> Options API vs Composition API @bencodezen -

<template> Vue.js London 2021

Slide 32

Slide 32

Approach #3: Options API + Composition API Pros: • Structure w/ flexibility • Progressive enhancement • More TS friendly Options API vs Composition API @bencodezen Vue.js London 2021

Slide 33

Slide 33

Approach #3: Options API + Composition API Pros: • Structure w/ flexibility • Progressive enhancement • More TS friendly Options API vs Composition API @bencodezen Vue.js London 2021 Cons: • Two approaches • More verbose • Not as TS friendly

Slide 34

Slide 34

So which one is the “right” one? Options API vs Composition API @bencodezen Vue.js London 2021

Slide 35

Slide 35

What matters is choosing the right approach for your team. Options API vs Composition API @bencodezen Vue.js London 2021

Slide 36

Slide 36

Aspects to Consider Options API vs Composition API @bencodezen Vue.js London 2021

Slide 37

Slide 37

Aspects to Consider • Migrating or new? • Who is contributing? • Plan on using TypeScript heavily? • What does the team prefer? Options API vs Composition API @bencodezen Vue.js London 2021

Slide 38

Slide 38

⚖ Final Verdict? Options API vs Composition API @bencodezen Vue.js London 2021

Slide 39

Slide 39

Every approach is a valid one. Options API vs Composition API @bencodezen Vue.js London 2021

Slide 40

Slide 40

Every approach is a valid one regardless of what everyone else says. Options API vs Composition API @bencodezen Vue.js London 2021

Slide 41

Slide 41

Because at the end of the day, what matters are the features being shipped and whether the team enjoys working with the code base. Options API vs Composition API @bencodezen Vue.js London 2021

Slide 42

Slide 42

Thank you! bencodezen.io twitter.com/bencodezen youtube.com/bencodezen twitch.tv/bencodezen Options API vs Composition API @bencodezen Vue.js London 2021