移动端 - 搜索组件(search-input篇)

news2024/11/17 5:25:11

我们先来看一下最终效果

 


这样的搜索组件在移动端是很常见的, 大部分需求都是:

1. 搜索框进行搜索关键字

2.  热门搜索

3. 搜索历史

4. 搜索结果(提供上拉加载效果)


上述的基本需求也是我们现在需要去实现的, 先来说一下大致的方向:

1. search 一般都是一个路由组件, 所以先创建 search.vue 组件

2. 拆分 search-input (搜索框业务组件), 实现其需求

3. 拆分 search-suggest (搜索结果业务组件), 实现其需求

4. 拆分 search-list (搜索历史基础组件), 持久化保存用户搜索数据

5. 在 search.vue 父组件中使用上述拆分出去的组件, 根据条件动态渲染热门搜索, 搜索历史或搜索结果组件


第一步:

1. 抽离 search-input.vue 组件

抽离的原因就是为了进行复用, 可能在项目的其他地方会使用到; 这也是 vue 的特色之一

<template>
  <div class="search-input">
    <!-- 搜索图标 -->
    <i class="icon-search"></i>
      
    <!-- input框 -->
    <input class="input-inner"/>
      
    <!-- 清空搜索数据图标 -->
    <i class="icon-dismiss"></i>
  </div>
</template>

<script>
export default {
  name: 'search-input'
}
</script>

<style lang="scss" scoped>
.search-input {
  display: flex;
  align-items: center;
  box-sizing: border-box;
  width: 100%;
  padding: 0 6px;
  height: 32px;
  background: $color-highlight-background;
  border-radius: 6px;
  .icon-search {
    font-size: 24px;
    color: $color-text-d;
  }
  .input-inner {
    flex: 1;
    margin: 0 5px;
    line-height: 18px;
    background: $color-highlight-background;
    color: $color-text;
    font-size: $font-size-medium;
    outline: 0;
    &::placeholder {
      color: $color-text-d;
    }
  }
  .icon-dismiss {
    font-size: 16px;
    color: $color-text-d;
  }
}
</style>

先来说一下, 这一个组件需要得到什么数据; 返回给父组件什么数据:

1. 返回出去用户输入的关键字信息(父组件拿到发送请求获取数据)

2. 接收到父组件传入的关键字信息, 然后显示到 input 框中(父组件主动修改的情况)

首先完成第一个需求:

1. 在 search-input 组件中定义 v-model 数据

2. watch 监听对应数据的变化, 一旦变化 emit 修改父组件数据(当然需要进行节流操作)

<template>
  <div class="search-input">
    <i class="icon-search"></i>
    <input class="input-inner" v-model="query"/>
    <i class="icon-dismiss"></i>
  </div>
</template>

<script>
export default {
  name: 'search-input',
  props: {
    modelValue: {
      type: String,
      default: ''
    }
  },
  data () {
    return {
      query: this.modelValue
    }
  },
  watch: {
    query (newQuery) {
      this.$emit('update:modelValue', newQuery.trim())
    }
  }
}
</script>

<style lang="scss" scoped>
...
</style>

因为监听 query 数据变化的时候, 会用到 debounce 方法; 所以 watch 的监听需要做一些改变

<script>
import { debounce } from 'throttle-debounce'

created () {
    this.$watch('query', debounce(300, (newQuery) => {
    	this.$emit('update:modelValue', newQuery.trim())
    }))
}

// watch: {
//   query: debounce(3000, function (newQuery) {
//     this.$emit('update:modelValue', newQuery.trim())
//   })
// }
</script>

再来完成第二个需求:

1. 在父组件中定义 v-model 数据

<template>
  <div class="search">
    <div class="search-input-wrapper">
        
      <!-- 搜索框组件 -->
      <SearchInput v-model="query"></SearchInput>
    </div>
  </div>
</template>

<script>
import SearchInput from '@/components/search/search-input'
import { ref } from 'vue'
export default {
  name: 'searchCom',
  components: {
    SearchInput
  },
  setup () {
    const query = ref('')

    return { query }
  }
}

现在整体的父子组件交互需求是完成了, 我们还需要去完善一下其他的需求

1. 点击清空数据按钮, 清空数据

2. 扩展 input 框的 placeholder 属性

<template>
  <div class="search-input">
    <i class="icon-search"></i>
    <input class="input-inner" v-model="query" :placeholder="placeholder" />
    <!-- 只有当query有值是才会显示 -->
    <i class="icon-dismiss" v-show="query" @click="clear"></i>
  </div>
