Vue.js封装可配置的搜索列表组件

在Vue.js开发中,经常会遇到需要展示搜索和列表的需求。为了提高代码复用性和开发效率,我们可以封装一个可配置的搜索列表组件,使其能够根据配置展示搜索表单和列表数据,并支持搜索和分页功能。本篇博客将引导您实现这样一个组件。

组件结构

我们将创建一个名为SearchList的组件,它将包含两个子组件:SearchForm和DataList。SearchForm用于展示搜索表单和处理搜索事件,DataList用于展示列表数据和处理分页事件。

搜索表单

首先,我们创建一个名为SearchForm的子组件,用于展示搜索表单和处理搜索事件。可以根据业务需求自定义搜索表单的字段和样式,并在用户点击搜索按钮时触发自定义事件。

xml 复制代码
<template>
  <form>
    <!-- 搜索表单字段配置,可以根据业务需求自定义 -->
    <input v-model="searchText" type="text" placeholder="请输入搜索关键字" />
    <button @click="handleSearch">搜索</button>
  </form>
</template>

<script>
export default {
  data() {
    return {
      searchText: ''
    }
  },
  methods: {
    handleSearch() {
      // 将搜索关键字通过自定义事件传递给父组件
      this.$emit('search', this.searchText)
    }
  }
}
</script>

列表数据

然后,我们创建一个名为DataList的子组件,用于展示列表数据和处理分页事件。可以根据业务需求自定义列表的列和样式,并在用户点击分页按钮时触发自定义事件。

xml 复制代码
<template>
  <ul>
    <!-- 列表数据渲染,可以根据业务需求自定义 -->
    <li v-for="item in dataList" :key="item.id">{{ item.name }}</li>
  </ul>
  <button @click="handlePrevPage">上一页</button>
  <span>{{ currentPage }}</span>
  <button @click="handleNextPage">下一页</button>
</template>

<script>
export default {
  props: {
    dataList: {
      type: Array,
      default: () => []
    },
    currentPage: {
      type: Number,
      default: 1
    }
  },
  methods: {
    handlePrevPage() {
      // 将用户点击的上一页事件通过自定义事件传递给父组件
      this.$emit('prev-page')
    },
    handleNextPage() {
      // 将用户点击的下一页事件通过自定义事件传递给父组件
      this.$emit('next-page')
    }
  }
}
</script>

搜索列表组件

最后,我们创建名为SearchList的父组件,封装SearchForm和DataList,并通过props接收配置参数进行展示。我们将在父组件的methods中处理搜索和分页事件,并用axios发送请求获取数据。

xml 复制代码
<template>
  <div>
    <search-form @search="handleSearch"></search-form>
    <data-list :data-list="listData" :current-page="currentPage" @prev-page="handlePrevPage" @next-page="handleNextPage"></data-list>
  </div>
</template>

<script>
import SearchForm from './SearchForm'
import DataList from './DataList'

export default {
  components: {
    SearchForm,
    DataList
  },
  data() {
    return {
      listData: [],
      currentPage: 1
    }
  },
  methods: {
    handleSearch(keyword) {
      // 发送请求获取数据
      axios
        .get(`/api/data?keyword=${keyword}&page=${this.currentPage}`)
        .then(response => {
          this.listData = response.data
        })
        .catch(error => {
          console.error(error)
        })
    },
    handlePrevPage() {
      // 处理上一页事件
      this.currentPage--
      this.handleSearch()
    },
    handleNextPage() {
      // 处理下一页事件
      this.currentPage++
      this.handleSearch()
    }
  }
}
</script>

在SearchList组件中,我们将SearchForm和DataList作为子组件导入,并直接引用它们。通过监听SearchForm的search事件和DataList的prev-page和next-page事件,并在methods中发送请求获取数据,我们可以实现搜索和分页功能。

使用SearchList组件

在父组件中使用SearchList组件,通过props传递配置参数,以展示搜索表单和列表数据。

ruby 复制代码
plaintextCopy code
<template>
  <div>
    <search-list :columns="columns" :page-size="pageSize"></search-list>
  </div>
</template>

<script>
import SearchList from './SearchList

export default {
  components: {
    SearchList
  },
  data() {
    return {
      columns: [
        { label: '姓名', prop: 'name' },
        { label: '性别', prop: 'gender' }
      ],
      pageSize: 10
    }
  }
}
</script>

在父组件中,我们将SearchList作为子组件导入,并通过props传递columns和pageSize参数。可以根据业务需求自定义columns和pageSize参数,并根据实际情况处理搜索和分页事件。

通过封装可配置的搜索列表组件,我们可以在Vue.js开发中实现搜索和列表展示的复用,提高开发效率并增加代码可维护性。使用SearchForm和DataList组件,我们可以根据业务需求自定义搜索表单和数据列表的展示样式,并在父组件中处理搜索和分页事件。

相关推荐
糖果店的幽灵3 分钟前
Claude Code 完全实战指南 - 第四章:Skill 怎么写
java·服务器·前端
light blue bird11 分钟前
MES/ERP 工序 BOM 协同场景调度维护组件
前端·信息可视化·桌面端winform·多节点端·gdi图表绘制开发
鱼人23 分钟前
Vue 3 组合式 API 最佳实践:如何写出可维护的代码
前端
wuhen_n23 分钟前
LangChain 自定义 Tool 封装:打造专属 AI 能力工具集
前端·langchain·ai编程
长大198824 分钟前
彻底搞懂 JavaScript 事件循环
前端
橘猫走江湖25 分钟前
Web 前端本地存储:localStorage 与 IndexedDB
前端·javascript·indexeddb
小强198825 分钟前
CSS 布局进化史:从 Float 到 Flexbox 再到 Grid
前端
AKA__老方丈28 分钟前
删除确认 Hook - 统一管理单删/批量删除的确认弹窗与执行
前端·javascript·vue.js
假如让我当三天老蒯30 分钟前
React+TS 项目结构(自学项目用)
前端·react.js
yingyima32 分钟前
Celery 分布式任务队列:我差点被这行代码坑死
前端