搜索欄封裝

使用element-ui弄了個(gè)簡(jiǎn)單的表單搜索欄組件,適用于一般的管理后臺(tái)。效果如下:


效果
點(diǎn)擊搜索按鈕

1.重置按鈕默認(rèn)存在缎患,如果不需要可以通過(guò)showResetBtn隱藏
2.通過(guò)設(shè)置formOptions來(lái)設(shè)置需要的表單內(nèi)容
3.設(shè)置btnItems來(lái)設(shè)置按鈕抑胎,并且默認(rèn)點(diǎn)擊的時(shí)候都會(huì)返回整個(gè)表單內(nèi)容
4.需要返回值在callBack中寫(xiě)入?yún)?shù)即可

btnItems: [
        {
          txt: '搜索', // 按鈕名稱(chēng)
          type: 'primary', 
          callBack: (val) => {
            _self.test(val)
          }, // 回調(diào)古胆,可通過(guò)回調(diào)返回整個(gè)表單內(nèi)容何鸡,回調(diào)方法寫(xiě)在methods中纺弊,通過(guò)重新定義this
        },
        {
          txt: '導(dǎo)出',
          type: 'primary',
          callBack: () => {
            _self.test2()
          }, // 不需要返回值
        }
      ], // 按鈕數(shù)據(jù)

5.表單類(lèi)型包括input/select/time/date,可以根據(jù)需求進(jìn)行更改

組件頁(yè)面
// search-column.vue
<template>
  <div class="search-column-box">
    <el-form :model="formData" ref="_form" :inline="true">
      <el-form-item
        v-for="(item, index) in formOptions"
        :key="index"
        :prop="item.prop"
        :label="item.label ? item.label + ':' : ''"
        :rules="item.rules"
        :label-width="labelWidth"
      >
        <!-- input -->
        <el-input
          v-if="item.element === 'el-input'"
          style="width: 199px"
          :size="item.size ? item.size : 'small'"
          :type="item.type"
          :disabled="item.disabled"
          v-model="formData[item.prop]"
          :placeholder="item.placeholder || '請(qǐng)輸入'"
        ></el-input>

        <!-- select -->
        <el-select
          v-if="item.element === 'el-select'"
          style="width: 199px"
          :size="item.size ? item.size : 'small'"
          v-model="formData[item.prop]"
          :disabled="item.disabled"
          :clearable="item.clearable"
        >
          <el-option
            v-for="option in item.options"
            :key="option.value"
            :label="option.label"
            :value="option.value"
          ></el-option>
        </el-select>

        <!-- time-select -->
        <el-time-select
          v-if="item.element === 'el-time-select' && !item.isRange"
          :size="item.size ? item.size : 'small'"
          style="width: 199px"
          v-model="formData[item.prop]"
          :value-format="item.valueFormat"
          :picker-options="item.pickerOptions"
          :is-range="item.isRange"
          :disabled="item.disabled"
          placeholder="選擇時(shí)間"
        >
        </el-time-select>

        <el-time-picker
          v-if="item.element === 'el-time-select' && item.isRange"
          :size="item.size ? item.size : 'small'"
          is-range
          :disabled="item.disabled"
          v-model="formData[item.prop]"
          :value-format="item.valueFormat"
          range-separator="至"
          start-placeholder="開(kāi)始時(shí)間"
          end-placeholder="結(jié)束時(shí)間"
          placeholder="選擇時(shí)間范圍"
        >
        </el-time-picker>

        <!-- el-date-picker -->
        <el-date-picker
          v-if="item.element === 'el-date-picker' && !item.isRange"
          :size="item.size ? item.size : 'small'"
          style="width: 199px"
          v-model="formData[item.prop]"
          :value-format="item.valueFormat"
          :type="item.type"
          :disabled="item.disabled"
          clearable
          :format="item.format"
          :placeholder="item.placeholder || '請(qǐng)選擇'"
        ></el-date-picker>

        <el-date-picker
          v-if="item.element === 'el-date-picker' && item.isRange"
          :size="item.size ? item.size : 'small'"
          v-model="formData[item.prop]"
          :value-format="item.valueFormat"
          type="daterange"
          :disabled="item.disabled"
          range-separator="至"
          start-placeholder="開(kāi)始日期"
          end-placeholder="結(jié)束日期"
          :picker-options="item.pickerOptions"
        >
        </el-date-picker>
      </el-form-item>
      <el-form-item>
        <el-button
          @click="search"
          type="primary"
          icon="el-icon-search"
          size="mini"
          >搜索</el-button
        >
        <el-button
          v-if="showResetBtn"
          @click="reset"
          size="mini"
          icon="el-icon-refresh"
          >重置</el-button
        >
        <el-button
          size="mini"
          v-for="(item, index) in btnItems"
          plain
          :icon="item.icon"
          :key="index"
          :type="item.type"
          :v-hasPermi="item.hasPermi"
          @click="item.callBack(formData)"
        >
          {{ item.txt }}
        </el-button>
      </el-form-item>
    </el-form>
  </div>
