如何使用 Vue.js 和 Axios 显示 API 中的数据

内容

Vue.js 是用于构建用户界面的前端 JavaScript 框架。 它从一开始就设计为可逐步采用,能和其他图书馆或现有项目很好地结合。 这使得它非常适合小型项目以及与其他工具和库一起使用时复杂的单页面应用程序。

API 应用程序接口是允许两个应用程序相互通信的软件中介。 API 经常公开其他开发人员在自己的应用程序中使用的数据,而不必担心数据库或编程语言的差异。 开发人员往往从返回 JSON 格式数据的 API 中获取数据,他们把这些数据集成到前端应用程序中。,Vue.js 非常适合使用这些 API 。

在本教程中,您将创建一个 Vue 应用程序,该应用程序使用 CryptoCompare API 显示两种主要加密货币的当前价格:比特币和 Etherium。 除了 Vue 之外,您还将使用 Axios 库来发出 API 请求并处理获得的结果。

Axios 非常适合,因为它可以自动将 JSON 数据转换为 JavaScript 对象,并且它支持 Promises,从而使代码更易于阅读和调试。 为了让事情看起来不错,我们将使用基础 CSS 框架。

注意:CryptoCompare API 仅可用于非商业用途。 如果您希望在商业项目中使用它,请查看其许可条款。

先决条件

在开始本教程之前,您需要以下内容:

  • 支持 JavaScript 语法突出显示的文本编辑器,例如 Atom,Visual Studio Code 或 Sublime Text 。这些编辑器可以在Windows、macOS 和 Linux 上使用。
  • 熟悉一起使用 HTML 和 JavaScript 。 详细知道如何将 JavaScript 添加到 HTML 。
  • 熟悉 JSON 数据格式,您可以在 JavaScript 中了解如何使用 JSON 。
  • 熟悉向 API 发出请求。 有关 API 的详细教程,请参阅 如何在 Python3 中使用 Web API 。 虽然它是为 Python 编写的,但它仍然可以帮助您理解使用 API 的核心概念。

第1步 – 创建基本 Vue 应用程序

让我们创建一个基本的 Vue 应用程序。 我们将构建一个包含一些模拟数据的 HTML 页面,我们最终将使用 API 中的实时数据替换这些数据。 我们将使用 Vue.js 来显示这个模拟数据。

对于第一步,我们将所有代码保存在一个文件中。使用文本编辑器创建一个名为 index.html 的新文件。在此文件中,添加以下 HTML 标记,该标记定义 HTML 框架,并从内容交付网络(CDN)中提取 Foundation CSS 框架和 Vue.js 库。 通过使用 CDN,您不需要下载额外的代码即可开始构建应用程序。

<!DOCTYPE html>
<html lang="en">
<head>
<link rel="stylesheet" 
     href="https://cdnjs.cloudflare.com/ajax/libs/foundation/6.3.1/css/foundation.min.css">
  <meta charset="utf-8">
  <title>Cryptocurrency Pricing Application</title>
</head>
  <body>
    <div class="container" id="app">
      <h3 class="text-center">Cryptocurrency Pricing</h3>
      <div class="columns medium-4" >
        <div class="card">
          <div class="card-section">
            <p> BTC in USD  </p>
          </div>
          <div class="card-divider">
            <p>{{ BTCinUSD }}</p>
          </div>
        </div>
      </div>
    </div>
    <script src="https://unpkg.com/vue"></script>
  </body>
</html>

行 {{BTCinUSD}} 是 Vue.js 将提供的数据的占位符, 这就是 Vue 如何让我们在 UI 中以声明方式呈现数据的方式。 让我们定义那些数据。
在包含 Vue 的 < script > 标记的正下方,添加此代码,创建一个新的 Vue 应用程序并定义我们将在页面上显示的数据结构:

<script>
      const vm = new Vue({
              el: '#app',
              //Mock data for the value of BTC in USD
              data: { BTCinUSD: 3759.91}
            });
    </script>

此代码创建一个新的 Vue 应用程序实例,并将实例附加到 id 为 app 的元素,Vue 将此过程称为安装应用程序。

我们定义一个新的 Vue 实例并通过传递配置对象来配置它。 该对象包含一个 el 选项,它指定我们要在其上安装此应用程序的元素的 id,以及一个包含我们想要的视图数据的数据选项。

在此示例中,我们的数据模型包含一个键值对,其中包含比特币价格的模拟值:{BTCinUSD:3759.91}。 这些数据将显示在我们的 HTML 页面或我们的视图中,在这里我们将密钥括在双花括号中,如下所示:

<div class="card-divider">
  <p>{{ BTCinUSD }}</p>
</div>

我们最终将使用 API 中的实时数据替换此硬编码值。
在浏览器中打开此文件。 您将在屏幕上看到以下输出,其中显示模拟数据:


image.png

我们用美元显示价格。 如果要以欧元等其他货币显示,我们需要在数据模型中添加另一个键值对,并在标记中添加另一列。
首先,更改数据模型:

<script>
  const vm = new Vue({
          el: '#app',
          //Mock data for the value of BTC in USD
          data: { BTCinUSD: 3759.91, BTCinEURO:3166.21 }
        });
  </script>

然后在标记中添加一个新部分,在现有代码下方以欧元显示价格

<div class="container" id="app">
    <h3 class="text-center">Cryptocurrency Pricing</h3>
    <div class="columns medium-4" >
      <div class="card">
        <div class="card-section">
          <p> BTC in USD  </p>
        </div>
        <div class="card-divider">
          {{BTCinUSD}}
        </div>
      </div>
    </div>
 
    <div class="columns medium-4" >
      <div class="card">
        <div class="card-section">
          <p> BTC in EURO  </p>
        </div>
        <div class="card-divider">
          {{BTCinEURO}}
        </div>
      </div>
    </div>
 
  </div>

保存文件并在浏览器中重新加载。 该应用程序现在以欧元和美元显示比特币的价格。


image.png

我们在一个文件中完成了所有工作。 让我们分解一下来提高可维护性。

第2步 – 清晰度分离 JavaScript 和 HTML

为了了解工作原理,我们将所有代码放在一个文件中。 现在让我们将应用程序代码分成两个单独的文件,index.html 和 VueApp.js。 index.html 文件将处理标记部分,JavaScript文件将包含应用程序逻辑。 这将使我们的应用程序更易于维护。 我们将两个文件保存在同一目录中。

首先,修改 index.html 文件并删除 JavaScript 代码,将其替换为 VueApp.js 文件的链接。

找到文件的这一部分:

<script src="https://unpkg.com/vue"></script>
    <script  language="JavaScript">
    const vm = new Vue({
            el: '#app',
            // Mock data for the value of BTC in USD
            data: { BTCinUSD: 3759.91, BTCinEURO:3166.21 }
          });
    </script>

并修改它,使它看起来像这样:

<script src="https://unpkg.com/vue"></script>
    <script src="vueApp.js"></script>

然后在与 index.html 文件相同的目录中创建 VueApp.js 文件。

在这个新文件中,放置最初在 index.html 文件中的相同 JavaScript 代码,不带 < script > 标记:

const vm = new Vue({
        el: '#app',
        // Mock data for the value of BTC in USD
        data: { BTCinUSD: 3759.91, BTCinEURO: 3166.21 }
      })

保存文件并在浏览器中重新加载 index.html。 您将看到之前看到的相同结果。

我们想要支持比 Bitcoiin 更多的加密货币,所以让我们来看看我们是如何做到这一点的。

第3步 – 使用 Vue 迭代数据

我们目前正在展示一些比特币价格的模拟数据。 但是我们也要添加 Etherium。 为此,我们将重组数据并修改视图以使用新数据。
打开 VueApp.js 文件并修改数据模型,使其如下所示:

const vm = new Vue({
        el: '#app',
        data: {
          results: {"BTC": {"USD":3759.91,"EUR":3166.21},
                    "ETH": {"USD":281.7,"EUR":236.25}}
        }
      });

使用嵌套数据结构,我们的数据模型变得更加复杂。 我们现在有一个名为 results 的键,其中包含两个记录: 一个用于比特币价格,另一个用于 Etherium 价格。 这个新结构将让我们减少一些重复的视图。 它也类似于我们从 CryptoCompare API 获得的数据。

保存文件。 现在修改我们的标记,以更加编程的方式处理数据。

打开 index.html 文件,找到我们显示比特币价格的文件的这一部分:

<div class="columns medium-4" >
      <div class="card">
        <div class="card-section">
          <p> BTC in USD  </p>
        </div>
        <div class="card-divider">
          {{BTCinUSD}}
        </div>
      </div>
    </div>
 
    <div class="columns medium-4" >
      <div class="card">
        <div class="card-section">
          <p> BTC in EURO  </p>
        </div>
        <div class="card-divider">
          {{BTCinEURO}}
        </div>
      </div>
    </div>

