Vue3 Refs Dom

Posted on  by admin

How to get focus for input in vue3? How does vue3 setup syntactic sugar get the dom element?

In vue2, after setting the ref property on a component, you can access the corresponding DOM element via this.$refs.ref.

In JavaScript you can access. If you need to focus on the input box. There are no $refs in vue3, and there is no this, so you can use the ref() API to implement.

  • If each input box corresponds to a focus button, then we can wrap them into a Vue component so that there is only one input in each component!
  • Alternatively, you can use an array to achieve this.
  • Vue is one of the most beginner-friendly JavaScript frameworks I have ever used before.
  • I have been using Vue for almost 2 years and I have no stress about creating and updating the Vue component.
  • However, right after I started using Vue I wondered how we could manipulate DOM inside a Vue file. This issue will be resolved by using $refs to access DOM. Many developers might get the same issue so that I decided to write today's blog post.
  • So, I refer to it from the official Vue documentation.
  • ref is used to register a reference to an element or a child component. The reference will be registered under the parent component’s $refs object.

Static $refs

If used on a plain DOM element, the reference will be that element; if used on a child component, the reference will be component instance: I have attached the details of both $refs and ref introduced by the official Vue.js Documentation.

However, These are not kind enough for most of the developers who have never experienced using Vue.js. That's why hopefully this blog post will be a valuable source to help to understand the core concepts about $refs.

Looking for a Vue.js job?

To clarify the difference between $refs and ref, $refs is the object and all the DOM elements are contained within this object.

But, $refs itself is useless. ref should always be registered in the HTML code to take effect $refs. For example, to access to the DOM of the element which is set ref="slider", either this.$refs.slider or this.$refs['slider'] can be accessible to DOM.


In order to confirm the DOM of the one you are supposed to access, you can write console.log(this.$refs.slider) in mounted().

Then, the result of DOM will be displayed in the console of the dev tool as below. Until now, I have explained about $refs for DOM access. But actually, you can even manipulate DOM by using vanilla JavaScript like document.querySelector('test').

If you only need to manipulate DOM of the current component, You could use vanilla JavaScript instead of $refs.

But, I can't understand it by checking the official documentation...

The reason why $refs can be prepared for Vue is that with $refs we can access the DOM of a parent and child component. Moreover, even DOM of the plugin will be accessible by $refs.

With only vanilla JavaScript, It won't be possible. Before adding $refs into the component code, Please take a deep breath and consider that you do really need $refs to achieve the expected behavior. According to the basic concept of Vue.js, we should use Vue's features as much as possible rather than directly manipulate DOM.

That's how Vue is welcomed for the developers. We were all fatigued direct manipulation of DOM using jQuery. To be honest, I have had this mistake several times.

What is $refs and ref

It looks so amateur mistake but It has happened it anyway. To make $refs be applied to the component, the ref must be set to the target element you want to call out. Note that $refs and ref are the pair used for DOM manipulation.

I personally don't prefer to use or update the code which $refs are included in several parts.

Background question

However, sometimes It happens for the Vue developers. In addition, getting familiar with the specific feature of the daily used technology will eventually help to save your time a lot.

So hopefully, this blog post is worth reading and gaining someone's knowledge. Cheers for all the devs, Thanks! Modified1 year, 8 months ago. I am using Vue 3 beta version and I am trying to access ref in setup function, My component:.

Demo: But the value of tabs.value is undefined.

What I am doing wrong here? 33 gold badges3030 silver badges4444 bronze badges.

4444 bronze badges. You need to have setup() return a ref with the same name. You can't log the DOM result until after mounting (onMounted). See the docs for more examples: 66 gold badges9393 silver badges9999 bronze badges. 9999 bronze badges. You need to pass a value to ref in order to initialize it:.

Wrapping it up

Modified2 months ago. I am trying to get $refs in Vue 3 using Composition API. This is my template that has two child components and I need to get reference to one child component instance:.

In my code I use Template Refs: ref is a special attribute, that allows us to obtain a direct reference to a specific DOM element or child component instance after it's mounted.

The vue2 approach

If I use Options API then I don't have any problems:. However, using Composition API I get error:. Could anyone say how to do it using Composition API?

1111 gold badges5353 silver badges148148 bronze badges. 148148 bronze badges. You need to create the ref const inside the setup then return it so it can be used in the html.

Do you want to learn more about advanced Vue.js techniques?

22 gold badges44 silver badges1212 bronze badges. 1212 bronze badges. Inside your other component you can interact with events you already registered on onMounted life cycle hook as with my example i've registered only one evnet.

If you want, you can use getCurrentInstance() in the parent component like this code:. And this is the code of child component (here I called it MyCompo):.

2 things you should be considered before using $refs

You block advertising 😢Would you like to buy me a ☕️ instead? If you’re used to working with Vue 2 $refs and switch to the Vue 3 Composition API, you might wonder how to use $refs inside the new setup() method.

In this article, we find out how to use the new ref() function as a replacement for static and dynamic HTML element references.


When using the Vue 3 Composition API via the setup() method, we don’t have access to this.$refs, rather, we can use the new ref() function for the same result. You might wonder how this can work with dynamic references. Luckily after a short chat with Carlos Rodrigues, I knew the answer (the information is also in the official API documentation, but I somehow missed it).

Above you can see the example für dynamic Vue Composition API $refs from the official documentation.

Register for the Newsletter of my upcoming book: Advanced Vue.js Application Architecture.

Dynamic $refs in v-for

Although at first, I didn’t like the new $refs API very much, it gets the job done. I think it’s only a matter of time until we get used to the new way of doing things with the Composition API. Hello vue devs in this example i am going to discuss about vue 3 refs example with many example with source code so that you can understand better.

This template refs is only available in vue 3 version. So you will learn from this tutorial about vue refs details. You can ask that why vue refs? What is the purpose of using this?

Ok, let me clear about all of those questions. From the vue 3 official docs we can say that despite the existence of props and events, sometimes you might still need to directly access a child component in JavaScript.

To attain it we can assign a reference ID to the child component or HTML element using the ref attribute.

What if there are multiple input elements?

For example what we did before? And our vue code is. But what if we add refs in html element? Look adding a ref attribute to any html element within the template, we can refer to these elements on Vue instance.

More clearly, we can access the DOM elements. So let’s try it out on that button that I have added in above and make it for refs to use. Look you have seen that the button already has a click event handler which doesn’t do anything yet. Note :The ref attribute is not a standard HTML attribute, so it is only used by Vue.