1. 程式人生 > >使用Vue構建Ionic混合APP系列教程(二):導航

使用Vue構建Ionic混合APP系列教程(二):導航

這篇教程我們將從Vue裡最基礎的路由/導航開始講起,然後再看看通過Vue構建的Ionic應用如何導航。

在Vue裡引入Ionic的元件(或者任何其他東西)是非常簡單的,就像你在Angular中做的一樣,只需要把他們注入模板裡,不過當我們想在兩個頁面之間導航時稍微變複雜了一點。在Angular裡,我們只是用ionic-angular庫提供的NavController服務,但是在Vue裡我們將依賴於Vue自己的路由。

備註:Ionic4(允許我們脫離Angular使用Ionic)還處於早期版本——記住我們做的這些都是帶有實驗性質的。

Vue導航

就像我在上一篇文章裡說的,Vue比Angular更加輕量化,組織性沒有那麼嚴密。Angular提供了所有開箱即用的東西,但是在Vue裡你需要自己填補空白。

導航就是你需要填補的空白的一部分,儘管你可以在Vue裡使用任何路由,Vue還是提供了一個預設的路由,你可以在專案建立的時候設定它。

這裡寫圖片描述

如果你選擇使用Vue router,它會自動設定好專案的路由機制。如果開啟src/App.vue你會發現router-view標籤:

<template>
  <div id="app">
    <img src="./assets/logo.png">
    <router-view/>
  </div>
</template

這和Ionic的ion-nav元件很相似,作為不同頁面之間導航的container,需要顯示的檢視就會顯示在router-view

標籤的位置。

在你的專案裡有一個router資料夾,看看router/index.js檔案:

import Vue from 'vue'
import Router from 'vue-router'
import HelloWorld from '@/components/HelloWorld'

Vue.use(Router)

export default new Router({
  routes: [
    {
      path: '/',
      component: HelloWorld
    }
  ]
})

這裡定義了這個應用所有的路由。如果你過去一直使用Ionic(不怎麼熟悉Angular)那你可能對這種抽象路由的定義不是很熟,不過這種概念其實很簡單。我們需要提供一個path

值作為這個頁面的地址URL,還要提供一個元件作為這個頁面用到的元件。我們可以像這樣新增很多的路由物件到routes數組裡。

如果你想導航到一個頁面,只需要在router-link標籤裡這樣使用:

<router-link to="/detail">Go to the Detail Page</router-link>

或者如果你想使用一個方法來導航到另一個頁面:

methods: {
  goToDetail () {
    this.$router.push('detail')
  }
}

然後在你的模板這樣使用這個方法:

<button @click="goToDetail">Go to the Detail Page</button>

現在我們看一眼src/main.js檔案,你會發現router也被設定好了:

import Vue from 'vue'
import App from './App'
import router from './router'

Vue.config.productionTip = false

/* eslint-disable no-new */
new Vue({
  el: '#app',
  router,
  template: '<App/>',
  components: { App }
})

這是當我們使用CLI時自動設定好的,你沒什麼需要擔心的。不過當初始化一個Vue應用時,確保這裡已經引入了它是很重要的。

Ionic/Vue應用導航

既然我們已經過了一遍基礎,現在來看看如何在使用Vue構建的Ionic應用裡面導航。為了使Ionic的web components可以在我們的Vue應用使用,我們需要在index.html引入下面這行程式碼:

<script src="https://unpkg.com/@ionic/[email protected]/dist/ionic.js"></script>

記住這裡麵包含的是一個Ionic4的早期版本,僅此一步基本可以讓我們執行Ionic,不過還有幾步:

如果你試著在手機裝置上看這個應用,它的尺寸不太對。為了使應用在手機上正確的顯示,我們需要使用meta標籤。我們可以在一個普通的Ionic/Angular應用裡複製過來:

新增下面的meta標籤到index.html

<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
<meta name="format-detection" content="telephone=no">
<meta name="msapplication-tap-highlight" content="no">

因為我們在使用web components,我們其實是在試圖新增一些普通html不存在的標籤到我們的Vue應用,而且也沒有被定義為Vue元件。如果我們試著在Vue裡使用Ionic元件,執行之後會看到這個錯誤:

[Vue warn]: Unknown custom element: <ion-app>

