# 搜索页

# 技术点

localStorage 自定义 v-model 单个input表单的回车事件处理 $emit debounce 函数使用 axios 实例化 axios 取消请求

# 目录结构

└─ src                          
   └─ views                
      └─ search                         # 搜索页
         ├─ components                  # 组件
         │  ├─ SearchBar.vue            # 搜索栏
         │  ├─ SearchHistory.vue        # 历史记录
         │  └─ searchResult.vue         # 搜索结果
         └─ index.vue                   # 搜索入口页

# 介绍

用户输入需要查询的内容时,组件监听 input 事件,对输入内容进行查询,查询接口调用前,会先 debounce 以待用户输入完成后再触发请求。如果请求结果未返回时,再次触发接口请求,则取消上次请求。

# 自定义 v-model

该页面的 SearchBar 组件,使用了自定义 v-model ,实现代码如下:

<input
	ref="input"
	type="search"
	:value="value"
	@keyup.enter.prevent="noop($event)"
	@input="$emit('input', $event.target.value)"
	placeholder="找影视 / 影人 / 角色"
/>

其中 $emit('input', $event.target.value) 方法,将输入内容通过自定义事件传递给父组件

props: {
	value: String,
},

使用

<search-bar
	v-model="keyword"
	@keyword-change="storageKeyword"
	@on-clear="clearKeyword()"
/>

# 表单回车事件

form 表单中只有一个 type="text"input 标签时,点击回车会触发表单提交,该事件会导致页面刷新,在 vue 中,需要给表单增加 <form @submit.prevent> 事件阻止表单提交

# axios 取消请求

本文只说明本项目中的使用方式,更多使用方法,请阅读文档 (opens new window)

import axios from "axios";
data() {
	return {
		cancel: null, // axios 取消请求方法
	}
},

methods: {
	async search() {
		let CancelToken = axios.CancelToken;
		let _this = this;

		// 如果取消请求方法存在,则执行取消
		if (this.cancel) {
			this.cancel();
		}

		// 请求参数
		let params = {
			page,
			keyword: this.keyword,
			type: this.type,
		};

		const { code, data, total } = await axios.get(`/search`, {
			params,
			// 创建 cancel token
			cancelToken: new CancelToken(function executor(c) {
					_this.cancel = c;
			}),
		})
	}
}
上次更新: 6/27/2022, 5:48:02 PM
示例展示,因PC端无touch事件,请在手机上进行浏览