While you can pass a function as a prop, this is almost always a bad idea. Instead, there is probably a feature of Vue that is designed exactly to solve your problem. If you keep reading you'll see what I mean.
Being able to add a dynamic class name to your component is really powerful. Adding a dynamic class name is as simple as adding the prop ':class' to your component. Of course, there is a lot more we can do here with dynamic classes in Vue.
In CSS it's pretty easy to change things on 'hover'. In Vue it gets a little trickier. In this short article you'll learn -- How to implement a hover effect in Vue, how to show an element on mouseover, and how to dynamically update classes with a mouseover.
Sometimes Vue's reactivity system isn't enough, and you just need to re-render a component. Or maybe you just want to blow away the current DOM and start over. So how do you get Vue to re-render a component the right way?
You'll want to use the 'mounted' lifecycle hook so that you can run code as soon as your component is mounted to the DOM. From this lifecycle hook you can fetch data, manipulate the DOM, or do anything else you might need in order to initialize your component.
I decided to do something a little weird, and maybe you’ll think I’ve gone (slightly) insane. I wanted to see what it would look like to make an `If...Else` component.
An extremely common question I get asked all the time is, “how do you know when to split up a component?” I want to share a simple pattern with you that is basically fool-proof, and can be applied to lots of components with almost no thought.
Take your components and break them up into smaller pieces. Or create new components and composables that let you encapsulate and reuse code in a better way. This is the simplest way to clean up your Vue app and make you and your team more productive.
There might be components hidden inside of your existing components. Finding them and extracting them will make your code simpler, and easier to use.
Wouldn't it be great if you could write with Markdown on Twitter, with code blocks and proper syntax highlighting? Well, I built myself a tool that does just that.
There are many patterns you can use to improve your composables. Using an object to pass parameters in is a very useful one that’s used all over the place — just take a look at the source of VueUse.
How do we structure the state in our applications more effectively? It’s a question I’ve asked myself a lot over the years, because state is so central to app development and can be so difficult to wrangle.
Composables are great, except that it seems we always need to create a new file for them. I want to explore some ways we can create inline composables — no need to create new files all over the place!
This has been a question on the mind of every Vue dev since the Composition API was first released: What’s the difference between `ref` and `reactive`, and which one is better?
Getting our code to work is great (and obviously necessary). But as professionals, we know that getting code to “work” is only 10% of the job. It also needs to work well.
I recently got this error while working on a Vue 3 project: TypeScript intellisense is disabled on template. No need to panic, just disable this Volar message exactly how it says.
If you’re a Nuxt developer, or plan to become one with Nuxt 3, you might be wondering what to use for state management.
If you’re a Nuxt developer, or plan to become one with Nuxt 3, you might be wondering what to use for state management.
Composables are, by far, the best way to organize business logic in your Vue 3 app. They let you extract small pieces of logic into functions that you can easily reuse repeatedly. I've teamed up with Vue Mastery to give you an in-depth series on composables.
In this article you'll see exactly why you should learn to use the composition API by comparing the old way to the new way. The examples also start out simple and get more complex, so you can see that the composition API isn't really all that different from what you're used to.
Every now and then you just need a small component, one that's not worth an entirely new file.
Named slots also have a shorthand syntax, one that's much nicer to look at.
Instead of passing in tons of props to a component individually, you can take a whole object and have all of its properties automatically bound to the component as props.
It took me a very long time to realize this, but anything in your component that is reactive can be watched.
If you get a variable from outside of Vue, it's nice to be able to make it reactive if you need to.
Scoped CSS is fantastic for keeping things tidy, but sometimes you need to override a child component's styles.
Scoped slots are lots of fun, but in order to use them you have to use a lot of `template` tags, too.
Instead of using `v-if`, it's sometimes more performant to use `v-show` instead.
You can provide a custom handler for errors and warnings in Vue.
You may not have known this, but you can easily watch nested values directly, just by using quotes.
Often I find that I'm copying prop types from a child component, just to use them in a parent component. But I've discovered that stealing those prop types is much better than just copying them.
Slots in Vue can have default content, but my favourite use is to create extension points.
It can be really tempting to quickly modify a component's CSS from outside of the component. If all you need is a slight modification, it seems harmless — but it's not.
If you've got a Vue component that won't update the way you expect it to, this debugging guide will help you to quickly identify and fix the problem.
First I'll show you how, then we'll get into why you'd want to hide slots.
Not every bit of info you add to a component is state. Sometimes you need to add some metadata that gives other components more information.
Slots allow you to write very powerful, expressive components. In this article we'll cover six of those patterns, so that you can take your slot skills to the next level.
It's a bold statement to make. But really, it's what we're all after, isn't it? To increase our impact, to make more change, to achieve more and get more done with less.
Inversion uses scoped slots heavily, so in this lesson we'll be diving into scoped slots to understand how they work, but at a deeper level. You'll see how thinking about slots as functions can make it much easier to see what's really going on.
Slots are better than props, but why is that the case? This video covers the inherent limitations of props, why slots are better, and why sometimes you want to actually avoid reusability.
Configuration is all about using props to allow for variations in how a component works (you're likely doing some form of this already)
Being able to pass data around your application is extremely important. It seems that child to child data sharing is where most of the confusion and frustration lay.
There are different kinds of props that we use in Vue, each with their own unique characteristics. In this article I'm going to explore what template props are, why they're useful, and what we can do with them.
One of my favourite things about them is how they let you reuse logic between components — but in a very unique way.
You know how to pass data into a slot by using scoped slots, but how do you communicate back?
While there are certain fundamental principles of software development that are extremely valuable to understand, most "best practices" are just (useless) opinions that can be safely ignored.
We all want to write less code, but get more done. To make this happen, we build our components so they can be reused more than just once.
Being able to use the keyboard with your application is necessary for accessibility. In this video series I show how to add keyboard support by managing the focus of the app.
I recently discovered that you can destructure in a v-for. It turns out not many of you knew this either, as this ended up being one of my most popular tweets:
Underneath it all, components are just functions that return some HTML. It's a huge simplification, and if you've ever looked at the complexity of the Vue codebase you know this isn't actually true. But, fundamentally, this is what Vue is doing for us — plus a million other amazing things.
There are times where you'll have to force Vue to re-render a component. Although these edge cases where Vue doesn't automatically update are rare, it's useful to know how to fix this issue when it comes up.
Control flow directives, like `v-if` and `v-for`, can create lots of nested code that's difficult to read. I've picked up this trick that makes it simple to transform these nightmares into fairy tales.
One of the most confusing attributes in Vue is `key`. It's not a directive like `v-for`. It's not a prop, even though it looks exactly like one. It has nothing to do with slots, lifecycle hooks, computed props or watchers.
We often think about the relationships between our components as a tree. The DOM is also represented this way, with parents and children and siblings and ancestors. I've noticed that many other problems can be transformed to look like trees, too.
Watchers can be an incredibly powerful tool. But once you know when to use them, you still have to figure out how. So I thought I'd show you an example from a project I've been working on.
What if you wanted to manage state, but you didn't want to use Vuex? Don't get me wrong, Vuex is a great tool. But it's not ideal for every use case.
How do you open up a package from Amazon? Do you start by jabbing your finger in the side to create a hole, and then tear open from there? Maybe you throw it against the wall until the box disintegrates, leaving behind your prize.
I have a problem. I drink waaaay too much tea. But that's not the real issue. Not really. After I'm finished steeping my tea to perfection, I forget to clean things up. Dirty mugs, tea stained spoons, and tea pots with tea leaves still in them.
There are a few instances where you want to be able to override the internal state of a component and force it open from the parent. The controlled props pattern is designed for exactly this situation.
Watchers are an often misunderstood feature in Vue. Some developers use them all the time. Some never use them. And how exactly are they different from computed props and methods?
Understanding how to use Vuex is great and all. But I want to dig deeper than that. You see, there are some fundamental principles for how state works. In any frontend framework.
Writing maintainable code is hard. It's hard to learn, and even harder to teach. Mostly, it's won through hard work and experience. But there are a few guidelines I've learned over the years that can get you there quicker.
If React is so much more popular than Vue, wouldn't it be better to just stick with that? There are 3 specific things here I'd like to cover: 1. Growth of the framework itself (innovation) 2. Career opportunities 3. Ease of learning/getting better
In Vue we have some directives that help us to control what gets rendered to the page, v-for and v-if. We call these things control flow because they control the flow of how code is executed. In Vue, they control the flow of what gets rendered to the page.
I've said it before and I'll say it again: Computed properties are the most important feature in Vue. Sure, scoped slots let you create some nice abstractions and watchers are useful too. But I don't think anything comes close to how valuable computed props are.
Just because the interface repeats, it doesn't mean your code needs to be repetitive as well. This is exactly why we invented computers — to do the tedious, boring things for us!
Computed properties in Vue should never have side effects. But it's really easy to accidentally add them in. A side effect is the modification of state, whether it's component state or global state.
In this short article we'll cover how to redirect to internal and external pages, if you're using Vue Router and if you're just using plain Vue.
You've probably learned that provide and inject allow you to do dependency injection. But they have nothing to do with it, and I'll show you why.
Learning is a topic I've been focused on for nearly a decade now, and in this article I'm going to share my thoughts on the subject and how I go about learning in my own life.
I recently figured out how to implement nested slots recursively, including how to do this with scoped slots.
By the time you're finished reading this guide, you'll know everything you need to know about props in order to be a super productive Vue developer.
Is there a way to populate a parent's slot from a child component? It's a thorny Vue architecture problem, but also a very interesting one.
I spend quite a bit of time scouring the web for great content on Vue. Over time I've found myself going to back to a few places over and over again. Many of these you've probably heard of, but hopefully you'll find a few gems in this list.
It's sort of cool to add a class to a component. But the real fun begins when you can conditionally bind classes — turning them on and off as you wish.
If you want to loop over a range in your Vue template, it's not too complicated. The v-for directive in Vue let's us loop over an array. But it also let's us loop over a range.
I felt like a freaking genius. My code had transcended bits and bytes. Now it was truly a work of art, worthy of awards and accolades... or so I thought.
Every now and then you'll need to programmatically focus on an input (or other element). This is often needed for accessibility, or to make the app more convenient to use.
You've gotten this terrible error, Unknown custom element <CustomComponent> - did you register the component correctly? Don't worry, I'll show you exactly how to fix this.
Getting your component interface right is _the most_ important thing. And you can't leave it for later. You have to get it right from the very start. But why is this so important?
Are you using prop types to their full potential? I know I'm not. It's a part of Vue that's just glossed over. So I collected these 5 tips on getting the most out of prop types.
There are lots of you that write blogs, and maybe you've been thinking about switching to a Vue-based platform. Maybe you haven't even gotten started yet. This is the first article in a series documenting my progress and my thoughts as I rebuild my blog in Vue.
When writing Vue applications, we waste our time by doing things the wrong way, when we could have been doing it the right way from the start. That's why I put together this list of 26 articles that will help you save time, by teaching you how to avoid some common time-wasters.
It's a confusing error: Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders. I'll show you a simple pattern you can use to fix this error - and never see it again.
Chances are if you've been developing with Vue for any amount of time, you've gotten this error: Property or method prop is not defined. Most of the time this error is because you misspelled a variable name somewhere. But there are other causes as well.
Computed properties and watchers are two of the most fundamental concepts in Vue. In this article you'll learn: what a watcher is and what a computed prop is, common use cases for both, the differences and similarities between them, and how to know which one to use.
You have an array or an object as a prop, and you want your app to do something whenever that data changes. So you create a watcher for that property, but Vue doesn't seem to fire the watcher when the nested data changes. Here's how you solve this
Vue comes with two different ways of storing variables, props and data. These can be confusing at first, since they seem like they do similar things, and it's not clear when to use one vs the other. So what's the difference between props and data?
I've been spending the last several weeks experimenting with the different things that we can do with renderless components. I've been pushing the limits pretty far, going past the edges of what Vue is intended to do. Along the way I've discovered a few neat things that I'd like to share with you!
You get an error that says: 'this is undefined'. Don't worry, you're not alone -- I've run into this issue countless times, and I'll show you just how to solve it.