1. 程式人生 > >使用Vue構建Ionic混合APP系列教程(三):服務和Http請求

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

當學習一個新框架的時候,特別是你之前已經使用一個框架很久了,很自然的你會試圖用之前使用的框架來理解一些別的框架的原理。

正如我上一篇文章提到的,Angular是一個結構嚴密的框架,提供了一切開箱即用的東西,不管如何都會有一個正確的方法去解決問題。Vue的結構並不是很嚴密,也不是什麼東西都提供好了,給了你更靈活的選擇去按照你希望的方式組織專案的結構。Angular是設計用來處理你的應用所有方面的事情,Vue基本上只關心如何展示你的應用。

在這篇教程,我們會看看如何在Vue裡建立ServicesProviders,通過Http請求獲取一些資料。不過 這是一個將Angular的概念投射到Vue上面的例子, 稍後我們將在這裡詳細地討論。在這篇教程裡我們會通過Reddit API

來post請求一些資料。

開始

在前面的教程中我已經介紹了使用Vue建立一個Ionic應用的基礎知識, 所以我們將很快地通過這裡的安裝步驟。如果您不熟悉這些步驟, 我建議您在繼續之前先閱讀前面的兩個教程。

建立一個Vue應用:

vue init webpack service-http-example

執行下面的命令列:

cd service-http-example
npm install
npm run dev

通過修改 index.html 嚮應用程式新增Ionic:

<!DOCTYPE html>
<html>
  <head
>
<meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1.0"> <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"> <title>service-example</title> </head> <body> <div id="app"></div> <!-- built files will be auto injected --> <script src="https://unpkg.com/@ionic/[email protected]/dist/ionic.js"></script> </body> </html>

Angula服務 vs Vue

在Ionic/Angular裡從一些伺服器獲取資料,我們通常會建立一個服務(service/provider)來為我們做這些工作,我們會用內建的Http API 來獲取資料。然後我們會在需要使用這些資料的元件裡注入這個服務,再使用我們在服務裡建立的方法。

這裡沒有什麼其他需要考慮的東西,不過如果在Ionic/Vue要做同樣的事情,就沒有這麼肯定了。

因為我們是從Angular轉過來的,所以可能我們想在Vue裡建立一個”provider”,然後用Vue版本的“Http”來獲取資料。但是在Vue裡沒有“provider”或“service”或“injectable”這些概念,而且也沒有預設的Http請求庫。這些不是Vue框架自己關心的事情。

所以怎麼辦?你可以想怎麼做就怎麼做,不過當然了,總會有些公認的/最佳實踐的做法。我們會採用“Angular式”的方法,建立類似Angular裡的provider的東西。

在Vue裡建立服務

我們建立一個services資料夾,在裡面我們會手動的建立我們的服務——這個例子裡,我們會建立一個reddit服務。

建立資料夾src/services
在這個資料夾下面建立reddit.js

import Vue from 'vue';

export default {

    getPosts(){
        // do something
        return [];
    }

}

你可以看到,大致和Angular是相似的,不過沒有使用Angular特別的語法比如@Injectable,我們只是用了ES6語法。通過在這裡匯出方法,我們可以在任何需要使用的地方引入它們。

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

import RedditService from '../services/reddit';

export default {
  name: 'HelloWorld',
  data () {
    return {
      posts: []
    }
  },
  created() {
    this.posts = RedditService.getPosts();
  }
}

就像在Angular裡匯入一個服務,我們也在這裡匯入了我們剛剛建立的服務——和Angular不同的是沒有別的多餘的步驟了。一旦我們匯入了服務,我們就可以使用它的方法。在這裡我們在生命週期的created(一旦元件被建立就會執行)階段使用了服務的方法,它會把getPosts()結果的值賦給 this.posts

Http請求

我們有了自己的服務,不過現在它什麼也沒做。我們修改一下讓它從Reddit為我們獲取一些資料。再說一次,Vue不關心你的應用的輸入和輸出,所以它也沒有提供Vue的Http請求的方式。

我們可以使用庫來幫助我們做網路請求(如果你喜歡,你也可以只用javascript原生請求)。兩個流行的庫是 vue-resource(幾乎是預設的)和 axios。如果你想用其他的你只需要把他們新增到你的Vue專案——我們會使用vue-resource

安裝vue-resource

npm install vue-resource --save

修改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'
import VueResource from 'vue-resource'

Vue.config.productionTip = false

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

Vue.use(VueResource);

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

安裝vue-resource之後我們在 main.js 引入了它,然後我們設定應用使用它:

Vue.use(VueResource);

請注意, 我們還添加了 ignoredElements陣列以便我們使用Ionic元件不會造成任何問題。現在,我們有了一種方式來做HTTP 請求。

修改src/services/reddit.js 如下:

import Vue from 'vue';

export default {

    getPosts(){
        return Vue.http.get('https://www.reddit.com/r/gifs/top/.json?limit=20&sort=hot');
    }

}

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

import RedditService from '../services/reddit';

export default {
  name: 'HelloWorld',
  data () {
    return {
      posts: []
    }
  },
  created() {
    RedditService.getPosts().then(response => {
      this.posts = response.body.data.children;
    });
  }
}

