[Rails] Vue-outlet for Turbolinks
keywords: webpacker
說明如何在 Rails Turbolinks 中搭配使用 Vue。
Initialize the App
# initialize the app
rails new rails_sandbox_vue --database=postgresql --webpack=vue
# install package
bundle
yarn
Scaffold the app
# Scaffold the app
bin/rails g scaffold User name email
# Create database and migrate
bin/rails db:setup
bin/rails db:migrate
Create Vue Component
在 ./app/javascript/
中建立 vue component hello_vue.vue
<!--
./app/javascript/hello_vue.vue
-->
<template>
<div>
<h4>{{ message }}</h4>
<ul>
<li>Object: {{ obj }}</li>
<li>Number: {{ num }}</li>
<li>Array: {{ arr }}</li>
<li>String: {{ str }}</li>
</ul>
</div>
</template>
<script>
export default {
props: ['obj', 'arr', 'num', 'str'],
data: function () {
return {
message: 'Hello, Vue and Turbolinks',
};
},
};
</script>
<style scoped>
h4 {
font-size: 2em;
text-align: center;
color: steelblue;
}
</style>
Create Vue Adapter
在 ./app/javascript/packs/
中建立 vue_adapter.js
,在 import Vue 的地方要載入 vue.esm.js
可以 compile template 的版本。另外要把需要使用到的 Vue Component 在這裡執行註冊:
// ./app/javascript/packs/vue_adapter.js
// import Vue
import Vue from 'vue/dist/vue.esm.js';
// import your components
import HelloVue from 'hello-vue';
// register your components
Vue.component('hello-vue', HelloVue);
function VueConstructor() {
let outlets = document.querySelectorAll('[data-vue-component-outlet]');
outlets.forEach(function (outlet, index) {
let id = outlet.getAttribute('data-vue-component-outlet');
new Vue({
el: '[data-vue-component-outlet=' + id + ']',
});
});
}
if (typeof Turbolinks !== 'undefined' && Turbolinks.supported) {
document.addEventListener('turbolinks:load', VueConstructor);
} else {
document.addEventListener('DOMContentLoaded', VueConstructor);
}