当前位置:首页 > VUE

vue实现搜索页面

2026-03-08 21:57:49VUE

Vue实现搜索页面的方法

基本结构搭建

使用Vue CLI或Vite创建项目,安装必要依赖。搜索页面通常包含输入框、搜索按钮和结果列表组件。

<template>
  <div class="search-page">
    <input v-model="searchQuery" @keyup.enter="handleSearch" placeholder="输入关键词..."/>
    <button @click="handleSearch">搜索</button>
    <ul v-if="results.length">
      <li v-for="(item, index) in results" :key="index">{{ item.title }}</li>
    </ul>
    <p v-else>暂无结果</p>
  </div>
</template>

数据绑定与事件处理

通过v-model实现双向数据绑定,监听键盘事件或点击事件触发搜索。

<script>
export default {
  data() {
    return {
      searchQuery: '',
      results: []
    }
  },
  methods: {
    async handleSearch() {
      if (!this.searchQuery.trim()) return
      try {
        const response = await fetch(`/api/search?q=${encodeURIComponent(this.searchQuery)}`)
        this.results = await response.json()
      } catch (error) {
        console.error('搜索失败:', error)
      }
    }
  }
}
</script>

API请求封装

建议将API请求单独封装,便于维护和复用。创建api.js文件:

export const searchAPI = (query) => {
  return fetch(`/api/search?q=${encodeURIComponent(query)}`)
    .then(response => response.json())
}

结果展示优化

使用计算属性处理搜索结果,添加加载状态和错误提示。

computed: {
  hasResults() {
    return this.results.length > 0
  }
},
data() {
  return {
    isLoading: false,
    error: null
  }
},
methods: {
  async handleSearch() {
    this.isLoading = true
    this.error = null
    try {
      this.results = await searchAPI(this.searchQuery)
    } catch (err) {
      this.error = '搜索失败,请重试'
    } finally {
      this.isLoading = false
    }
  }
}

样式设计

添加基础样式提升用户体验,建议使用CSS预处理器。

<style scoped>
.search-page {
  max-width: 800px;
  margin: 0 auto;
  padding: 20px;
}
input {
  width: 70%;
  padding: 8px;
}
button {
  padding: 8px 16px;
  margin-left: 10px;
}
ul {
  list-style: none;
  padding: 0;
}
li {
  padding: 8px;
  border-bottom: 1px solid #eee;
}
</style>

高级功能扩展

实现防抖优化,避免频繁请求API。

import { debounce } from 'lodash'

export default {
  created() {
    this.debouncedSearch = debounce(this.handleSearch, 500)
  },
  methods: {
    onInputChange() {
      this.debouncedSearch()
    }
  }
}

路由集成

如果使用Vue Router,可以设置搜索页为独立路由。

const routes = [
  {
    path: '/search',
    component: SearchPage,
    props: route => ({ query: route.query.q })
  }
]

状态管理

对于复杂应用,建议使用Vuex或Pinia管理搜索状态。

vue实现搜索页面

// Pinia示例
export const useSearchStore = defineStore('search', {
  state: () => ({
    results: [],
    history: []
  }),
  actions: {
    async search(query) {
      const res = await searchAPI(query)
      this.results = res
      this.history.push(query)
    }
  }
})

标签: 页面vue
分享给朋友:

相关文章

vue 实现全屏

vue 实现全屏

Vue 实现全屏功能 在 Vue 中实现全屏功能可以通过浏览器提供的 Fullscreen API 完成。以下是一个完整的实现方案: 安装依赖(可选) 如果需要跨浏览器兼容性更好,可以安装 scre…

vue实现mui

vue实现mui

使用 Vue 实现 MUI(Material-UI)风格的界面 Vue 本身不直接提供 MUI(Material Design)组件,但可以通过集成第三方库或手动实现来达到类似效果。以下是几种常见方法…

vue 实现跳转

vue 实现跳转

Vue 实现页面跳转的方法 在 Vue 中实现页面跳转通常可以通过以下几种方式实现,具体选择取决于项目需求和技术栈(如是否使用 Vue Router)。 使用 Vue Router 进行编程式导航…

自实现vue

自实现vue

实现 Vue 的核心功能 要实现一个简化版的 Vue,需要理解其核心功能:数据响应式、模板编译、虚拟 DOM 和组件系统。以下是关键步骤的分解: 数据响应式 Vue 使用 Object.define…

vue实现左右拉伸

vue实现左右拉伸

实现左右拉伸布局的方法 使用CSS Flexbox布局 Flexbox可以轻松实现左右拉伸的效果。通过设置display: flex和flex-grow属性,可以让元素填充可用空间。 <div…

vue实现文章滚动

vue实现文章滚动

Vue 实现文章滚动效果 使用 CSS 实现基础滚动 通过 CSS 的 overflow 和 height 属性控制滚动区域,适用于静态内容滚动。在 Vue 模板中定义固定高度的容器,内容超出后自动滚…