</template>

<script>
    props: {
        modelValue: {
            type: String,
            default: ''
        },
        placeholder: {
            type: String,
            default: '搜索歌曲、歌手'
        }
    },
    methods: {
        clear () {
            this.query = ''
        }
    }
</script>

现在父组件中, search-input 组件封装完毕了; 然后还要在父组件中显示 "热门搜索" 的需求

1. 首先热门搜索的数据是发送请求获取来的(响应式变量进行接收)

2. 拿着数据对模板进行 v-for 遍历

3. 给每一个元素添加点击事件, 触发点击事件时; 会修改掉 query 的数据

<template>
  <div class="search">

    <!-- 搜索组件 -->
    <div class="search-input-wrapper">
      <SearchInput v-model="query"></SearchInput>
    </div>

    <!-- 热门搜索 -->
    <div class="search-content">
      <div class="hot-keys">
        <h1 class="title">热门搜索</h1>
        <ul>
          <li
            class="item"
            v-for="item in hotKeys"
            :key="item.id"
            @click="addQuery(item.key)"
          >
            <span>{{item.key}}</span>
          </li>
        </ul>
      </div>
    </div>
  </div>
</template>

<script>
import { getHotKeys } from '@/api/search'

getHotKeys().then(res => {
	hotKeys.value = res.hotKeys
})

// 点击数据修改子组件数据
const addQuery = (key) => {
	query.value = key
}
</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/164332.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

20.Isaac教程--Python接口(Python API)

Isaac Python接口(Python API) ISAAC教程合集地址: https://blog.csdn.net/kunhe0512/category_12163211.html 虽然 Isaac SDK 的大部分部分都是用 C 编码的&#xff0c;但您可以选择使用 Python 构建您的应用程序。 本文档介绍了 Isaac SDK 的 Python API。 Python API 允许您…

Day859.高性能队列Disruptor -Java 并发编程实战

高性能队列Disruptor Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于高性能队列Disruptor的内容。 并发容器 中Java SDK 提供了 2 个有界队列&#xff1a; ArrayBlockingQueueLinkedBlockingQueue 它们都是基于 ReentrantLock 实现的&#xff0c;在高并发场景下&…

人工智能的过去与未来——萌芽

1943年—M-P模型 美国神经生理学家Warren McCulloch和数理逻辑学家Walter Pitts在合作的《A logical calculus of the ideas immanent in nervous activity》论文中对生物神经元进行建模&#xff0c;并提出了一种形式神经元模型&#xff0c;命名为McCulloch-Pitts模型。 生物…

65. Python __init__方法

65. __init__方法 文章目录65. __init__方法1. 知识回顾在类的方法中调用类的属性2. 知识回顾调用方法时传值3.体验__init__方法4. __init__的作用5. __init__方法的写法6. __init__方法调用类的属性7. 课堂实操1. 知识回顾在类的方法中调用类的属性 【目标任务】 创建一个类…

C++程序设计——类的六个成员函数

类的六个成员函数 空类中真的什么都没有吗&#xff1f; 事实上任何一个类&#xff0c;在我们不写的情况下&#xff0c;都会自动生成6个默认的成员函数。 1.构造函数 概念&#xff1a; 构造函数是一个特殊的成员函数&#xff0c;名字与类名相同&#xff0c;实例化对象时由编译器…

【基于机械臂触觉伺服的物体操控研究】几种轨迹规划的算法及代码实现

我的毕设题目定为《基于机械臂触觉伺服的物体操控研究》&#xff0c;这个系列主要用于记录做毕设的过程。 轨迹规划是机器人绕不过去的话题&#xff0c;其目的是为了让机器人的运动更加的平滑。对于四足机器人&#xff0c;贝赛尔曲线的应用比较普遍。而对于机械臂&#xff0c;…

【C++】C++ 入门(一)

目录 一、前言 1、什么是C 2、C关键字(C98) 二、第一个C程序 三、命名空间 1、存在意义 2、命名空间定义 3、命名空间的使用 3.1、指定命名空间访问 3.2、全局展开访问 3.3、部分展开访问 四、C输入&输出 五、缺省参数 1、缺省参数概念 2、缺省参数分类 2.…

【Day4】24两两交换链表中的节点、19删除链表的倒数第N个节点、链表相交、142环形链表Ⅱ

【Day4】24两两交换链表中的节点、19删除链表的倒数第N个节点、160链表相交、142环形链表Ⅱ24.两两交换链表的点19.删除链表的倒数第N个节点160链表相交 面试题02.07142 环形链表Ⅱ判断链表是否有环若链表有环&#xff0c;如何找到环的入口24.两两交换链表的点 题目链接&#…