</template>

<script>
export default {
  name: "searchColumn",
  data() {
    return {
      formData: {},
    };
  },
  props: {
    formOptions: {
      type: Array,
      default() {
        return [];
      },
    }, // 表單數(shù)組
    btnItems: {
      type: Array,
      default() {
        return [];
      },
    }, // 按鈕數(shù)組
    showResetBtn: {
      type: Boolean,
      default: false,
    }, // 重置按鈕骡男,默認(rèn)顯示
    labelWidth: {
      type: String,
      default: "",
    }, // label的寬
    rules: {
      type: Array,
      default() {
        return [];
      },
    }, // rules設(shè)置
  },
  mounted() {
    // 給表單添加屬性
    this.formOptions.forEach((item) => {
      this.$set(
        this.formData,
        item.prop,
        item.default || item.default === 0 ? item.default : ""
      );
    });
  },
  methods: {
    // 搜索
    search() {
      this.$emit("search", this.formData);
    },
    // 重置
    reset() {
      this.$refs._form.resetFields();
      this.formOptions.forEach((item) => {
        this.$set(
          this.formData,
          item.prop,
          item.default || item.default === 0 ? item.default : ""
        );
      });
      this.$emit("search", this.formData);
    },
  },
};
</script>

<style lang="scss" scoped>
.search-column-box {
}
</style>
使用頁(yè)
<template>
  <div>
    <search :formOptions="formOptions" :btnItems="btnItems" @reset="reset"/>
  </div>
</template>

<script>
  import search from './components/search'

