• vue elementui 搜索栏子组件封装


    前言

    描述: 在基本项目中搜索栏、分页组件格式样式几乎是固定的,只是对应的数据不同,由于模块会随着需求的不断增加,可能会导致重复代码越来越多,这时可以用到子组件,需要将相同的模块代码统一封装,提高开发效率和页面统一。(自己的想法,只根据自己需求来说)

    需求

    在这里插入图片描述

    实现

    子组件(search.vue)

    html

    <template>
      <div class="search-main">
        <!-- 下拉框 -->
        <el-select
          class="com com-margin"
          v-model="objSearch.searchType"
          filterable
          placeholder="请选择"
        >
          <el-option
            v-for="item in objSearch.searchKeyOptions"
            :key="item.value"
            :label="item.label"
            :value="item.value"
          >
          </el-option>
        </el-select>
        <!-- 搜索值 -->
        <el-input
          class="com"
          v-model="objSearch.searchValue"
          placeholder="请输入搜索值"
        ></el-input>
        <!-- 下拉框 -->
        <el-cascader
          class="com"
          :options="objSearch.options"
          :props="{ checkStrictly: true }"
          clearable
          :placeholder="objSearch.placeholder"
          v-model="objSearch.status"
        ></el-cascader>
    
        <el-button @click="search" type="primary" icon="el-icon-search"
          >搜索</el-button
        >
        <el-button @click="refresh" type="primary" icon="el-icon-refresh"
          >刷新</el-button
        >
        <el-button type="primary" icon="el-icon-document" @click="exportExcel"
          >导出EXCEL</el-button
        >
        <el-button class="total" type="primary" icon="el-icon-files"
          >{{ objSearch.name }}总数:{{ objSearch.total
          }}{{ objSearch.unit }}</el-button
        >
      </div>
    </template>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    js

    <script>
    export default {
      name: 'Search',
      // 接收父组件对象
      props: {
        objSearch: { type: Object, default: null }
      },
      methods: {
        // 搜索
        search () {
          let obj = {
            searchType: this.objSearch.searchType,
            searchValue: this.objSearch.searchValue,
            status: this.objSearch.status
          }
          this.$emit('search', obj)
        },
        // 刷新
        refresh () {
          this.$emit('refresh')
        },
        // 导出
        exportExcel () {
          this.$emit('exportExcel')
        }
      }
    }
    </script>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    css

    <style scoped>
    .search-main {
      width: 100%;
      line-height: 4rem;
    }
    .com {
      width: 10rem;
    }
    .com-margin {
      margin-left: 1rem;
    }
    .total {
      float: right;
      margin-top: 1rem;
    }
    </style>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    父组件部分主要代码(index.vue)

    html(主要代码)

    Search 指components注册的标签。
    :objSearch 指向子组件传的参数
    @refresh、@exportExcel、@search 指子组件触发的方法

    <div class="device-sensor-main">
        <!--使用Search子组件 refresh 方法是刷新,exportExcel 方法是导出,search 方法是搜索 -->
        <div class="search">
          <Search
            :objSearch="objSearch"
            @refresh="refresh"
            @exportExcel="exportExcel"
            @search="search"
          ></Search>
        </div>
    </div>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    js(主要代码)

    <script>
    // 引用搜索模块子组件
    import Search from '@/components/search'
    export default {
      name: 'SensorList',
      // 注册
      components: {
        Search
      },
      data () {
        return {
          // 搜索模块
          objSearch: {
            searchKeyOptions: [
              { label: '传感器编号', value: 'sensorImei' },
              { label: '设备IMEI号', value: 'imei' },
              { label: '医院名称', value: 'hospitalName' }
            ],
            searchType: 'sensorImei',
            searchValue: '',
            name: '设备',
            unit: '台',
            total: 0,
            placeholder: '传感器状态',
            options: [],
            status: []
          }
        }
      },
      methods: {
        // 搜索 obj就是子组件传过来的对象
        search (obj) {
          console.log('子组件搜索返回数据:', obj)
        },
        // 刷新
        refresh () {
          console.log('刷新')
        },
        // 导出
        exportExcel () {
          console.log('导出')
        }
      }
    }
    </script>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    css

    <style scoped>
    .search {
      width: 100%;
      height: 4rem;
    }
    .footer {
      text-align: center;
    }
    .el-table .el-table__cell {
      padding: 0.3rem 0;
    }
    </style>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    结束!!!

  • 相关阅读:
    暑假值得参加的写作竞赛有哪些?
    前台项目第二天(7-10)
    [Python]语音识别媒体中的音频到文本
    Java中的分布式计算框架有哪些?
    1377. T 秒后青蛙的位置 DFS
    【状态机模型】大盗阿福 买卖股票IV V
    提高爬虫效率之多线程、多进程的使用
    如何有效取代FTP来帮助企业快速传输大文件
    城市公安可视化大数据展示平台预测预警,防患未然
    PriorityQueue优先级队列
  • 原文地址:https://blog.csdn.net/qq_44697754/article/details/125517034