Transferring information between Rails views and VueJS components using webpacker

Struggling to work with Rails 5.1's webpacker gem and VueJS, I am unable to pass data from my erb views to VueJS components...

Imagine I have a user show view

# view/users/show.html.erb
<%= javascript_pack_tag "user-card" %>
<%= content_tag :div,
  id: "user-card",
  data: {
    username: @user.name
  } do %>
<% end %>

Here is the corresponding javascript:

// app/javascript/packs/user-card.js
require("user-card")

// app/javascript/user-card/index.js
import Vue from 'vue/dist/vue.esm'
import UserCard from './components/UserCard'

document.addEventListener('DOMContentLoaded', () => {
  let element = document.getElementById("user-card")
  let username = element.dataset.username
  console.log(username); // => "pecpec"

  const app = new Vue({
    el: element,
    template: '<UserCard/>',
    components: { UserCard },
    data () {
      return { username }
    }
  })


// app/javascript/user-card/components/UserCard.vue
<template>
  <div>
    <h3>Hello {{ username }}</h3>
  </div>
</template>

<script>
export default {
  props: ['username'],
  data () {
    return {
      username: ""
    }
  }
}
</script>

I've been struggling for hours on this issue without success. I've tried passing the data as a prop: props: ['username'], then mounting the component using

Vue.component(UserCard, {
  props: ['username']
  // or
  data () {
    return { username: username }
  }
})

... but nothing seems to be working

Update: I included props: ['username'] in the component as suggested, however, it has not made any difference. Still no luck!

Answer №1

Wow, it actually works! Check out my solution... I'm not entirely sure if this is the most conventional way to go about it, but hey, it gets the job done. Looking at it now, it seems pretty straightforward... Hopefully, this can be of assistance to others. Here's the fully updated code snippet:

# view/users/show.html.erb
<%= javascript_pack_tag "user-card" %>
<%= content_tag :div,
  nil,
  id: "user-card",
  data: { username: @user.name }
 %>
// app/javascript/packs/user-card.js
require("user-card")

// app/javascript/user-card/index.js
import Vue from 'vue/dist/vue.esm'
import UserCard from './components/UserCard'

document.addEventListener('DOMContentLoaded', () => {
  let element = document.getElementById("user-card")
  let username = element.dataset.username

  const app = new Vue({
    el: element,
    data: { username: username },
    template: '<UserCard :username="username"/>',
    components: { UserCard }
  })
})

// app/javascript/user-card/components/UserCard.vue
<template>
  <div>
    <h3>Hello {{ username }}</h3>
  </div>
</template>

<script>
export default {
  props: ['username']
}
</script>

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

Implementing Do Not Track in an express application

I am trying to implement a feature named "consent" in my Nodejs express app that utilizes the Do Not Track (DNT) functionality from browsers. This function is supposed to integrate Google analytics on rendered pages only when DNT is not active or its state ...

Different methods for looping through undefined values within Arrays

While exploring the use of .map, I made an interesting discovery regarding arrays with holes, where certain indices are defined while others remain undefined: // Holed var array = []; array[0] = 1; array[2] = 3; array // => [1, undefined, 3]; // Not H ...

Incorporating JavaScript Library with NativeScript

Currently delving into the world of NativeScript, I have successfully created a basic app. Now, my goal is to integrate a JavaScript library that I've utilized before. To achieve this, I executed the following command: npm install git://github.com/my ...

Effortlessly stream a series of video files in consecutive order using HTML's <video> tag

Having experimented with various approaches: I attempted to utilize hidden video tags and toggle their visibility, but encountered flickering issues. Another strategy involved modifying the src attribute of the video. However, I found that I needed to ...

Vue.js v-else-if directive not functioning properly: Unable to resolve directive: else-if

I am encountering a compilation error while using "if" and "else-if". [Vue warn]: Failed to resolve directive: else-if Here is the code I am working with: var app = new Vue({ el:"#app", data:{ lab_status : 2 } }); <script src="https: ...

Updating the route in Express.js/Node.js to redirect form submission from `/page` to `/page/<input>`.Is this fine for you

How can I redirect a user from /page to /page/:nickname in Express after they enter a nickname and click submit? This is my code: // app.js app.get("/page", (request, response) => { response.render("page"); }); app.get("/page/:nickname", (reques ...

Retrieve the URL of the image from an XML document

Figuring out how to extract the image URL from XML files in Android Studio can be challenging. After analyzing 30 RSS Feed XMLs, I discovered that 95% of them contain ".jpg" images with links starting with "http," not "www." Therefore, I am working on a co ...

Is it possible to resend an AJAX request using a hyperlink?

Is it possible to refresh only the AJAX request and update the content fetched from an external site in the code provided below? $(document).ready(function () { var mySearch = $('input#id_search').quicksearch('#content table', ...

Encountering issues with local references when generating a staging or production build in Angular

Here is the template code along with the error message I encounter when trying to build, even though it works fine with `ng serve`. <input type="text" class="form-control unit-price" name="unit_price" [(ngModel)]="ite ...

Is there a way to set up my node package to automatically load sources without having to specifically mention the src directory?

My Node package is structured as follows: ./my-package ./src ./index.js ./a.js ./b.js README.md package.json The package.json file specifies "main": "./src/index.js" and the module loads correctly. However, to import a specific JavaScri ...

SVG tags are not functioning properly

Hello, I am new to working with SVG files. I have a set of icons created using SVG and I am attempting to use the <use> tag in order to display a specific part of an SVG file. However, I seem to be encountering some issues and I am unable to identi ...

Simultaneously Operating Node and Apache Servers

Currently, I am developing a project that enables users to track energy usage. The main dashboard is a sleek web app that heavily relies on javascript and ajax. At the moment, the server operates on apache with php; however, my plan is to integrate node.js ...

Can you explain how to retrieve the selector from the objects $(document) and $(window)?

Can anyone help me understand how to retrieve the selector from $(document) and $(window)? el = $(document); alert(el.selector); // When I run this, it returns nothing. How can I output -> document? el = $(window); alert(el.selector); // Again, this ...

RecoilRoot from RecoilJS cannot be accessed within a ThreeJS Canvas

Looking for some guidance here. I'm relatively new to RecoilJS so if I'm overlooking something obvious, please point it out. I'm currently working on managing the state of 3D objects in a scene using RecoilJS Atoms. I have an atom set up to ...

Change the data-theme using jQuery Mobile once the page has finished loading

I am facing an issue with my buttons in a control group that represent on/off functionality. Every time I click on one of the buttons to switch their themes, the theme reverts back once I move the mouse away from the button. How can I make sure that the ...

How can I swiftly load or insert HTML code into an HTML file using jQuery?

I'm currently developing a mobile app using Cordova, essentially an html-based application running in an app wrapper. I have numerous elements and html code that need to be consistent across all pages, such as navigation menus, popups, and more. When ...

What is the process to navigate through images by clicking buttons in Angular?

Looking for a solution to cycle through a series of images using previous/next buttons? The goal is to have the image dynamically change with Angular. When one of the buttons is clicked, a different image from an array in the controller should be displaye ...

Using Vue to append elements that are not part of the loop

While looping over a table row, I realized that each of the table rows should be accompanied by another table row containing additional data from the loop. Unfortunately, I am struggling to insert <tr class="data-spacer"></tr> <tr& ...

What is the best way to extract a specific section of JSON data using nodejs?

I am currently working on a nodeJS script that listens for webhook events and then adds the data to firebase. The script is functioning well with the following code: let data = { addresses: event.data["addresses"], c ...

The HTML drag and drop API is causing an issue where the `getData`

My website features a drag-and-drop functionality, and I'm utilizing the HTML drag-and-drop API to implement it. However, when I attempt to drag and drop an SVG image onto the canvas, it displays as undefined, and I would like the image to remain in t ...