Spacedesk 安装教程及连接后黑屏解放方法

spacedesk 安装教程1. Spacedesk 概述2. Spacedesk 安装教程2.1 下载 Spacedesk2.2 连接计算机的 Spacedesk3. 被拓展的设备连接后黑屏的解决方法结束语1. Spacedesk 概述 Spacedesk 是一款低延迟的免费显示器拓展软件&#xff0c;且不需要线材将不同设备连接&#xff1b; Spa…

MySQL中的普通索引和唯一索引实际开发中的选择

文章目录前言一、普通索引和唯一索引介绍二、查询语句的比较三、更新语句的比较四、索引的选择和实践前言 本文我们将会从针对普通索引与唯一索引的增删改查的具体执行流程&#xff0c;来看看效率的对比。以便让我们在实际业务开发中可以进行更好的选择。 一、普通索引和唯一索…

动态规划系列 —— 背包问题

什么是背包问题 背包问题是有N件物品&#xff0c;容量为V的背包 每个物品有两个属性&#xff1a;体积&#xff0c;价值&#xff0c;分别用数组v&#xff0c;w表示 第i件物品的体积为v[i]&#xff0c;价值为w[i] 计算在背包装得下的情况下&#xff0c;能装的最大价值是多少&…

MATLAB 图像处理大作业

1、基础知识利用 MATLAB 提供的 Image file/IO 函数完成以下处理&#xff1a;&#xff08;a&#xff09;以测试图像中心为圆心&#xff0c;图像长宽中较小值一半为半径画一个红颜色的圆&#xff1b;&#xff08;b&#xff09;将测试图像涂成国际象棋状的‘黑白格’样子&#xf…

华芯片特微 M33内核 KEIL5环境配置不上问题

1 JFLASH连接不上问题 官方手册有说解决这个问题 2 JFLASH能连接上KEIL提示no found sw-dp 在替换keil下载算法后还是提示no found sw-dp 1 怀疑是keil 527版本太高了, 就换了518 还是不行 2 怀疑是keil检测到盗版了就不让下, 替换Jlink为以前老版本还是不行 解决方案: 下…

聊天气泡图片的动态拉伸、适配与镜像

聊天气泡图片的动态拉伸、适配与镜像前情提要创建.9.png格式的图片从资源文件夹加载.9.png图片从本地文件加载“.9.png”图片项目痛点进阶探索iOS中的方式Android中的探索构造chunk数据构造padding数据镜像翻转功能屏幕的适配简单封装演示示例一条线段控制的拉伸两条线段控制的…

Pandas 安装与教程

前言Pandas 是 Python 语言的一个扩展程序库&#xff0c;用于数据分析。Pandas 是一个开放源码、BSD 许可的库&#xff0c;提供高性能、易于使用的数据结构和数据分析工具。Pandas 名字衍生自术语 "panel data"&#xff08;面板数据&#xff09;和 "Python data…

[apidoc]Apidoc-文档生成工具

Apidoc主要是用于生成API文档的工具&#xff0c;可以用于多种语言&#xff0c;包括java、javascript、php等 这里主要是为了写前端的APIDOC&#xff0c;方便交互是双方的使用; 工具的安装 工具包的安装 npm i apidoc [-g|-D]可以-g全局安装&#xff0c;或者-D局部安装,因为…

网盘系统|基于SpringBoot的网盘系统的设计与实现

作者主页&#xff1a;编程指南针 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容&#xff1a;Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助 收藏点赞不迷路 关注作者有好处 文末获取源…

【无功优化】考虑泄流效应的光伏并网点电压系统侧无功优化(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

软考中级,【软件评测师】经验分享

&#xff0c;以下是我的考试成绩&#xff0c;一次通过很是幸运&#xff0c;希望把我的好运传递给大家&#xff0c;大家都能一次通过谈经验之前&#xff0c;先和大家说说考试的题型以及考试的内容&#xff0c;根据往年的考试题目我们可以很容易得知&#xff0c;软件评测师考试分…

Cisco(62)——PBR策略路由案例

场景1-单下一跳: 拓扑: 需求: R1和R2均连接100.100.100.100,R4看做一台PC,当PC访问100.100.100.100的时候优先走左边,当左边down掉之后切换到右边链路,使用PBR操作。 实现: 1.IP地址等基本配置 R4: R4(config)#no ip routingR4(config)#int e0/0 R4(config-if)#ip add…