当前位置:首页 > VUE

vue实现搜索下载

2026-02-18 18:29:27VUE

实现搜索下载功能的Vue方案

前端搜索界面实现

使用Vue的响应式数据绑定和事件处理实现搜索框

<template>
  <div>
    <input v-model="searchQuery" @keyup.enter="search" placeholder="输入关键词"/>
    <button @click="search">搜索</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      searchQuery: ''
    }
  },
  methods: {
    search() {
      this.$emit('search', this.searchQuery)
    }
  }
}
</script>

搜索结果展示组件

展示从API获取的搜索结果列表

<template>
  <div>
    <div v-for="item in results" :key="item.id">
      <h3>{{ item.title }}</h3>
      <p>{{ item.description }}</p>
      <button @click="download(item.url)">下载</button>
    </div>
  </div>
</template>

<script>
export default {
  props: ['results'],
  methods: {
    download(url) {
      window.open(url, '_blank')
    }
  }
}
</script>

后端API交互

使用axios与后端API通信

import axios from 'axios'

export default {
  data() {
    return {
      results: []
    }
  },
  methods: {
    async fetchResults(query) {
      try {
        const response = await axios.get('/api/search', {
          params: { q: query }
        })
        this.results = response.data
      } catch (error) {
        console.error('搜索失败:', error)
      }
    }
  }
}

文件下载处理

对于需要认证的下载链接,可以使用以下方式

downloadFile(fileId) {
  axios({
    url: `/api/download/${fileId}`,
    method: 'GET',
    responseType: 'blob'
  }).then(response => {
    const url = window.URL.createObjectURL(new Blob([response.data]))
    const link = document.createElement('a')
    link.href = url
    link.setAttribute('download', 'filename.ext')
    document.body.appendChild(link)
    link.click()
    link.remove()
  })
}

进度显示实现

对于大文件下载,可以显示进度条

axios({
  url: '/api/download',
  method: 'GET',
  responseType: 'blob',
  onDownloadProgress: progressEvent => {
    const percentCompleted = Math.round(
      (progressEvent.loaded * 100) / progressEvent.total
    )
    this.downloadProgress = percentCompleted
  }
})

错误处理增强

添加更完善的错误处理逻辑

downloadError(error) {
  if (error.response) {
    switch(error.response.status) {
      case 404:
        alert('文件不存在')
        break
      case 403:
        alert('无权限下载')
        break
      default:
        alert('下载失败')
    }
  } else {
    alert('网络错误')
  }
}

组件整合

将各组件整合到主应用

vue实现搜索下载

<template>
  <div>
    <SearchBox @search="handleSearch"/>
    <ResultsList :results="searchResults"/>
  </div>
</template>

<script>
import SearchBox from './SearchBox.vue'
import ResultsList from './ResultsList.vue'

export default {
  components: {
    SearchBox,
    ResultsList
  },
  data() {
    return {
      searchResults: []
    }
  },
  methods: {
    handleSearch(query) {
      this.fetchResults(query)
    }
  }
}
</script>

标签: vue
分享给朋友:

相关文章

vue双向实现

vue双向实现

Vue 双向数据绑定的实现原理 Vue 的双向数据绑定主要通过 v-model 指令实现,其核心是结合了数据劫持(Object.defineProperty 或 Proxy)和发布-订阅模式。 数据…

vue实现页面截屏

vue实现页面截屏

使用html2canvas库实现截屏 html2canvas是一个流行的JavaScript库,可以将DOM元素转换为Canvas图像。在Vue项目中安装html2canvas: npm insta…

vue 实现过滤

vue 实现过滤

Vue 实现过滤的方法 在 Vue 中实现过滤功能可以通过多种方式完成,包括使用计算属性、自定义过滤器、第三方库等。以下是几种常见的实现方法: 使用计算属性进行过滤 计算属性是 Vue 中最常用的过…

vue实现token

vue实现token

Vue 中实现 Token 认证的方法 在 Vue 中实现 Token 认证通常涉及前端与后端的交互,包括 Token 的获取、存储、发送和刷新等操作。以下是具体实现步骤: 获取 Token 用户登…

分页实现vue

分页实现vue

分页实现(Vue) 在Vue中实现分页功能通常需要结合前端分页逻辑和后端API支持。以下是两种常见的实现方式: 前端分页实现 适用于数据量较小的情况,直接在客户端完成分页逻辑。 <templ…

vue实现标签

vue实现标签

Vue 实现标签的方法 在 Vue 中实现标签功能可以通过多种方式完成,以下是几种常见的方法: 使用动态组件 动态组件可以根据不同的条件渲染不同的标签内容。通过 :is 属性动态绑定组件名,实现标签…