既然Vue不認識這些自定義元素,我們需要在src/main.js裡進行如下設定:

// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue'
import App from './App'
import router from './router'

Vue.config.productionTip = false

Vue.config.ignoredElements = [
    'ion-app',
    'ion-header',
    'ion-navbar',
    'ion-title',
    'ion-content',
    'ion-button'
];

/* eslint-disable no-new */
new Vue({
  el: '#app',
  router,
  template: '<App/>',
  components: { App }
})

你需要把你想使用的Ionic元件新增到ignoredElements 陣列——你不需要引入你沒有使用的Ionic元件。

現在我們可以在Vue元件裡使用Ionic元件了,讓我們把已經存在的HelloWorld元件Ionic化吧。

修改src/components/HelloWorld.vue如下:

<template>
  <ion-app>
    <ion-header>

        <ion-navbar>
            <ion-title>Ionic</ion-title>
        </ion-navbar>

    </ion-header>

    <ion-content>

      <ion-button @click="goToDetail">Hello</ion-button>

    </ion-content>
  </ion-app>
</template>

<script>
export default {
  name: 'HelloWorld',
  data () {
    return {
      msg: 'Welcome to Your Vue.js App'
    }
  },
  methods: {
    goToDetail () {
      this.$router.push('detail')
    }
  }
}
</script>

<style scoped></style>

現在我們只是使用Ionic元件建立普通的模板。我們使用 @click來觸發goToDetail方法。這會進入detail頁面,不過我們還沒建立這個頁面。你可以看到,這並不是一點也不像Ionic/Angular。我們只是使用@click代替(click),使用 $router代替NavController的push方法。雖然看起來有一點不同,但是基本的概念都是相同的。

在Vue裡建立一個新的Ionic頁面

我們試著push到detail頁面,不過我們還沒建立這個頁面,而且還沒為它設定路由。我們現在來做這個:

建立src/components/Detail.vue檔案:

<template>
  <ion-app>
    <ion-header>

        <ion-navbar>
            <ion-title>Ionic</ion-title>
        </ion-navbar>

    </ion-header>

    <ion-content padding>

        <p><router-link to="/">Go home</router-link></p>

    </ion-content>
  </ion-app>
</template>

<script>
export default {
  name: 'Detail',
  data () {
    return {
      msg: 'Welcome to Your Vue.js App'
    }
  }
}
</script>

<style scoped></style>

這個元件和HelloWorld元件非常相似,只是更簡單了。這次我們使用router-link標籤來導航返回home頁面。在Ionic應用裡一般不會像這樣使用一個文字連結進行導航,不過我只是展示一下這種方式的用法:

元件定義好了,我們來為它建立路由:

如下修改router/index.js的內容:

import Vue from 'vue'
import Router from 'vue-router'
import HelloWorld from '@/components/HelloWorld'
import Detail from '@/components/Detail'

Vue.use(Router)

export default new Router({
  routes: [
    {
      path: '/',
      component: HelloWorld
    },
    {
      path: '/detail',
      component: Detail
    }
  ]
})

我們引入剛剛建立的Detail元件然後設定它的路由。現在我們可以在Vue的兩個Ionic頁面之間自由切換了。

頁面過渡動畫

我們現在可以在兩個Ionic頁面之間切換,不過執行程式碼你會注意到頁面之間的過渡太過突兀。這可能有點不友好, 因為在兩個頁面之間轉換時通常會出現各種型別的頁面轉換動畫。

Angular裡使用NavController自動幫我們處理好了這件事,不過現在我們不能用那個,怎麼辦呢?

幸運的是,Vue對像這樣的過渡動畫有著非常好的支援。為了設定一個全域性的過渡動畫,我們使用Vue文件裡的一個例子。

如下修改src/App.vue

<template>
  <div id="app">
    <transition name="slide-fade">
      <router-view/>
    </transition>
  </div>
</template>

<script>
export default {
  name: 'app'
}
</script>

<style>
#app {
  font-family: 'Avenir', Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}

