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

相关推荐
To_OC16 小时前
面试被问了三回三栏布局,这次我终于把 BFC 那层窗户纸捅破了
前端·css·面试
To_OC16 小时前
啃完 TS 工具类型我发现:Pick 和 Omit 原来就是一层窗户纸
前端·面试·typescript
风月说与山鬼17 小时前
三、大括号语法
前端·react.js
kyriewen18 小时前
我把最常踩的8个CORS跨域报错整理了一遍——第8个去年还不存在
前端·javascript
Csvn18 小时前
🕰️ 闭包 + setTimeout 的 5 个经典陷阱:为什么定时器看到的永远不是最新的值?
前端
lilian23319 小时前
Harmony os 技术实战|拼豆制图27:用单字符编码承载 50 张 70×70 图纸
前端·数据库·华为·harmonyos
CarIise19 小时前
CSS选择器与样式关联
前端·css·tensorflow
里欧跑得慢20 小时前
CSS 模块化架构的演进:BEM、CSS Modules 到 CSS-in-JS 的反思
前端·css·flutter·web·css-in-js
IT_陈寒20 小时前
Vue的computed属性把我坑惨了,原来我一直用错姿势
前端·人工智能·后端