将其替换为以下代码,该代码迭代您定义的数据集。

<div class="columns medium-4" v-for="(result, index) in results">
    <div class="card">
      <div class="card-section">
        <p> {{ index }} </p>
      </div>
      <div class="card-divider">
        <p>$ {{ result.USD }}</p>
      </div>
      <div class="card-section">
        <p> € {{ result.EUR }}</p>
      </div>
    </div>
  </div>

此代码使用 v-fo r指令,其作用类似于 for 循环。 它迭代我们数据模型中的所有键值对,并显示每个键值对的数据。

当您在浏览器中重新加载它时,您将看到模拟的价格:


image.png

此修改允许我们在 VueApp.js 中为结果数据添加新货币,并使其显示在页面上而无需进一步更改。

将另一个模拟条目添加到数据集以尝试此操作:

const vm = new Vue({
        el: '#app',
        data: {
          results: {"BTC":{"USD":3759.91,"EUR":3166.21},
                    "ETH":{"USD":281.7,"EUR":236.25},
                    "NEW Currency":{"USD":5.60,"EUR":4.70}}
        }
      });

在 Etherium 输入后不要忘记添加尾随逗号。
如果现在在 Web 浏览器中加载页面,您将看到显示的新条目:


image.png

一旦我们以编程方式处理数据,我们就不需要手动在标记中添加新列。
现在让我们获取真实数据。

第4步 – 从 API 获取数据

现在是时候用来自 CryptoCompare API 的实时数据替换我们的模拟数据,以美元和欧元显示网页上比特币和以太坊的价格。

要获取我们页面的数据,我们将向以下 URL 发出请求,该 URL 以美元和欧元请求比特币和 Etherium:

https://min-api.cryptocompare.com/data/pricemulti?fsyms=BTC,ETH&tsyms=USD,EUR

此 API 将返回 JSON 响应。 使用 curl 向 API 发出请求以查看响应:

$ curl 'https://min-api.cryptocompare.com/data/pricemulti?fsyms=BTC,ETH&tsyms=USD,EUR'

你会看到这样的输出:

Output {"BTC":{"USD":11388.18,"EUR":9469.64},"ETH":{"USD":1037.02,"EUR":865.99}}

此结果与您在上一步中使用的硬编码数据模型完全相同。 我们现在要做的就是通过从我们的应用程序发出对此 URL 的请求来切换数据。

为了发出请求,我们将使用 Vue 中的 mounted() 函数和 Axios 库的 GET 函数来获取数据并将其存储在数据模型的结果数组中。 一旦将 Vue 应用程序安装到元素上,就会调用挂载的函数。 安装 Vue 应用程序后,我们将向 API 发出请求并保存结果,通知网页更改,并且值将显示在页面上。

首先,打开 index.html 并通过在包含 Vue 的行下面添加一个脚本来加载 Axios 库:

<script src="https://unpkg.com/vue"></script>
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>

保存文件,然后打开 VueApp.js 并对其进行修改,以便向 API 发出请求并使用结果填充数据模型。

const url =
      "https://min-api.cryptocompare.com/data/pricemulti?fsyms=BTC,ETH&tsyms=USD,EUR";

const vm = new Vue({
        el: '#app',
        data: {
          results: []
        },
        mounted() {
          axios.get(url).then(response => {
            this.results = response.data
          })
        }
      });

请注意,我们已删除结果的默认值,并将其替换为空数组。 我们的应用程序首次加载时,我们不会有数据,但我们不希望事情中断。 我们的 HTML 视图期望一些数据在加载时迭代。

axios.get 函数使用 Promise, 当 API 成功返回数据时,将执行 then 块中的代码,并将数据保存到结果变量中。

保存文件并在 Web 浏览器中重新加载 index.html 页面。 这次你会看到加密货币的当前价格。

如果不这样做,请查看教程 如何使用 JavaScript Developer Console 并使用 JavaScript 控制台调试代码。

结论

在不到50行代码中,您仅使用三个工具创建了一个消耗 API的 应用程序:Vue.js,Axios 和 CryptoCompare API。 您学习了如何在页面上显示数据,迭代结果,以及使用 API 的结果替换静态数据。

既然您已了解基础知识,那么您可以为应用程序添加其他功能。 修改此应用程序以显示其他货币,或使用您在本教程中学习的技术使用其他 API 创建其他 Web 应用程序。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容