export default {
  components: {
    search,
  },
 data() {
  const _self = this // 保存this淆游,按鈕回調(diào)用到
  const getPickerOptions = () => {
      let pickerOptions = {
        shortcuts: [{
          text: '最近一周',
          onClick(picker) {
            const end = new Date();
            const start = new Date();
            start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
            picker.$emit('pick', [start, end]);
          }
        }, {
          text: '最近一個(gè)月',
          onClick(picker) {
            const end = new Date();
            const start = new Date();
            start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
            picker.$emit('pick', [start, end]);
          }
        }, {
          text: '最近三個(gè)月',
          onClick(picker) {
            const end = new Date();
            const start = new Date();
            start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
            picker.$emit('pick', [start, end]);
          }
        }]
      }
      return pickerOptions
    }; // 日期快捷方式
  return {
     formOptions: [
        {
          label: '意見(jiàn)內(nèi)容', // 文字
          prop: 'content', // 綁定值
          element: 'el-input', // 顯示類(lèi)型
          placeholder: '請(qǐng)輸入意見(jiàn)內(nèi)容',
        },
        {
          label: '類(lèi)型',
          prop: 'type',
          element: 'el-select',
          default: 1, // 默認(rèn)值
          options: [
            { label: '給點(diǎn)意見(jiàn)', value: '1' },
            { label: '售后問(wèn)題', value: '2' },
          ], // 選項(xiàng)
        },
        {
          label: '提交時(shí)間',
          prop: 'timeRange',
          element: 'el-time-select',
          pickerOptions: {
            start: '07:30',
            step: '00:15',
            end: '18:30'
          }, // 起止、間隔時(shí)間
          isRange: true, // 范圍
        },
        {
          label: '提交日期',
          prop: 'dateRange',
          element: 'el-date-picker',
          type: 'week',  
          format: 'yyyy 第 WW 周', // 顯示樣式
        },
        {
          label: '選擇日期范圍',
          prop: 'dateRange1',
          element: 'el-date-picker',
          isRange: true, // 范圍
        },
        {
          label: '選擇日期范圍',
          prop: 'dateRange2',
          element: 'el-date-picker',
          isRange: true,
          pickerOptions: getPickerOptions(), // 日期快捷方式
        },
      ], // 表單數(shù)據(jù)
      btnItems: [
        {
          txt: '添加設(shè)備',
          icon: "el-icon-plus",
          type: 'primary',
          callBack: (formData) => {
            _self.test(formData)
          }, // 回調(diào)隔盛,可通過(guò)回調(diào)返回整個(gè)表單內(nèi)容犹菱,回調(diào)方法寫(xiě)在methods中
        }
        }
      ], // 按鈕數(shù)據(jù)
  }
},
methods: {
  test(val) {
      console.log('搜索---', val)
    },
    test2() {
      console.log('導(dǎo)出---')
    },
},
}
</script>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市吮炕,隨后出現(xiàn)的幾起案子腊脱,更是在濱河造成了極大的恐慌,老刑警劉巖龙亲,帶你破解...
    沈念sama閱讀 216,324評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件陕凹,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡鳄炉,警方通過(guò)查閱死者的電腦和手機(jī)杜耙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)拂盯,“玉大人佑女,你說(shuō)我怎么就攤上這事√父停” “怎么了团驱?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,328評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)空凸。 經(jīng)常有香客問(wèn)我店茶,道長(zhǎng),這世上最難降的妖魔是什么劫恒? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,147評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮轿腺,結(jié)果婚禮上两嘴,老公的妹妹穿的比我還像新娘。我一直安慰自己族壳,他們只是感情好憔辫,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著仿荆,像睡著了一般贰您。 火紅的嫁衣襯著肌膚如雪坏平。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,115評(píng)論 1 296
  • 那天锦亦,我揣著相機(jī)與錄音舶替,去河邊找鬼。 笑死杠园,一個(gè)胖子當(dāng)著我的面吹牛顾瞪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播抛蚁,決...
    沈念sama閱讀 40,025評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼陈醒,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了瞧甩?” 一聲冷哼從身側(cè)響起钉跷,我...
    開(kāi)封第一講書(shū)人閱讀 38,867評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎肚逸,沒(méi)想到半個(gè)月后爷辙,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,307評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡吼虎,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評(píng)論 2 332
  • 正文 我和宋清朗相戀三年犬钢,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片思灰。...
    茶點(diǎn)故事閱讀 39,688評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡玷犹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出洒疚,到底是詐尸還是另有隱情歹颓,我是刑警寧澤,帶...
    沈念sama閱讀 35,409評(píng)論 5 343
  • 正文 年R本政府宣布油湖,位于F島的核電站巍扛,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏乏德。R本人自食惡果不足惜撤奸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望喊括。 院中可真熱鬧胧瓜,春花似錦、人聲如沸郑什。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,657評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蘑拯。三九已至钝满,卻和暖如春兜粘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背弯蚜。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,811評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工孔轴, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人熟吏。 一個(gè)月前我還...
    沈念sama閱讀 47,685評(píng)論 2 368
  • 正文 我出身青樓距糖,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親牵寺。 傳聞我的和親對(duì)象是個(gè)殘疾皇子悍引,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容