原文:https://alligator.io/vuejs/vue-ionic/
js正以各種正確的理由受到歡迎,Vue和先進的Web應用程序的結合前景光明。Ionic是一個處於結合移動優先用戶體驗(mobile first UX)前沿的web框架,盡管它目前由Angular 5.x提供支持,但該團隊的新Stencil編譯器允許Vue.js使用與Ionic 4相同的web組件。
Ionic4目前處於alpha中,不應用於生產,但盡管如此,這是一個偉大的思想實驗,並深入探討了Stencil的優點以及Web組件對於與框架無關的UI組件的意義。
要開始,請使用Vue CLI創建一個新的Vue項目:
# 安裝 Vue CLI $ npm install vue-cli # 創建一個新的 Vue 項目 $ vue init webpack-simple vue-ionic # 進入剛創建的目錄 $ cd vue-ionic # 添加 vue-router 和 axios $ npm install vue-router axios # 運行 開發服務器 $ npm run dev
REST API
我們可以使用json-sever創建一個本地REST API,它允許我們輕松地從服務器獲取(GET)或發布(POST)todos 到服務器 。如果尚未安裝,請在計算機上全局安裝:
$ npm install json-server -g
服務器可以啟動並帶一個JSON序列化數據庫。在項目根目錄中創建一個名為db.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
要在項目中添加Ionic的alpha版本,請將以下腳本添加到index.html文件中:
<script src="https://unpkg.com/@ionic/core@0.0.2-30/dist/ionic.js"></script>
您可以在這里找到當前版本的Ionic core: https://www.npmjs.com/package/@Ionic/core
同時,確保您有適當的響應元標記:
<meta name="viewport" content="width=device-width, initial-scale=1.0">
路由
然后,我們可以設置兩條允許查看todo項或添加todo項的路由:
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實例:
import Vue from 'vue' import App from './App.vue' import router from './router' new Vue({ el: '#app', router, render: h => h(App) })
Ionic Web Component
由於Ionic4.x是使用Web Component構建的,我們需要告訴Vue, Ionic組件不是Vue組件。在main.js中,添加以下忽略所有Ionic元素的配置對象:
Vue.config.ignoredElements = [/^ion-/]
在App.vue內部,我們現在可以添加<router view>並將其包含在<ion App>組件中。這是用來包含我們所有的Ionic 組件:
<template> <ion-app> <router-view></router-view> </ion-app> </template>
Todo List
要創建我們在router.js中注冊的todo列表頁,請在src/components文件夾中創建一個名為todo list.vue的文件。
在我們創建的鈎子中,我們從API捕獲todo並將它們分配給todos數組。
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"> </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進行迭代。
給我們的fab按鈕加樣式並添加一些內邊距。我們將在兩個組件中同時使用這兩個類,因此我們添加一個style.css文件和適當的類:
.todo-fab { position: fixed; bottom: 25px; right: 15px; font-size: 30px; } .content { padding: 10px 10px 10px 0px }
This gives us the following這給了我們以下結果 :
當用戶單擊FAB按鈕時,它們將導航到Add Todo頁面。讓我們在components/AdddoItem創建它:
<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項的值,我們使用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。
這是結果 :
原文發表日期: 一月 16, 2018