系列参考 ,英文原文参考

我的git代码: https://github.com/chentianwei411/Typeahead


目标:

建立一个输入关键字得到相关列表的组件,用Vuejs2和Fetch API

思路:

把一个json数据,fetch到本地。然后用户模糊搜索title, 得到相关的结果列表。

[
{
"userId": 1,
"id": 1,
"title": "sunt aut facere repellat provident",
"body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum"
},
...

工具:

使用JSONPlaceholder上的json数据(一个Fake Online REST API用于测试和Prototyping Serving)

使用VueJs2建立一个简单的组件。

不会使用任何库,如Axios ,jQuery, 而使用原生的Fetch API.

使用VueCLI3来搭建手脚架项目。

步骤:

1.安装Vue (参考之前的博客

yarn global add @vue/cli
vue --version         # 查看是否安装好!
vue create type.vue      # 新建一个项目,插件选择后,cd type.vue进入。
yarn serve            # 执行这条命令,打开热重载模式的网页,具体说明参考之前的博客。

2. 创建组件Typeahead。

在Aup.vue的<template>加上:

      <Typeahead
source="https://jsonplaceholder.typicode.com/posts"
placeholder="What Tv Serie you are looking for..."
filter-key="title"
:start-at="2"
/>

设置4个prop特性:

  • source接收源数据。
  • placeholder设置输入框的默认内容
  • filter-key设置搜索的关键字属于source data中的哪部分。
  • v-bind:start-at,这个是动态的绑定,用户在input内输入字符的个数最少是多少个才能展开搜索

⚠️:v-bind:start-at="2"告诉Vue,动态赋予一个表达式。虽然2是整数,但其实它是一个表达式。

另外,也可以增加非prop特性:

一个非prop特性是给组件添加一个特性,但在组件的props定义中没有这个特性。

非prop特性会添加到这个组件的根元素上。

3. props接受父组件传入的数据。

数据来源的类型是array对象。

[
{
"userId": 1,
"id": 1,
"title": "sunt aut facere repellat provident",
"body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum"
},
...

因此,prop至少有3个:

       props: {
source: {
type: [String, Array],
required: true
},
filterKey: {
type: String,
required: true
},
startAt: {
type: Number,
default: 3
},
       placeholder: {
         type: String,
         default: "",
       }

4. 然后建立model/state, 即VueJS的data。

此时我们将有2个特性, 给data对象。

<script>
export default {
data() {
return {
items: [],
query: ''
}
}
}
</script>

items数组用来保存从source prop传入的数据。

query是一个空string。它会和input标签绑定。使用v-mode指令。这样它会被实时的更新,无需刷新网页。

5. 在定义完model后,创建一个fetchItems方法来让items数组接收来自source prop的数据。

这个方法放入methods对象中。

<script>
export default {
methods: {
fetchItems() {
if ( typeof this.source === 'string' ) {
fetch(this.source)
.then(stream => stream.json())
.then(data => this.items = data)
.catch(error => console.error(error))
} else {
this.items = this.source
}
}
}
}
</script>

这里有一个判断:

因为定义的source prop的type可能是string,也可能是array对象。

如果是string, 则使用Fetch API并把response的数据储存到items数组中。

如果用户手动传入的是array对象,则直接赋值给items.

fetch方法接收URL返回以promise对象。

第一个then把数据转化为json格式。

第二个then,则是涉及到实际的data,从服务器来的数据被分配给组件实例中的itmes数组。

还有catch方法,用于处理任何的错误。

6. 建立好fetchItems方法后,使用mounted 钩子函数,这样当组件挂载时,fetchItems被激发。

7. 现在设置Vue component的template部分。

增加一个input标签,query特性绑定v-model。

当在input中输入一个关键字时,会查找items中每个item对象中的body。并列出搜索到的item。

一个假设,输入框要求用户输入想要查询的文章的部分title,即能显示查询的相关记录。

所以之前用filterKey prop来储存item对象中的property。

8. 使用computed 特性。这是reactive响应式的。

定义一个filtered函数:

  • 1. 当字符输入大于startAt prop,则继续,否则退出filtered函数。
  • 2.对items的每个item进行验证,使用Array.protptype.filter()方法,这会生成一个新的array,内含符合filter内函数判断为true的item.
      •     computed: {
        filtered() {
        if (this.query.length > this.startAt) {
        return this.items.filter(item => {
           //
        })
        }
        }
        }
  • 3. filter()内的函数:这里有一个假设,用户搜索的是item中的某个key的值:这里用filterKey来存储这个key。因此使用item.hasOwnProperty(this.filterKey)作为if的条件。
    • 如果if false则console.error(`...${...}...`)。输出到控制台某个提示❌信息。
  • 4. 最后,我们会检查这个item的filterKey的值,看它是否和用户输入的query互相匹配。
    • 这里有2个方法:
    • 1. 使用javascript中的正则表达式构建器进行匹配。
    • 2. 或者使用indexOf()方法。string.indexOf("xxx")会返回“xxx”所处的位置,一个整数它必大于-1。所以可以使用 string.indexOf("xxx") > -1的方式进行条件判断。
  • 另外,取消大小写的判断,用toLowerCase()来转为小写字符。

9. 现在filtered函数会返回符合用户输入条件的items对象集合(数组)。

让我们把这些数据,显示在网页上,修改template模版。添加:

<ul>
<li v-for="item in filtered" v-bind:key="item.id">
//...
</li>
</ul>

为了能够使用过渡动画效果,可以用css自己写,但是有现成的工具,就无需自己再造轮子了(一个梗

使用Vue cli3搭建一个用Fetch Api的组件的更多相关文章

  1. vue + skyline 搭建 一个开发环境

    1.之前用的是ext +  skyline搭建环境 ,正好最近是做前端的事情,有时间用vue + skyline 搭建一个三维场景 2.准备vue 2.x  ,UI 用的是iview 和element ...

  2. 【gin-vue-admin】 使用go和vue 快速搭建一个项目模板

    gin-vue-admin gin+vue开源快速项目模板 项目地址:https://github.com/piexlmax/gin-vue-admin 增加了 micro-service-test分 ...

  3. 如何使用 Gin 和 Gorm 搭建一个简单的 API 服务 (一)

    介绍   Go 语言最近十分火热,但对于新手来说,想立马上手全新的语法和各种各样的框架还是有点难度的.即使是基础学习也很有挺有挑战性.   在这篇文章中,我想用最少的代码写出一个可用的 API 服务. ...

  4. Vue框架(三)——Vue项目搭建和项目目录介绍、组件、路由

    Vue项目环境搭建 1) 安装node,在官网下载好,然后在本地安装 官网下载安装包,傻瓜式安装:https://nodejs.org/zh-cn/ 2) 换源安装cnpm >: npm ins ...

  5. Vite+TS带你搭建一个属于自己的Vue3组件库

    theme: nico 前言 随着前端技术的发展,业界涌现出了许多的UI组件库.例如我们熟知的ElementUI,Vant,AntDesign等等.但是作为一个前端开发者,你知道一个UI组件库是如何被 ...

  6. vue中把一个事件绑定到子组件上

    官网上是这样描述的 你可能有很多次想要在一个组件的根元素上直接监听一个原生事件.这时,你可以使用 v-on的 .native 修饰符 父组件App.vue <template> <d ...

  7. 用Vue.js搭建一个小说阅读网站

    目录 1.简介 2.如何使用vue.js 3.部署api服务器 4.vue.js路由配置 5.实现页面加载数据 6.测试vue项目 7.在正式环境部署 8.Vue前端代码下载 1.简介 这是一个使用v ...

  8. 使用vue cli3新建一个vue项目

    写在最前 虽然身为一个java后端工作者,前端还是要沾点的,基于vue的火热,所以平常的工作中项目前端基本都是vue.这次就主要讲一讲vue项目的创建,并从vue的安装开始讲起,附带上我之前安装使用时 ...

  9. 如何使用 Gin 和 Gorm 搭建一个简单的 API 服务 (三)

    修改数据结构   基本的 API 已经定义好了,现在是个修改 Person 对象结构的好时机.只要修改 Person 结构体,数据库和 API 都会自动做出相应的修改.   我要做的是在 Person ...

随机推荐

  1. java利用poi解析excel文件

    首先需要引入以下jar包 如果使用maven,需要添加两个依赖 <dependencies> <dependency> <groupId>org.apache.po ...

  2. Python3 tkinter基础 Entry state 不可写 不可选 不可复制的输入框

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  3. hihoCoder week3 KMP算法

    题目链接 https://hihocoder.com/contest/hiho3/problems kmp算法 #include <bits/stdc++.h> using namespa ...

  4. Match function in R

    Examples:     print(match(5, c(1,2,9,5,3,6,7,4,5)))[1] 4     5 %in% c(1,2,9,5,3,6,7,4,5)[1] TRUE    ...

  5. LuoguP3674 小清新人渣的本愿 && BZOJ4810: [Ynoi2017]由乃的玉米田

    题目地址 小清新人渣的本愿 [Ynoi2017]由乃的玉米田 所以这两题也就输出不一样而已 题解 这种lxl的题还是没修改操作的题基本就是莫队 分开考虑每个询问 1.减法 \(a-b=x⇒a=b+x\ ...

  6. Torch 两个矩形框重叠面积的计算 (IoU between tow bounding box)

    Torch 两个矩形框重叠面积的计算 (IoU between tow bounding box) function DecideOberlap(BBox_x1, BBox_y1, BBox_x2, ...

  7. Thread类的常用方法

    String getName() 返回该线程的名称. void setName(String name) 改变线程名称,使之与参数 name 相同. int getPriority() 返回线程的优先 ...

  8. Centos7更改网卡名称Eth0并配置静态IP

    1.首先查看一下centos7的网卡名称 eno33554984 2.更改为centos7之前版本的网卡名称 3.更改网卡文件的名称 4.禁用可预测命名规则. 通过编辑 /etc/default/gr ...

  9. 【NOIP 2015】Day2 T3 运输计划

    Problem Background 公元 \(2044\) 年,人类进入了宇宙纪元. Description 公元\(2044\) 年,人类进入了宇宙纪元. $L $国有 \(n\) 个星球,还有 ...

  10. 面试官:你了解Webpack吗?

    前言 大家好哟,这是第四篇面试官篇,估计还有个七八十篇面试文章(前端苦命). 这篇文章介绍了webpack核心概念以及如何使用. 开始吧! 概念 webpack的核心概念只要记住下面四个就够用了(除非 ...