当前位置:首页 > VUE

vue实现input动态搜索

2026-01-20 18:07:23VUE

Vue 实现动态搜索功能

使用 Vue 实现动态搜索功能通常涉及监听输入框变化、发送异步请求和展示结果。以下是几种常见实现方式:

使用 v-model 和 watch

<template>
  <div>
    <input v-model="searchQuery" placeholder="Search..." />
    <ul v-if="results.length">
      <li v-for="result in results" :key="result.id">
        {{ result.name }}
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  data() {
    return {
      searchQuery: '',
      results: [],
      timeout: null
    }
  },
  watch: {
    searchQuery(newVal) {
      clearTimeout(this.timeout)
      this.timeout = setTimeout(() => {
        this.performSearch(newVal)
      }, 300)
    }
  },
  methods: {
    async performSearch(query) {
      if (query.length < 2) {
        this.results = []
        return
      }
      const response = await fetch(`/api/search?q=${query}`)
      this.results = await response.json()
    }
  }
}
</script>

使用计算属性

<template>
  <div>
    <input v-model="searchQuery" placeholder="Search..." />
    <ul v-if="filteredItems.length">
      <li v-for="item in filteredItems" :key="item.id">
        {{ item.name }}
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  data() {
    return {
      searchQuery: '',
      items: [] // 从API获取或本地数据
    }
  },
  computed: {
    filteredItems() {
      return this.items.filter(item => 
        item.name.toLowerCase().includes(this.searchQuery.toLowerCase())
      )
    }
  }
}
</script>

使用自定义指令

<template>
  <div>
    <input v-model="searchQuery" v-debounce="onSearch" placeholder="Search..." />
    <ul v-if="results.length">
      <li v-for="result in results" :key="result.id">
        {{ result.name }}
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  directives: {
    debounce: {
      inserted(el, binding) {
        let timeout
        el.addEventListener('input', () => {
          clearTimeout(timeout)
          timeout = setTimeout(() => {
            binding.value(el.value)
          }, 300)
        })
      }
    }
  },
  data() {
    return {
      searchQuery: '',
      results: []
    }
  },
  methods: {
    async onSearch(query) {
      if (query.length < 2) {
        this.results = []
        return
      }
      const response = await fetch(`/api/search?q=${query}`)
      this.results = await response.json()
    }
  }
}
</script>

使用第三方库

对于更复杂的需求,可以考虑使用 lodash 的 debounce 或 vue-use 的组合式 API:

<template>
  <div>
    <input v-model="searchQuery" placeholder="Search..." />
    <ul v-if="results.length">
      <li v-for="result in results" :key="result.id">
        {{ result.name }}
      </li>
    </ul>
  </div>
</template>

<script>
import { ref, watch } from 'vue'
import { useDebounceFn } from '@vueuse/core'

export default {
  setup() {
    const searchQuery = ref('')
    const results = ref([])

    const performSearch = useDebounceFn(async (query) => {
      if (query.length < 2) {
        results.value = []
        return
      }
      const response = await fetch(`/api/search?q=${query}`)
      results.value = await response.json()
    }, 300)

    watch(searchQuery, (newVal) => {
      performSearch(newVal)
    })

    return { searchQuery, results }
  }
}
</script>

性能优化建议

  1. 添加防抖(debounce)避免频繁请求
  2. 设置最小字符限制(如至少2个字符才搜索)
  3. 取消未完成的请求(使用AbortController)
  4. 添加加载状态和错误处理
  5. 考虑本地缓存结果

这些方法可以根据项目需求选择或组合使用,Vue 3的组合式API提供了更灵活的代码组织方式。

vue实现input动态搜索

标签: 动态vue
分享给朋友:

相关文章

vue伪函数实现

vue伪函数实现

Vue 伪函数实现方法 伪函数(Mock Function)在 Vue 中常用于测试或模拟某些逻辑,以下是几种常见的实现方式: 使用 Jest 的 jest.fn() 在单元测试中,可以通过 Jes…

vue实现多级表头

vue实现多级表头

Vue 实现多级表头的方法 使用 el-table 组件 Element UI 的 el-table 组件支持多级表头的实现,通过嵌套 el-table-column 即可完成。 <el-ta…

vue实现签约合作弹窗

vue实现签约合作弹窗

实现签约合作弹窗的步骤 使用Vue实现签约合作弹窗可以通过组件化方式完成,结合模态框和表单交互逻辑。以下是具体实现方法: 1. 创建弹窗组件 新建一个Vue组件文件(如SignContractDia…

vue实现多用户登录

vue实现多用户登录

实现多用户登录的基本思路 在Vue中实现多用户登录通常需要结合后端API完成身份验证,并通过前端路由、状态管理(如Vuex或Pinia)和本地存储(如localStorage)来管理用户会话。以下是关…

vue自己实现下拉导航

vue自己实现下拉导航

实现下拉导航的基本思路 在Vue中实现下拉导航,可以通过结合Vue的响应式数据和事件绑定特性来完成。主要思路是利用v-show或v-if控制下拉菜单的显示与隐藏,并通过鼠标事件或点击事件触发状态变化。…

vue实现右下角弹框

vue实现右下角弹框

实现右下角弹框的基本思路 在Vue中实现右下角弹框,通常需要结合CSS定位和Vue的组件化特性。弹框可以通过绝对定位固定在右下角,并通过Vue控制其显示与隐藏。 创建弹框组件 新建一个Vue组件(…