当前位置:首页 > VUE

vue加后端实现搜索

2026-01-23 12:42:20VUE

实现 Vue 与后端结合的搜索功能

前端部分(Vue)

创建搜索输入框和结果展示组件

<template>
  <div>
    <input v-model="searchQuery" @input="handleSearch" placeholder="搜索..."/>
    <ul v-if="results.length">
      <li v-for="item in results" :key="item.id">{{ item.name }}</li>
    </ul>
  </div>
</template>

设置数据模型和方法

<script>
export default {
  data() {
    return {
      searchQuery: '',
      results: [],
      timer: null
    }
  },
  methods: {
    handleSearch() {
      clearTimeout(this.timer)
      this.timer = setTimeout(() => {
        if (this.searchQuery.trim()) {
          this.fetchResults()
        } else {
          this.results = []
        }
      }, 300)
    },
    async fetchResults() {
      try {
        const response = await axios.get('/api/search', {
          params: { q: this.searchQuery }
        })
        this.results = response.data
      } catch (error) {
        console.error('搜索出错:', error)
      }
    }
  }
}
</script>

后端实现(Node.js示例)

设置路由处理搜索请求

const express = require('express')
const app = express()

app.get('/api/search', async (req, res) => {
  const query = req.query.q
  if (!query) {
    return res.status(400).json({ error: '缺少搜索参数' })
  }

  try {
    const results = await searchDatabase(query)
    res.json(results)
  } catch (error) {
    res.status(500).json({ error: '搜索失败' })
  }
})

数据库查询函数示例

async function searchDatabase(query) {
  // 使用SQL示例
  // return await db.query('SELECT * FROM items WHERE name LIKE ?', [`%${query}%`])

  // 或MongoDB示例
  // return await Item.find({ $text: { $search: query } })

  // 模拟返回数据
  return [
    { id: 1, name: `${query}结果1` },
    { id: 2, name: `${query}结果2` }
  ]
}

性能优化建议

添加防抖处理 前端代码中已经实现了300毫秒的防抖,避免频繁请求

后端添加缓存

const cache = new Map()

app.get('/api/search', async (req, res) => {
  const query = req.query.q
  if (cache.has(query)) {
    return res.json(cache.get(query))
  }

  const results = await searchDatabase(query)
  cache.set(query, results)
  res.json(results)
})

安全注意事项

对搜索参数进行消毒处理

function sanitizeInput(input) {
  return input.replace(/[^\w\s]/gi, '')
}

// 在路由中使用
const safeQuery = sanitizeInput(req.query.q)

限制返回结果数量

const results = await searchDatabase(query)
res.json(results.slice(0, 100)) // 最多返回100条

vue加后端实现搜索

标签: 后端vue
分享给朋友:

相关文章

vue实现压缩上传文件

vue实现压缩上传文件

压缩上传文件的实现方法 在Vue中实现文件压缩和上传功能,可以通过以下步骤完成。该方法结合了前端文件压缩库和HTTP请求,确保文件在上传前被有效压缩。 安装必要的依赖 需要使用compressorj…

vue实现关键词轮播

vue实现关键词轮播

Vue 实现关键词轮播 基础实现方案 使用 Vue 的 v-for 和 setInterval 实现基础轮播效果: <template> <div class="keywor…

vue实现visual

vue实现visual

Vue 实现可视化(Visual)的常见方法 在 Vue 中实现可视化通常涉及数据可视化库的集成,以下是几种主流方案: 使用 ECharts ECharts 是一个强大的 JavaScript 图表…

vue实现新闻

vue实现新闻

Vue 实现新闻功能 使用 Vue 实现新闻功能通常涉及新闻列表展示、新闻详情页、分类筛选等模块。以下是实现的基本思路和代码示例。 新闻列表展示 通过 Vue 组件展示新闻列表,通常使用 v-fo…

vue 实现闪烁

vue 实现闪烁

Vue 实现闪烁效果的方法 方法一:使用 CSS 动画 在 Vue 组件中定义一个闪烁的 CSS 动画,通过绑定 class 或 style 来控制元素的闪烁效果。 <template&…

vue SSG实现

vue SSG实现

Vue SSG 实现方法 Vue 的静态站点生成(SSG)可以通过多种工具和框架实现,以下是几种常见的方法: 使用 VuePress VuePress 是一个基于 Vue 的静态站点生成器,适合文…