使用Vue.js和Axios进行即时搜索

从Web API提取数据并添加具有计算属性的动态过滤器


Photo by Agence Olloweb on Unsplash (with added Vue.js logo)

Vue.js是一个潜力巨大的框架。它很容易学习,快速且轻巧。我以如何构建第一个Vue.js应用程序开始有关Vue.js的旅程。现在,我将继续与本文有关如何创建即时搜索输入框以过滤来自Lorem Picsum Web API的数据的文章。

您将在我的存储库中找到最终结果。


简要

  • Vue.js库:我们的Javascript框架
  • Axios库:基于Promise的HTTP客户端,我们将使用它来调用Lorem Picsum Web API
  • Public Lorem Picsum API网址https://picsum.photos/v2/list?page=2&limit=10
  • 组成我们的应用程序的index.html文件:file app.jsstyle.css

第一步

首先,让我们检查一下Lorem Picsum Web API的输出是:

[
    {
        "id": "10",
        "author": "Paul Jarvis",
        "width": 2500,
        "height": 1667,
        "url": "https://unsplash.com/photos/6J--NXulQCs",
        "download_url": "https://picsum.photos/id/10/2500/1667"
    },
    {
        "id": "100",
        "author": "Tina Rataj",
        "width": 2500,
        "height": 1656,
        "url": "https://unsplash.com/photos/pwaaqfoMibI",
        "download_url": "https://picsum.photos/id/100/2500/1656"
    }
]

Web API返回一个JSON数组,该数组代表具有URL,作者和ID的图像列表。这些属性将定义我们的应用程序模型。

然后,开发简单的应用程序框架,包括标题,输入文本框,图像列表和作者名称。首先,它看起来像这样:

该网页的正文非常简单:

<header>
  <h1>Photo finder</h1>
</header>

<div id="app-instasearch">

  <div class="input-container">
    <input type="text" placeholder="Type a name" />
  </div>

  <ul>

    <li class="photo">
      <img src="" />
      <span class="author">Some names</span>
    </li>

  </ul>

</div>

<script src="app.js"></script>

通过CSS的非常简单的工作,图像列表的样式为:

.photo {
    list-style: none;
    display: grid;
    grid-template-columns: 200px auto;
    margin-top: 20px;
    align-items: center;
    background-color: #e9edf0;
    padding: 30px 50px;
    border-radius: 5px;
    border: 1px solid #e3e3e3;
}

.author {
    font-size: 25px;
    margin-left: 20px;
    color: #75818e;
}

.photo img {
    border-radius: 5px;
    width: 200px;
}

以及输入框的样式:

.input-container {
    border-radius: 5px;
    background: #677482;
    padding: 10px;
}

.input-container input {
    border: none;
    background: transparent;
    color: white;
    padding: 6px 15px;
    font-size: 18px;
}

::placeholder { /* Chrome, Firefox, Opera, Safari 10.1+ */
  color: #a6b0ba;
  opacity: 1; /* Firefox */
}

Vue.js集成

现在是时候为我们的小应用程序增加动态性了:

  • 导入Vue.js: <script src=”[https://unpkg.com/vue/dist/vue.js](https://unpkg.com/vue/dist/vue.js)"> </script>
  • 导入Axios: <script src=”[https://unpkg.com/axios/dist/axios.min.js](https://unpkg.com/axios/dist/axios.min.js)"></script>

定义一个新的Vue应用程序:

var instasearchApp = new Vue({
    
    el: '#app-instasearch',
    
    data: { 
        authorNameSearchString: "",
        photoFeed: null
    }
  
 }

如您所见,我们将应用程序绑定到element #app-instasearch,并定义了两个属性:

  • authorNameSearchString:它将包含绑定到我们输入框的搜索字符串
  • photoFeed:下载后将包含图像数组

在前面阅读的JSON中,我们了解了代表模型的属性。因此,下一步是将所有Vue绑定添加到我们的HTML文件中。

输入框绑定到我们的authorNameSearchString

<div class="input-container">
  <input type="text" placeholder="Type a name" v-model="authorNameSearchString" />
</div>

主列表绑定:


<li class="photo" v-for="photo in filteredPhotoFeed" v-bind:key="photo.id">
  <img v-bind:src="photo.download_url" />
  <span class="author">{{ photo.author }}</span>
</li>
  • v-for=”photo in filteredPhotoFeed”:使Vue能够为数组中的li每个元素重复一个filteredPhotoFeed
  • v-bind:key=”photo.id”:重要的是选择一个键来唯一地表示图像,以便能够对列表进行动画处理
  • v-bind:src=”photo.download_url”:没有这个,我们将看不到图像
  • {{ photo.author }}:在每张照片附近打印作者姓名

Mounted功能

在Vue.js中,您可以添加已安装的函数,这些函数只是在Vue实例加载并绑定到接口之后将被调用的钩子。在这种情况下,我们需要从Web API获取数据,这是正确的位置。

mounted() {
  axios
    .get('https://picsum.photos/v2/list?page=2&limit=10')
    .then(response => {
      this.photoFeed = response.data;
    })
    .catch(error => console.log(error))
}

在此示例中,我们Axios用于进行HTTP调用并管理其回调。特别是,我们将对JSON应用程序photoFeed数组使用响应数据,并将最终错误写入输出控制台。


Computed属性

Computed属性是缓存的Vue应用程序属性,它们仅在响应依赖项更改时重新计算。请注意,如果某个依赖项超出了实例的范围(即非反应性),则不会更新计算出的属性

在这种情况下,我们将使用它们来应用即时搜索过滤器

computed: {

  filteredPhotoFeed: function () {

    var photos = this.photoFeed;
    var authorNameSearchString = this.authorNameSearchString;

    if(!authorNameSearchString){
      return photos;
    }

    searchString = authorNameSearchString.trim().toLowerCase();

    photos = photos.filter(function(item){
      if(item.author.toLowerCase().indexOf(authorNameSearchString) !== -1){
        return item;
      }
    })

    return photos;
  }
}

首先,我们通过不考虑空字符串或空字符串来检查是否没有输入。然后,我们需要返回由搜索字符串过滤的照片数组。为此,我们使用filter方法和indexOf函数作为谓词,仅选择搜索字符串中包含作者的照片。

每次输入字符串更改时,都会重新计算此属性并更新接口。

这是最终结果的一个小样,并在列表中添加了一些动画,使其更加精美。您可以在此处找到整个代码

翻译自:https://medium.com/better-programming/instant-search-with-vue-js-and-axios-5b78a3a59f01

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

推荐阅读更多精彩内容

  • 基于Vue的一些资料 内容 UI组件 开发框架 实用库 服务端 辅助工具 应用实例 Demo示例 element★...
    尝了又尝阅读 1,142评论 0 1
  • UI组件 element- 饿了么出品的Vue2的web UI工具套件 Vux- 基于Vue和WeUI的组件库 m...
    柴东啊阅读 15,850评论 2 140
  • UI组件 element- 饿了么出品的Vue2的web UI工具套件 Vux- 基于Vue和WeUI的组件库 m...
    王喂马_阅读 6,452评论 1 77
  • UI组件 element- 饿了么出品的Vue2的web UI工具套件 Vux- 基于Vue和WeUI的组件库 m...
    你猜_3214阅读 11,043评论 0 118
  • UI组件 element- 饿了么出品的Vue2的web UI工具套件 Vux- 基于Vue和WeUI的组件库 m...
    小姜先森o0O阅读 9,421评论 0 72