Which is the better option for selecting DOM elements in a Vuejs 3 application: using raw js or jquery?

 I am currently working on developing an application using Node.js and Vue.js 3. One of the features I have implemented is a sidebar that dynamically fetches links from a routes file and displays them. The sidebar consists of a component that organizes a list of recursive link components.

 As the number of links grows and becomes recursive, I am facing challenges in handling class toggling (such as active, showing, collapsed) for each link and ensuring proper relationships between them (ensuring only one is active at a time) purely with Vue.js. Should I rely on querySelector or consider utilizing frameworks like jQuery to assist with this, or should I adhere to a purely Vue.js approach?

Edit:

 I am not seeking community opinions on this matter. My main goal is to gain a pragmatic understanding of why manipulating the DOM "outside" of Vue may or may not be advisable.

Answer №1

When working with Vue, it's best to let the framework be in control of the DOM rather than making direct changes yourself. This applies not only to Vue but also to other SPA frameworks like React and Angular.

The reason for this is that Vue operates by modifying the DOM on its own and expects to have full control over it. When rendering components, Vue removes old DOM elements, adds new ones, updates event bindings, and optimizes to only update necessary DOM nodes.

If you interfere and make direct changes that Vue is unaware of, your changes may get overwritten by Vue during the next render or conflict with bindings that Vue relies on.

While it's possible to work with Vue and jQuery together if you're knowledgeable about Vue's lifecycle, it's generally not recommended. Vue and jQuery function differently; jQuery modifies the DOM directly while Vue builds components that manage their own state and rendering.

Trying to use both frameworks together diminishes their individual advantages and adds complexity in managing conflicting state and rendering theories. It often proves easier to rewrite a jQuery widget in Vue directly rather than embedding it within a Vue app.

This shift requires changing habits developed from working with jQuery, such as building the entire DOM structure and then adding control structures afterward. In Vue, it's better to integrate logic into components so that the framework can handle the work for you.

I recommend creating one Vue component for each link that manages its own state for open/closed/active states and recurses to its children when "open". By approaching navigation data in this way, you allow Vue to manage the tree more efficiently compared to manually controlling it as you would with jQuery.

Similar questions

If you have not found the answer to your question or you are interested in this topic, then look at other similar questions below or use the search

Innovative concepts for designing web applications

Here's a unique situation that requires some brainstorming. I'm looking for any advice or suggestions. Imagine a tennis court equipped with sensors throughout - the net, lines, everything has sensors built in. These sensors are constantly sending ...

The failover process for PayPal involves seamless transitions to backup systems in the

I am currently assisting a client with a unique architecture setup: Back End Running on Java Server Front End Powered by Proxy (Node JS + Express application) For security reasons, all requests made to the server must pass through the Proxy. We ar ...

Avoiding unlimited re-renders when using useEffect() in React - Tips and Strategies

As a new developer, I recently built a chat application using socket io. In my code, I have the useEffect hook set to only change when the socket changes. However, I also have setMessage within the body of useEffect(), with socket as a dependency. Unfortun ...

The Vuejs Fetch GET Request encounters a failure, despite working flawlessly in Postman and the browser, all thanks to a 302 redirection

In my web application developed with NuxtJS/Vuejs, I have a field where users can input a URL. The application is supposed to make a GET request to that URL and retrieve data, often related to GitHub in either XML or JSON format. However, when I try to pr ...

What are the best methods for capturing individual and time-sensitive occurrences within a service?

I am currently working on structuring the events within a service to enable a mechanism for subscribing/unsubscribing listeners when a controller's scope is terminated. Previously, I utilized $rootScope.$on in this manner: if(!$rootScope.$$listeners[& ...

Steps to transfer selected autocomplete value ID to data attribute using jQuery

I am working on a project where I need to store the State ID in my database instead of the State Name. Currently, I am using an autocomplete query to select the State. How can I pass the selected State's respective ID to the data-attribute of the inpu ...

Leveraging body-parser for capturing an indefinite amount of text fields in node/express

Background In pursuit of my Free Code Camp back end certification, I am embarking on the task of creating a voting application. For detailed information and user stories required for this project, visit this link: Among the user stories is the ability to ...

Guidelines for sending data as an array of objects in React

Just starting out with React and I have a question about handling multi select form data. When I select multiple options in my form, I want to send it as an array of objects instead of an array of arrays of objects. Can anyone help me achieve this? import ...

What causes certain event handlers to be activated when using dispatchEvent, while others remain inactive?

When it comes to event-based JS, there are two main APIs to consider: event listeners and event handlers. Event listeners can be registered using addEventListener, while event handlers are typically registered with an API similar to target.onfoobar = (ev) ...

javascript - Utilizing the latest ES6 syntax

During my exploration of the source code for an open source project (react data grid), I came across a syntax that left me puzzled: class EditorBase extends React.Component { getStyle(): {width: string} { return { width: '100%' ...

Submitting an ajax form with the use of the symbol '&'

I am currently working on a form submission using the .ajax() method. Within my script, I have the following code: data: dataString, The variable dataString is composed of: var list = $('.listsummary').val() The listsummary class is assoc ...

In JavaScript, a "switch statement" retrieves a test value from a "input type text" by accessing the value using getElementByName.value

Attempting to test 7 possible values for the variable 'a' by passing it to a function from user input in seven 'input type text' boxes, then checking each value individually with clicks on 7 'input type image' elements. Howeve ...

The intricacies of JavaScript recursion explained thoroughly

I'm struggling to grasp how this recursion will function. Specifically, I can't seem to comprehend how the final console ('end'--) is being executed. Any guidance on the execution aspect would be greatly appreciated as I am having troub ...

An HTML attribute with a blank value will not display the equals sign operator

jQuery can be used like this: $select.append('<option value="">All</option>'); This code appears to insert the element in HTML as follows: <option value>All</option> However, what is intended is to append the elemen ...

Incorporating external CSS and JS files into your WordPress website

Hello, I am unfamiliar with the Wordpress framework and I am seeking guidance on how to add an external CSS and JS file to my Wordpress page. I have successfully created a new page, but would like to incorporate a CSS and JS file into it. Would creating a ...

Receiving a JSON response from express.js via a jQuery get request is not functioning as expected

My goal is to send a JSON value from the back end to the front end of my application. Currently, I am using express.js and all post methods are working perfectly. When a button is clicked in the front-end of my application, I want to receive an invoice nu ...

Unleashing the Power of Node.js: A Step-by-Step Guide to Crafting

I am developing a console interface that prompts the user with questions and receives input through the console. Some questions require the user to provide a limited number of inputs. I have researched ways to obtain console input in node js, but I haven&a ...

Update a Div automatically without causing it to scroll back to the beginning of the Div

I'm encountering an issue with a script on my website that refreshes a Div every 20 seconds. The problem is, after the refresh, it automatically scrolls to the top of the Div. I want it to remain at the last scroll position and not jump to the top. Ca ...

The art of transforming properties into boolean values (in-depth)

I need to convert all types to either boolean or object type CastDeep<T, K = boolean> = { [P in keyof T]: K extends K[] ? K[] : T[P] extends ReadonlyArray<K> ? ReadonlyArray<CastDeep<K>> : CastDeep<T[P]> ...

Using JavaScript promises to handle connection pooling and query execution

I am contemplating whether this approach is on the right track or if it requires further adjustments. Should I consider promisifying my custom MySQL getConnection method as well? request: function(queryRequest) { return new Promise(function(re ...