Vue.jsアプリでのIonic4コンポーネントの使用
Vue.jsはすべての正当な理由で人気を集めており、VueとプログレッシブWebアプリケーションの組み合わせの将来は明るいように見えます。 IonicはモバイルファーストUXを組み合わせる最前線のWebフレームワークであり、現在Angular 5.xを搭載していますが、チームの新しい Stencil コンパイラにより、Vue.jsはIonic4と同じWebコンポーネントを使用できます。
Ionic 4は現在アルファ版であり、本番環境で使用するべきではありませんが、それでも、これは優れた思考実験であり、ステンシルの利点と、フレームワークに依存しないUIコンポーネントにとってのWebコンポーネントの意味を深く掘り下げます。
開始するには、VueCLIを使用して新しいVueプロジェクトを作成します。
# Install the Vue CLI $ npm install vue-cli # Create a new Vue project $ vue init webpack-simple vue-ionic # Change directory $ cd vue-ionic # Add vue-router and axios $ npm install vue-router axios # Run development server $ npm run dev
REST API
json-server
を使用してローカルRESTAPIを作成できます。これにより、サーバーに対してToDoを簡単にGETおよびPOSTできます。 まだインストールしていない場合は、これをマシンにグローバルにインストールします。
$ npm install json-server -g
サーバーは、JSONシリアル化データベースで起動できます。 プロジェクトのルート内にdb.json
という名前のファイルを作成します。
db.json
`` `json {“ todos”:[{“ id”:1、“ name”:“ Make awesome Applications”}、{“ id”:2、“ name”:“ Play squash”}、{“ id”: 3、“ name”:“ Deadlift”}、{“ id”:4、“ name”:“ Squat”}]} `` `
ターミナルで以下を実行してAPIを開始します。
$ json-server db.json --watch --port 3001
APIが稼働しているので、Ionicを追加しましょう!
イオンの追加
プロジェクト内にIonicのアルファ版を追加するには、index.htmlファイルに次のスクリプトを追加します。
<script src="https://unpkg.com/@ionic/[email protected]/dist/ionic.js"></script>
Ionicコアの現在のバージョンはここにあります: https://www.npmjs.com/package/@ionic/core
同時に、適切なレスポンシブメタタグがあることを確認してください。
<meta name="viewport" content="width=device-width, initial-scale=1.0">
ルート
次に、ToDoアイテムを表示するか、ToDoアイテムを追加する2つのルートを設定できます。
App.vue
import Vue from 'vue' import VueRouter from 'vue-router'; import TodoList from './components/TodoList'; import AddTodoItem from './components/AddTodoItem'; Vue.use(VueRouter); const routes = [ { path: '', redirect: '/todos'}, { path: '/todos', component: TodoList }, { path: '/todos/add', component: AddTodoItem} ] export default new VueRouter({ routes })
その後、main.js
内のメインVueインスタンスにルーター構成を追加します。
main.js
import Vue from 'vue' import App from './App.vue' import router from './router' new Vue({ el: '#app', router, render: h => h(App) })
IonicWebコンポーネント
Ionic 4.xはWebコンポーネントを使用して構築されているため、ion-
コンポーネントはVueコンポーネントではないことをVueに通知する必要があります。 main.js
内に、すべてのIonic要素を無視する次の構成オブジェクトを追加します。
main.js
Vue.config.ignoredElements = [/^ion-/]
App.vue
内に、<router-view>
を追加し、これを<ion-app>
コンポーネントで囲むことができます。 これは、すべてのIonicコンポーネントを囲むために使用されます。
App.vue
<template> <ion-app> <router-view></router-view> </ion-app> </template>
Todoリスト
router.js
内に登録したToDoリストページを作成するには、src/components
フォルダー内にTodoList.vue
という名前のファイルを作成します。
created
フック内で、APIからtodos
をキャプチャし、それらをtodos
配列に割り当てています。
TodoList.vue
import axios from 'axios'; export default { data() { return { todos: [] } }, methods: { addTodo() { this.$router.push({path: '/todos/add'}) } }, created() { axios.get('http://localhost:3001/todos') .then(res => this.todos = res.data) } }
次に、過去にIonicを使用したことがある人と同じように見えるテンプレートを追加できます。
<template> <ion-page> <ion-header> <ion-toolbar class="toolbar-md-primary"> <ion-title>TodoList</ion-title> </ion-toolbar> </ion-header> <ion-content class="content"> <ion-list> <ion-item v-for="todo in todos" :key="todo.id"> {{todo.name}} </ion-item> </ion-list> <ion-fab-button class="todo-fab" @click="addTodo"> <ion-icon name="add"></ion-icon> </ion-fab-button> </ion-content> </ion-page> </template>
コンポーネントをion-page
要素の中にラップします。 これにより、ナビゲーションバーを表示する機能を提供するヘッダーとツールバーを定義できます。
次に、ion-content
要素内のリストを表示し、todos
配列内の各アイテムをion-item
として反復処理できます。
ファブボタンのスタイルを設定し、パディングを追加します。 両方のコンポーネントで両方のクラスを使用するので、style.css
ファイルと適切なクラスを追加しましょう。
style.css
.todo-fab { position: fixed; bottom: 25px; right: 15px; font-size: 30px; } .content { padding: 10px 10px 10px 0px }
これにより、次の結果が得られます
ユーザーがFABボタンをクリックすると、[Todoの追加]ページに移動します。 components/AddTodoItem.vue
で作成しましょう。
AddTodoItem.vue
<template> <ion-page> <ion-header class="toolbar-md-primary"> <ion-toolbar> <ion-title>Add Item</ion-title> </ion-toolbar> </ion-header> <ion-content class="content"> <ion-item> <ion-input :value="name" ref="newTodoItem" @input="updateTodoName" placeholder="Todo Name"></ion-input> </ion-item> <ion-fab-button class="todo-fab" @click="addTodo"> <ion-icon name="checkmark"></ion-icon> </ion-fab-button> </ion-content> </ion-page> </template>
マークアップは非常によく似ていますが、今回はion-input
を使用しています。 新しいtodoアイテムのvalue
を取得するために、ref
イベントとinput
イベントを使用しています。
import axios from 'axios'; export default { data() { return { name: '' } }, methods: { addTodo() { const newTodo = { name: this.name } axios.post('http://localhost:3001/todos', newTodo) .then(res => { this.$router.push({path: '/todos'}) }) }, updateTodoName() { this.name = this.$refs.newTodoItem.value } } }
このページのコードも非常によく似ています。誰かがFABボタンをクリックするたびに、axiosを使用して新しいTodoアイテムをAPIに追加しています。