Rails 6 и компонент Vue

#javascript #ruby-on-rails #vue.js

#javascript #ruby-on-rails #vue.js

Вопрос:

У меня есть приложение в Vue, работает отдельно. Но если я добавлю его в Rails, я не знаю, как создать компонент (у меня их много, использую v-for ). В моем автономном коде

 import { createApp } from 'vue'
import App from './App.vue'
import Bar from './components/Bar.vue';

const app = createApp(App);

app.component('light-bar', Bar);

app.mount("#light-bars");

 

Но я не могу создать подобный компонент в Rails javascript/packs/light_bar.js .

Пожалуйста, как создать компонент внутри Rails javascripts? Мой light_bar.js выглядит так:

 import Vue from 'vue'
import App from '../light-bars/app.vue'
import Bar from '../light-bars/components/Bar.vue'

document.addEventListener('DOMContentLoaded', () => {
  const app = new Vue({
    render: h => h(App),
    components: {
      'light-bar': Bar
    }
  }).$mount('#light-bars');

  console.log(app);
});


 

Я также попытался импортировать и зарегистрировать компонент в своем приложении, например

 import Bar from './components/Bar.vue'
export default {
  name: 'App',
  data() {
    return {
      barsData: []
    };
  },
  components: {
    'light-bar': Bar
  }
...

 

и шаблон выглядит так

 <template>
  <div class="container">
    <h3>Úrovně osvětlení pro různé situace</h3>
    <div class="row">
      <light-bar
        v-for="bar in barsData"
          :key="bar.id"
          :luxRange="bar.luxRange"
          :luxRangeName="bar.luxRangeName"
          :luxLevel="bar.luxLevel"
          :compensation="bar.compensation"
      ></light-bar>
    </div>
</div>
</template>
 

Но компонент не появляется. Любые советы, что я делаю неправильно?

Ответ №1:

Я понял это. Но это немного странно, я зарегистрировал компонент в обоих местах, packs/light-bars.js а также в моем приложении.

 import Bar from './components/Bar.vue';
export default {
  name: 'App',
  data() {
    return {
      barsData: []
    };
  },
  components: {
    'light-bar': Bar
  },
...
 

и

 import Vue from 'vue'
import App from '../light-bars/app.vue'
import Bar from '../light-bars/components/Bar.vue'

document.addEventListener('DOMContentLoaded', () => {
  const app = new Vue({
    render: h => h(App),
    components: {
      'light-bar': Bar
    }
  }).$mount('#light-bars');

  console.log(app);
});