当前位置:首页 > 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示例)

设置路由处理搜索请求

vue加后端实现搜索

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毫秒的防抖,避免频繁请求

vue加后端实现搜索

后端添加缓存

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 的响应式系统基于 Object.defineProperty(Vue 2.x)或 Proxy(Vue 3.x)实现,通过数据劫持和依赖收集实现数据变化时的自动更新。…

vue实现后端管理系统

vue实现后端管理系统

使用 Vue 实现后端管理系统 技术选型与核心依赖 Vue 3 + TypeScript 提供现代前端开发体验,搭配 Vue Router 实现路由管理,Pinia 替代 Vuex 进行状态管理。El…

vue手写签名如何实现

vue手写签名如何实现

实现手写签名的基本思路 在Vue中实现手写签名功能,通常需要借助HTML5的Canvas API来捕获用户的绘制操作。核心流程包括初始化画布、监听触摸/鼠标事件、记录轨迹以及生成签名图片。…

vue实现文章锚点定位

vue实现文章锚点定位

实现文章锚点定位的方法 在Vue中实现文章锚点定位可以通过多种方式完成,以下是几种常见的方法: 使用原生HTML锚点 通过HTML的id属性和<a>标签的href属性实现锚点跳转。在Vu…

vue实现跑车

vue实现跑车

Vue 实现跑车动画效果 使用 Vue 结合 CSS 动画可以实现跑车在屏幕上移动的效果。以下是一个完整的实现方案: 创建 Vue 组件结构 <template> <div…

jq 实现 vue

jq 实现 vue

jq 实现 Vue 的核心功能 jq 是一个轻量级的 JavaScript 库,主要用于 DOM 操作和事件处理。虽然它不能完全替代 Vue,但可以通过一些技巧模拟 Vue 的核心功能,如数据绑定、事…