/* Enter and leave animations can use different */
/* durations and timing functions.              */
.slide-fade-enter-active {
  transition: all .3s ease;
}
.slide-fade-leave-active {
  transition: all .8s cubic-bezier(1.0, 0.5, 0.8, 1.0);
}
.slide-fade-enter, .slide-fade-leave-to
/* .slide-fade-leave-active below version 2.1.8 */ {
  transform: translateX(10px);
  opacity: 0;
}
</style>

我們將router-view放在了transition(當它們離開或者進入時可以產生動畫效果的元件)標籤裡面。在這個元件的style標籤裡,我們給它設定了一個叫slide-fade的動畫。這樣修改之後,你在切換兩個頁面會注意到現在有了動畫過渡效果。

雖然這沒有Angular的Ionic服務的預設效果好,不過只要你喜歡你可以設定更復雜的動畫——只是一個關於定義合適動畫效果的問題。如果你願意,你也可以給特定的標籤設定特定的動畫,而不是使用一個全域性的動畫。更多的你可以看看這個

總結

Ionic/Angular和Ionic/Vue導航最主要的不同點就是在Vue裡我們需要定義路由,因為不依賴於NavController我們需要自己處理頁面過渡動畫。除了一些細微的差別, 基本概念與Ionic/Angular上的導航差不多。

相關推薦

使用Vue構建Ionic混合APP系列教程導航

這篇教程我們將從Vue裡最基礎的路由/導航開始講起,然後再看看通過Vue構建的Ionic應用如何導航。 在Vue裡引入Ionic的元件(或者任何其他東西)是非常簡單的,就像你在Angular中做的一樣,只需要把他們注入模板裡,不過當我們想在兩個頁面之間導航時稍

使用Vue構建Ionic混合APP系列教程資料儲存

大多數應用程式基本都需要儲存一些在應用重新載入時需要的資料。我們經常使用使用者裝置上的本地儲存來實現。當使用Ionic/Angular的時候,我們可以簡單的使用Ionic內建的Storage API,並不需要知道背後的原理——Ionic會自動地選擇最合適的儲存方

使用Vue構建Ionic混合APP系列教程服務和Http請求

當學習一個新框架的時候,特別是你之前已經使用一個框架很久了,很自然的你會試圖用之前使用的框架來理解一些別的框架的原理。 正如我上一篇文章提到的,Angular是一個結構嚴密的框架,提供了一切開箱即用的東西,不管如何都會有一個正確的方法去解決問題。Vue的結構並

API 系列教程結合 Laravel 5.5 和 Vue SPA 基於 jwt-auth 實現 API 認證

上一篇我們簡單演示了 Laravel 5.5 中 RESTful API 的構建、認證和測試,本教程將在上一篇教程的基礎上進行昇華。 我們將結合 Laravel 和 Vue 單頁面應用(SPA),在它們的基礎上引入 jwt-auth 實現 API 認證,由於 Laravel 集成了對 Vue

webpack4系列教程建立專案,打包第一個JS檔案

傳送門: webpack4系列教程(一):初識webpack   1. 建立專案 1.1 初始化一個專案 首先安裝nodejs,開啟 nodeJs官網 直接下載安裝即可,安裝完畢後開啟命令列工具,進入你的專案資料夾,執行 npm init 進

Hadoop 系列教程批量操作多臺伺服器

1. 每個虛擬機器設定靜態IP cd /etc/sysconfig/network-scripts/ ifconfig/ip add 檢視網絡卡的硬體名稱和基本資訊 記下這個UUID 網絡卡配置例子 TYPE="Ethernet" BOOTPROTO="static"

從零開始寫自己的PHP框架系列教程[App.php]

porting col config exce tro efault fig 默認 clas 從這一個文件開始以後加載的均以類加載,請註意命名空間和所在文件的路徑 APP.php的這個類所在路徑:根目錄\framework\App.php 直接上代碼 namespace

API 系列教程基於 Laravel 5.5 構建 和 測試 RESTful API

隨著移動開發和 JavaScript 框架的日益流行,使用 RESTful API 在資料層和客戶端之間構建互動介面逐漸成為最佳選擇。 在本系列教程中,將會帶領大家基於 Laravel 5.5 來構建並測試帶認證功能的 RESTful API。 RESTful API 先要了解什麼是

Python入門系列教程