我們的服務現在可以獲取資料了,當created生命週期被觸發,它會將請求結果賦給成員變數posts。現在我們可以修改我們的模板來展示我們獲取的資料。

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

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

        <ion-navbar>
            <ion-title>REDDIT!</ion-title>
        </ion-navbar>

    </ion-header>

    <ion-content>

      <ion-list>
        <ion-item v-for="post in posts" v-bind:key="post.data.id">
          {{post.data.title}}
        </ion-item>
      </ion-list>

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

如果你現在開啟你的瀏覽器看一下,應該是這樣的:
這裡寫圖片描述

總結

當學習Vue的時候有一點很重要,特別是從Angular背景過來的開發者,記住儘管它們很相似,但是它們仍然是使用不同的方式來實現的不同的兩個框架,你不能將你知道的Angular的東西直接用在Vue上。

相關推薦

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

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

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

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

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

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

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

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

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

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

webpack4系列教程自動生成專案中的HTML檔案

傳送門: webpack4系列教程(一):初識webpack webpack4系列教程(二):建立專案,打包第一個JS檔案   1. webpack中的CommonJS和ES Mudule 規範 1.1 CommonJs規範 CommonJs規範的出發點:JS沒

pyspider 爬蟲教程2AJAX HTTP

AJAX AJAX 是 Asynchronous JavaScript and XML(非同步的 JavaScript 和 XML)的縮寫。AJAX 通過使用原有的 web 標準組件,實現了在不重新載入整個頁面的情況下,與伺服器進行資料互動。例如在新浪微博中,你可以展開一條

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

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

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

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

vue移動音樂app開發學習輪播圖組件的開發

hub out webapp width eth reat slot utc -1 本系列文章是為了記錄學習中的知識點,便於後期自己觀看。如果有需要的同學請登錄慕課網,找到Vue 2.0 高級實戰-開發移動端音樂WebApp進行觀看,傳送門。 完成後的頁面狀態以及項目結構如

建站系列教程--如何提高網站搜尋排名?

1、搜尋引擎優化 網站建成能訪問後,還要解決的問題就是如何能使網站排名靠前,通過一定關鍵詞、關鍵字能搜尋到網站,併網站排在前面幾頁,這就需要通過SEO搜尋引擎優化技術來做,一些常用的方法有設定TDK、建站群,增加友情連結、做網站地圖等等。 常規的必須設定標題

KeilMDK-ARM系列教程_工程目標選項配置

Ⅰ、寫在前面 Options for Target目標選項其完全意思是工程目標選項配置,或許有些人分不清工作空間、工程、目標這三個名詞的意思和區別,下面章節將簡述工作空間、工程、目標他們的意思。 由於目標配置的選項比較多,我將其分為工程目標選項配置(Ⅰ)和工程目標

JDBC系列教程---語句

Statement 本概述是從《JDBCTM Database Access from JavaTM: A Tutorial and Annotated Reference 》這本書中摘引來的。JavaSoft 目前正在準備這本書。這是一本教程,同時也是 JDBC 的重要參考手冊,它將作為 Java 系列的組

Vue.js教程v-if條件判斷

v-if是繼v-bind之後的又一個v-xxx系列 前言 v-if這是我們學習Vue中的的第二個v-xxx系列。學到這裡,不得不提一下的是,所有v-bind或者v-if所關聯的都是Vue的動態變數,

Java NIO系列教程 Buffer

原文連結     作者:Jakob Jenkov     譯者:airu     校對:丁一 Java NIO中的Buffer用於和NIO通道進行互動。如你所知,資料是從通道讀入緩衝區,從緩衝區寫入到通道中的。 緩衝區本質上是一塊可以寫入資料,然後可以從中讀取資料的記憶體。這塊記憶體被包裝成N

OAuth 2.0系列教程 角色

作者:Jakob Jenkov   譯者:林浩    校對:郭蕾 OAuth 2.0為使用者和應用定義瞭如下角色: 資源擁有者 資源伺服器 客戶端應用 授權伺服器 這些角色在下圖中表示為: OAuth 2.0規範中的角色定義 資源擁有者是指擁有共享資料的人或應用。比如Facebook或

系列教程1學習如何用C#編寫一個軟渲染引擎

宣告:轉載請註明出處!!!本人摘錄其中C#的部分進行翻譯,同時捨棄了其中一些無關緊要的話。另外,英語水平渣,見諒。 由於這位大神是用的win8和XAML,而本人是win7,沒法進行實踐。所以自己用普通的WinForm寫了一個上傳到了github。 地址:https://g

webpack4系列教程處理專案中的資原始檔

傳送門: webpack4系列教程(一):初識webpack webpack4系列教程(二):建立專案,打包第一個JS檔案 webpack4系列教程(三):自動生成專案中的HTML檔案    1. Loader的使用 之前的博文已經介紹了Loader的

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

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

webpack4系列教程初識webpack

目錄   1. 什麼是webpack 2. webpack核心概念  2.1 入口(entry) 2.2 出口(output)  2.3 loader 2.4 外掛(plugins) 1. 什麼是webpack 先來看看官網對