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组件,我们可以根据业务需求自定义搜索表单和数据列表的展示样式,并在父组件中处理搜索和分页事件。

相关推荐
妄小闲2 分钟前
网页源代码 企业网站源码 html源码网站
前端·html
Ares-Wang16 分钟前
Vue3》》 ref 获取子组件实例 原理
javascript·vue.js·typescript
爱上妖精的尾巴33 分钟前
5-16WPS JS宏 map数组转换迭代应用-1(一维嵌套数组结构重组)
开发语言·前端·javascript·wps·jsa
OEC小胖胖42 分钟前
交互的脉络:小程序事件系统详解
前端·微信小程序·小程序·微信开放平台
DokiDoki之父1 小时前
web核心—HTTP
前端·网络协议·http
咖啡の猫1 小时前
Vue 简介
前端·javascript·vue.js
Moment1 小时前
写代码也能享受?这款显示器让调试变得轻松又高效!😎😎😎
前端·后端
゜ eVer ㄨ1 小时前
React-router v6学生管理系统笔记
前端·笔记·react.js
m0_526119402 小时前
pdf文件根据页数解析成图片 js vue3
前端·javascript·pdf
时光少年2 小时前
Compose AnnotatedString实现Html样式解析
android·前端