字符 小寫 無符號 bsp div width raw_input abc body 字符串 1.字符串輸出 name = ‘xiaoming‘ print("姓名:%s"%name) 2.字符串輸入 userName = raw_input(‘請輸

JXLS 2.4.0系列教程——循環導出一個鏈表的數據

教程 super 最簡 com arraylist port 至少 ron mod 請務必先看上一篇文章,本文在上一篇文章的代碼基礎上修改而成。 JXLS 2.4.0系列教程(一)——最簡單的模板導出 上一篇文章我們介紹了JXLS和模板導出最簡單的應用,現在我們要更進一

回顧2017系列移動端APP設計趨勢

原型設計 交互設計 界面設計 設計師 移動端APP在2017年經歷了諸多的變化, 人工智能、聊天式的界面、響應式設計、虛擬現實(VR)和增強現實(AR)讓設計師不斷面臨新的挑戰。研究表明,用戶每天耗費在手機和平板上的平均時長為158分鐘,其中127分鐘是耗費在各類APP中,可以看出移動端

web全棧學習教程系列教程介紹

系列教程 trap soft 切圖 think html4 style pes html 一、發布周期 計劃2-3天發一篇,半年左右完成。 二、教程大綱 web全棧介紹與優勢分析 本系列教程介紹 切圖與圖片介紹 html4.01 html5 css2.0 css3 頁面布

微信程序開發系列教程使用JavaScript給微信用戶發送消息

邏輯 XML web UNC 百度 ava subscribe 程序開發 內容 我之前的文章 微信程序開發系列教程(一)開發環境搭建 介紹了微信開發環境的搭建,這篇文章我們就來一步步開發一些具體的功能。 功能需求:當有微信用戶關註了您的公眾號之後,您用JavaScript發

VSphere系列教程ESXI 主機設定開機自動啟動虛擬機器

一、配置 ESXI 主機        登入 WebClient,管理 -> 自動啟動 -> 編輯設定                配置成如下內容,儲

Java NIO系列教程 Channel

Java NIO的通道類似流,但又有些不同: 既可以從通道中讀取資料,又可以寫資料到通道。但流的讀寫通常是單向的。 通道可以非同步地讀寫。 通道中的資料總是要先讀到一個Buffer,或者總是要從一個Buffer中寫入。 正如上面所說,從通道讀取資

Vue.js教程v-bind動態屬性

上一節我們學習了Vue的基本語法,裡面有個佔位變數{{message}}。這種{{message}}形式的vue變數只適合給標籤中的文字複製(開始標籤和結束標籤中間的文字)。v-bind是給屬性設定變數的。 簡介 v-bind是給屬性設定變數的。屬性和文字的

OAuth 2.0系列教程 綜述

作者:Jakob Jenkov   譯者:林浩    校對:郭蕾 如引言所說的,OAuth 2.0是一個能夠使應用彼此訪問資料的開放授權協議,這裡我們將闡述該協議是怎麼工作的以及規範中提到的概念。該圖說明了整個授權過程: OAuth 2.0怎樣被用來在應用間共享資料的例子 第一步,使用者訪

RabbitMQ訊息佇列系列教程Windows下安裝和部署RabbitMQ

摘要 本篇經驗將和大家介紹Windows下安裝和部署RabbitMQ訊息佇列伺服器,希望對大家的工作和學習有所幫助! 目錄 一、Erlang語言環境的搭建 RabbitMQ開源訊息佇列服務是使用Erlang語言開發的,因此我們要使用他就必須先進行Erlang語言環境的搭建,其實是非常簡

API 系列教程使用 API Resource 來建立自定義 JSON 格式的 API

上一篇教程中我們通過 jwt-auth 實現了 Laravel 的 API 認證。 使用者請求登入介面 http://apidemo.test/api/auth/login 登入成功後,獲取到 JSON 響應,響應頭會帶有 token 資訊。 Authorizatio

solr 6.2.0系列教程IK中文分詞器配置及新增擴充套件詞、停止詞、同義詞

前言 2、solr的不同版本,對應不同版本的IK分詞器。由於IK 2012年停止更新了。所以以前的版本不適合新版的solr。 有幸在網上扒到了IK原始碼自己稍微做了調整,用來相容solr6.2.0版本。IK原始碼下載地址 步驟 1、解壓下載的src.rar壓縮包,這是我建