Vue.jsのライフサイクルとOnsen UIについて
はじめに
Monacaでは、「Onsen UI + Vue.js」テンプレートが用意されています。
Onsen UIでは、「ons.disableAutoStyling()」メソッドのようにOnsen UIを呼び出した直後に実行する必要がある機能があります。
今回は、Vue.jsで開発する場 合、どのライフサイクルのタイミングで「ons.disableAutoStyling()」メソッドを実行すれば適用されるか確認してみました。
注意点として、「Onsen UI + Vue.js」で「ons」オブジェクトを使う場合は、「this.$ons」でアクセスする必要があります。
検証するライフサイクル
今回検証したVue.jsのライフサイクルは、
ライフサイクル名 | 説明 |
---|---|
beforeCreate | インスタンスが初期化されるときに呼ばれます。 |
created | インスタンスが作成された後に呼ばれます。 |
beforeMount | マウントが開始される直前に呼ばれます。 |
mounted | インスタンスがマウントされた後に呼ばれます。 |
になります。
検証環境
検証環境は、以下になります。
- 使用テンプレート:Onsen UI V2 Vue Tabbar
- 検証端末:Androidエミュレーター APIレベル26
- 検証端末:Android版Monacaデバッガー v7.0.9
- 検証コード:main.js
import 'onsenui';
import Vue from 'vue';
import VueOnsen from 'vue-onsenui';
// Onsen UI Styling and Icons
require('onsenui/css-components-src/src/onsen-css-components.css');
require('onsenui/css/onsenui.css');
import App from './App.vue';
Vue.use(VueOnsen);
new Vue({
beforeCreate() {
console.log("beforeCreate");
// this.$ons.disableAutoStyling();
// document.addEventListener("deviceready", onDeviceReady, false);
// function onDeviceReady() {
// console.log("onDeviceReady");
// }
// this.$ons.ready(function() {
// console.log("$ons.ready");
// });
},
created() {
console.log("created");
// this.$ons.disableAutoStyling();
},
beforeMount() {
console.log("beforeMount");
// this.$ons.disableAutoStyling();
},
mounted() {
console.log("mounted");
// this.$ons.disableAutoStyling();
},
el: '#app',
template:'<app></app>',
components: { App }
});
検証1
上のコードを実行すると、下の画像の順番でログが出力され、タブの位置は上になりデフォルトでオートスタイリングが有効の状態になっています。
検証2
各ライフサイクルに設定されている「this.$ons.disableAutoStyling()」のコメントを外して実行したところ、
- beforeCreate
- created
- beforeMount
までは、下の画像のようにタブの位置は下になり、オートスタイリングの解除が有効になりま したが、
- mounted
では、タブの位置は上になりオートスタイリングが有効の状態に戻りました。
検証3
「beforeCreate」に記載されている「deviceready」と「this.$ons.ready()」のコメントを外すと、下の画像の順番でログが出力されました。
「this.$ons.ready()」に設定されているコールバック関数は、Onsen UIの初期化が完了した後に呼び出される関数になります。
「mounted」の後に「$ons.ready」が出力されていますが、Onsen UIの初期化が完了する前でも「mounted」で「this.$ons.disableAutoStyling()」を実行した場合は、設定が間に合っていないことが分かります。
おわりに
今回検証した「ons.disableAutoStyling()」をVue.jsで使う場合は、「mounted」よりも前に実行する必要があることが分かりました。
そのほか、実行するタイミンが指定されている機能の場合は、Vue.jsのライフサイクルを意識して実装する必要がありそうです。
Vue.jsのライフサイクルの詳細については、ライフサイクルフック を参照してください。