How to "destructure" props in Vue like you did in React

Coming from React, I really enjoyed passing down destructured props to child components, I thought it made the components cleaner and easier to read. Recently, I've been working a lot in Vue and thought Id share how to do the same thing we can do in React but in Vue.

# The Skinny

<my-component v-bind="propsObjectIWantToSendToChild" />

# The not so skinny

# What does v-bind do?

From the docs:

Dynamically bind one or more attributes, or a component prop to an expression.

# What does this mean?

We know in HTML we can add a class as an attribute

<p class="my-class">Here is a p tag</p>

But in Vue we might want to conditionally set the class using some Javascript.

computed: { loadingClass() { return isLoading ? 'active' : ''; } } // template
<p v-bind:class="loadingClass">Here is a p tag</p>

Or we can use the nice shorthand Vue gives us for v-bind, removing v-bind and just adding :class

<p :class="loadingClass">Here is a p tag</p>

# Passing props

Usually, if I want to pass props to a component, we do something similar to the example above.

<my-component :user-id="userId" :user-name="userName" />

But sometimes we need to pass more than 1 or 2 props and it becomes a bit hard to keep track of and bloats the template.

Insert v-bind

We can take the same component and do something like the following.

// my_parent_component.vue computed: { myProps() { //please dont use this as a
computed function name :) return { userName: this.userName, userId: this.userId
}; }, }, // template <my-component v-bind="myProps" />

Then in my component you declare your props like any other component:

// my_component.vue
props: {
  userId: {
    required: true,
    type: String,
  },
  userName: {
    required: true,
    type: String,
  },
},

Hopefully this helps clean your templates up and you learned something.

# Resources

  • https://vuejs.org/v2/guide/components-props.html
  • https://vuejs.org/v2/api/#v-bind