1、实现效果

页面初始化效果

单选选中效果

全部选择效果

取消选中(点击各查询条件或者已选条件的叉号)

2、代码实现

主页面方法

<template>
  <div class="pageContainer">
    <div class="superSearchArea" v-show="!searchMoreFlag">
      <div
              class="clearfix"
              v-for="renderItem in renderEntity"
              :key="renderItem.entityType"
      >
        <div :class="renderItem.isSelectTypeNameClass ? 'selectTitle selectTitleSpace fl': 'selectTitle fl'">{{ renderItem.selectTypeName }}</div>
        <div class="selectType">
          <div
                  :class="submitReadySelectObj[renderItem.entityType].length === renderItem.entityList.length ? 'selectAll fl selectAllActive': 'selectAll fl '"
                  @click="handleAllSelect(renderItem.entityType)"
          >
            {{ renderItem.allSelectName }}
          </div>
          <div
                  v-for="item in renderItem.entityList"
                  :key="item.key"
                  @click="handleSelectType(item.type, item.key, item.value, item.id, renderItem.entityType)"
                  :class="item.isSelect ? 'selectItem selectActive' : 'selectItem'"
          >
            {{ item.value }}
          </div>
        </div>
      </div>
      <!-- 已选条件 -->
      <div class="clearfix">
        <div class="selectTitle fl">已选条件</div>
        <ul class="readySelectType fl clearfix">
          <li
            v-for="item in allReadySelectArr"
            :key="item.key"
          >
            <span class="fl">{{ item.text }}</span><label
              class="fr"
              @click="delReadySelectItem(item.key, item.list, item.id)"
            >X</label>
          </li>
        </ul>
      </div>
      <!-- 化学成分,力学性能,关键字搜素 -->
      <select-component
        :keyWords="keyWords"
        :materialArr="materialArr"
        :dynamicsArr="dynamicsArr"
        @changeKeyWords="changeKeyWords"
        ref="selectComponent"
      ></select-component>
      <!-- 搜素及清空条件 -->
      <div class="searchBtnArea">
        <div
          class="clearInfo fr"
          @click="clearSelectInfo"
        >
          <img
            src="@/assets/mainPage/clearinfo.png"
            alt="clearinfo"
          /> 清空条件
        </div>
        <div class="searchBtn">
          <el-button
            type="danger"
            @click="searchInfo"
          >搜索</el-button>
        </div>
      </div>
    </div>
    <!-- 底部表格 -->
    <el-table
      :data="tableData"
      style="width: 100%"
    >
      <el-table-column label="牌号">
        <template slot-scope="{row}">
          <span
            @click="handleGoInfo('gcss', row.steelNum)"
            class="handGoInfo"
          > {{ row.steelNum }} </span>
        </template>
      </el-table-column>
      <el-table-column
        prop="applyStandard"
        label="适用标准"
      >
      </el-table-column>
      <el-table-column
        prop="system"
        label="体系"
      >
      </el-table-column>
      <el-table-column
        prop="steelNum"
        label="牌号"
      >
      </el-table-column>
      <el-table-column
        prop="dataSource"
        label="数据来源"
      >
      </el-table-column>
      <el-table-column
        prop="materialType"
        label="材料类别"
      >
      </el-table-column>
      <el-table-column label="配送信息">
        <el-table-column
          prop="C"
          label="C"
        >
        </el-table-column>
        <el-table-column
          prop="Si"
          label="Si"
        >
        </el-table-column>
        <el-table-column
          prop="Mn"
          label="Mn"
        >
        </el-table-column>
        <el-table-column
          prop="P"
          label="P"
        >
        </el-table-column>
        <el-table-column
          prop="S"
          label="S"
        >
        </el-table-column>
      </el-table-column>
      <el-table-column label="力学性能">
        <el-table-column
          prop="YS"
          label="YS"
        >
        </el-table-column>
        <el-table-column
          prop="Rm"
          label="Rm"
        >
        </el-table-column>
        <el-table-column
          prop="Akv"
          label="Akv"
        >
        </el-table-column>
      </el-table-column>
    </el-table>
    <!-- 分页插件 -->
    <pagination
      v-show="total > 0"
      :total="total"
      :page.sync="listQuery.page"
      :limit.sync="listQuery.limit"
      @pagination="getList"
    />
  </div>
</template>value

<script>
import { SelectType } from "@/mixins/shycss/selectType";
export default {
  name: "Gcss",
  components: {},
  mixins: [SelectType],
  props: {
    searchMoreFlag: {
      type: Boolean,
      default: false,
    },
  },
  data() {
    return {
      matchRelation: {
        // list 与 type对应关系, 主要是用于type对应
        steelTypeList: "SteelTypeList",
        shapeTypeList: "ShapeTypeList",
        productCategoryTypeList: "ProductCategoryTypeList",
        deliveryStateTypeList: "DeliveryStateTypeList",
        standardTypeList: "StandardTypeList",
      },
      submitReadySelectObj: {
        // 查询条件提交数组,放在对象中方便提交
        steelTypeList: [], // 钢类
        shapeTypeList: [], // 形状
        productCategoryTypeList: [], // 产品类别
        deliveryStateTypeList: [], // 交货状态
        standardTypeList: [], // 标准体系
      },
      steelTypeList: [
        // 钢类数组,type: 类别, id: 后台返回唯一键, value: 显示名称  key: 前端唯一键(这里使用v-for循环,且存在多个查询条件,为避免前端v-for在指定key时报错重复,这里组合前端唯一键,使用type_id的形式,如果确定id唯一可删除,isSelect: 选中状态)
        {
          type: "SteelTypeList",
          id: "g01",
          value: "碳素结构钢",
          key: "SteelTypeList_g01",
          isSelect: false,
        },
        {
          type: "SteelTypeList",
          id: "g02",
          value: "低合金高强度钢",
          key: "SteelTypeList_g02",
          isSelect: false,
        },
        {
          type: "SteelTypeList",
          id: "g03",
          value: "合金结构钢",
          key: "SteelTypeList_g03",
          isSelect: false,
        },
        {
          type: "SteelTypeList",
          id: "g04",
          value: "不锈钢",
          key: "SteelTypeList_g04",
          isSelect: false,
        },
        {
          type: "SteelTypeList",
          id: "g05",
          value: "易切削钢",
          key: "SteelTypeList_g05",
          isSelect: false,
        },
        {
          type: "SteelTypeList",
          id: "g06",
          value: "弹簧钢",
          key: "SteelTypeList_g06",
          isSelect: false,
        },
        {
          type: "SteelTypeList",
          id: "g07",
          value: "耐热钢",
          key: "SteelTypeList_g07",
          isSelect: false,
        },
        {
          type: "SteelTypeList",
          id: "g08",
          value: "工模具钢",
          key: "SteelTypeList_g08",
          isSelect: false,
        },
        {
          type: "SteelTypeList",
          id: "g09",
          value: "轴承钢",
          key: "SteelTypeList_g09",
          isSelect: false,
        },
        {
          type: "SteelTypeList",
          id: "g10",
          value: "弹簧钢",
          key: "SteelTypeList_g10",
          isSelect: false,
        },
        {
          type: "SteelTypeList",
          id: "g11",
          value: "铸钢铸铁",
          key: "SteelTypeList_g11",
          isSelect: false,
        },
        {
          type: "SteelTypeList",
          id: "g12",
          value: "耐候钢",
          key: "SteelTypeList_g12",
          isSelect: false,
        },
      ],
      shapeTypeList: [
        // 形状数组
        {
          type: "ShapeTypeList",
          id: "xz01",
          value: "板",
          key: "ShapeTypeList_xz01",
          isSelect: false,
        },
        {
          type: "ShapeTypeList",
          id: "xz02",
          value: "带",
          key: "ShapeTypeList_xz02",
          isSelect: false,
        },
        {
          type: "ShapeTypeList",
          id: "xz03",
          value: "薄带",
          key: "ShapeTypeList_xz03",
          isSelect: false,
        },
        {
          type: "ShapeTypeList",
          id: "xz04",
          value: "棒",
          key: "ShapeTypeList_xz04",
          isSelect: false,
        },
        {
          type: "ShapeTypeList",
          id: "xz05",
          value: "线",
          key: "ShapeTypeList_xz05",
          isSelect: false,
        },
      ],
      productCategoryTypeList: [
        // 产品类别
        {
          type: "ProductCategoryTypeList",
          id: "cplb01",
          value: "热轧钢",
          key: "ProductCategoryTypeList_cplb01",
          isSelect: false,
        },
        {
          type: "ProductCategoryTypeList",
          id: "cplb02",
          value: "冷轧钢",
          key: "ProductCategoryTypeList_cplb02",
          isSelect: false,
        },
        {
          type: "ProductCategoryTypeList",
          id: "cplb03",
          value: "无缝管",
          key: "ProductCategoryTypeList_cplb03",
          isSelect: false,
        },
        {
          type: "ProductCategoryTypeList",
          id: "cplb04",
          value: "焊管",
          key: "ProductCategoryTypeList_cplb04",
          isSelect: false,
        },
        {
          type: "ProductCategoryTypeList",
          id: "cplb05",
          value: "铸造管",
          key: "ProductCategoryTypeList_cplb05",
          isSelect: false,
        },
      ],
      deliveryStateTypeList: [
        // 交货状态
        {
          type: "DeliveryStateTypeList",
          id: "jhzt01",
          value: "热轧",
          key: "DeliveryStateTypeList_jhzt01",
          isSelect: false,
        },
        {
          type: "DeliveryStateTypeList",
          id: "jhzt02",
          value: "冷轧",
          key: "DeliveryStateTypeList_jhzt02",
          isSelect: false,
        },
        {
          type: "DeliveryStateTypeList",
          id: "jhzt03",
          value: "热加工",
          key: "DeliveryStateTypeList_jhzt03",
          isSelect: false,
        },
        {
          type: "DeliveryStateTypeList",
          id: "jhzt04",
          value: "冷加工",
          key: "DeliveryStateTypeList_jhzt04",
          isSelect: false,
        },
      ],
      standardTypeList: [
        // 标准体系
        {
          type: "StandardTypeList",
          id: "bztx01",
          value: "所有企业标准",
          key: "StandardTypeList_bztx01",
          isSelect: false,
        },
        {
          type: "StandardTypeList",
          id: "bztx02",
          value: "中国(GB)",
          key: "StandardTypeList_bztx02",
          isSelect: false,
        },
        {
          type: "StandardTypeList",
          id: "bztx03",
          value: "日本(JIS)",
          key: "StandardTypeList_bztx03",
          isSelect: false,
        },
        {
          type: "StandardTypeList",
          id: "bztx04",
          value: "美国(ASTM)",
          key: "StandardTypeList_bztx04",
          isSelect: false,
        },
      ],
      allReadySelectArr: [], // 所有选中数组,显示使用
      tableData: [
        {
          steelNum: "06Ni1DR",
          applyStandard: "GB 3531-2014",
          system: "中国GB",
          dataSource: "新材道公有云",
          materialType: "钢材",
          C: "≤0.08",
          Si: "0.15~0.35",
          Mn: "0.3~0.8",
          P: "≤0.008",
          S: "≤0.004",
          YS: "≥560",
          Rm: "680~820",
          Akv: "≥100",
        },
        {
          steelNum: "06Ni2DR",
          applyStandard: "GB 3531-2014",
          system: "中国GB",
          dataSource: "新材道公有云",
          materialType: "钢材",
          C: "≤0.08",
          Si: "0.15~0.35",
          Mn: "0.3~0.8",
          P: "≤0.008",
          S: "≤0.004",
          YS: "≥560",
          Rm: "680~820",
          Akv: "≥100",
        },
        {
          steelNum: "06Ni3DR",
          applyStandard: "GB 3531-2014",
          system: "中国GB",
          dataSource: "新材道公有云",
          materialType: "钢材",
          C: "≤0.08",
          Si: "0.15~0.35",
          Mn: "0.3~0.8",
          P: "≤0.008",
          S: "≤0.004",
          YS: "≥560",
          Rm: "680~820",
          Akv: "≥100",
        },
        {
          steelNum: "06Ni4DR",
          applyStandard: "GB 3531-2014",
          system: "中国GB",
          dataSource: "新材道公有云",
          materialType: "钢材",
          C: "≤0.08",
          Si: "0.15~0.35",
          Mn: "0.3~0.8",
          P: "≤0.008",
          S: "≤0.004",
          YS: "≥560",
          Rm: "680~820",
          Akv: "≥100",
        },
        {
          steelNum: "06Ni5DR",
          applyStandard: "GB 3531-2014",
          system: "中国GB",
          dataSource: "新材道公有云",
          materialType: "钢材",
          C: "≤0.08",
          Si: "0.15~0.35",
          Mn: "0.3~0.8",
          P: "≤0.008",
          S: "≤0.004",
          YS: "≥560",
          Rm: "680~820",
          Akv: "≥100",
        },
        {
          steelNum: "06Ni6DR",
          applyStandard: "GB 3531-2014",
          system: "中国GB",
          dataSource: "新材道公有云",
          materialType: "钢材",
          C: "≤0.08",
          Si: "0.15~0.35",
          Mn: "0.3~0.8",
          P: "≤0.008",
          S: "≤0.004",
          YS: "≥560",
          Rm: "680~820",
          Akv: "≥100",
        },
        {
          steelNum: "06Ni7DR",
          applyStandard: "GB 3531-2014",
          system: "中国GB",
          dataSource: "新材道公有云",
          materialType: "钢材",
          C: "≤0.08",
          Si: "0.15~0.35",
          Mn: "0.3~0.8",
          P: "≤0.008",
          S: "≤0.004",
          YS: "≥560",
          Rm: "680~820",
          Akv: "≥100",
        },
        {
          steelNum: "06Ni8DR",
          applyStandard: "GB 3531-2014",
          system: "中国GB",
          dataSource: "新材道公有云",
          materialType: "钢材",
          C: "≤0.08",
          Si: "0.15~0.35",
          Mn: "0.3~0.8",
          P: "≤0.008",
          S: "≤0.004",
          YS: "≥560",
          Rm: "680~820",
          Akv: "≥100",
        },
      ],
      materialArr: [
        // 化学性能
        { key: "C", value: "C" },
        { key: "Si", value: "Si" },
        { key: "Mr", value: "Mr" },
        { key: "P", value: "P" },
        { key: "S", value: "S" },
      ],
      dynamicsArr: [
        // 力学性能
        { key: "qfqd", value: "屈服强度YS(MPa)" },
        { key: "cjg", value: "冲击功Akv(J)" },
        { key: "cjwd", value: "冲击温度(℃)" },
        { key: "klqd", value: "抗拉强度TS(MPa)" },
        { key: "ysl", value: "延伸率A(%)" },
      ],
    };
  },
  watch: {
    // searchMoreFlag(newVal) {
    //   console.log("flag" + newVal);
    // },
  },
  computed: {},
  methods: {
    // 清空搜素条件
    clearSelectInfo() {
      // submitReadySelectObj数据清空
      this.submitReadySelectObj = {
        // 查询条件提交数组
        steelTypeList: [], // 钢类
        shapeTypeList: [], // 形状
        productCategoryTypeList: [], // 产品类别
        deliveryStateTypeList: [], // 交货状态
        standardTypeList: [], // 标准体系
      };
      // 将数据中的isSelect置为false
      this.steelTypeList = [...this.resetIsSelect(this.steelTypeList)];
      this.shapeTypeList = [...this.resetIsSelect(this.shapeTypeList)];
      this.productCategoryTypeList = [
        ...this.resetIsSelect(this.productCategoryTypeList),
      ];
      this.deliveryStateTypeList = [
        ...this.resetIsSelect(this.deliveryStateTypeList),
      ];
      this.standardTypeList = [...this.resetIsSelect(this.standardTypeList)];
      // allReadySelectArr清空
      this.allReadySelectArr = [];
      // selectComponent数据清空
      this.$refs.selectComponent.clearSelectInfo();
    },
    // 搜索
    searchInfo() {
      // 获取selectComponent中的查询内容
      let selectComponentInfo = this.$refs.selectComponent.getSelectInfo();
      // todo 这里需要组合其他查询条件进行请求数据
      this.searchData();
    },
    // 查询数据
    searchData() {},
  },
  created() {},
  mounted() {
  // 修改数据格式,渲染实体
    this.renderEntity = [
      {
        selectTypeName: "钢类",
        allSelectName: "全部",
        isSelectTypeNameClass: true,
        entityType: "steelTypeList",
        entityList: this.steelTypeList,
      },
      {
        selectTypeName: "形状",
        allSelectName: "全部",
        isSelectTypeNameClass: false,
        entityType: "shapeTypeList",
        entityList: this.shapeTypeList,
      },
      {
        selectTypeName: "产品类别",
        allSelectName: "全部",
        isSelectTypeNameClass: false,
        entityType: "productCategoryTypeList",
        entityList: this.productCategoryTypeList,
      },
      {
        selectTypeName: "交货状态",
        allSelectName: "全部",
        isSelectTypeNameClass: false,
        entityType: "deliveryStateTypeList",
        entityList: this.deliveryStateTypeList,
      },
      {
        selectTypeName: "标准体系",
        allSelectName: "所有国际及行业标准",
        isSelectTypeNameClass: false,
        entityType: "standardTypeList",
        entityList: this.standardTypeList,
      },
    ];
  },
};
</script>
<style lang='scss' scoped>
</style>

复用方法

import SelectComponent from '@/views/shycss/component/selectComponent_index';
import Pagination from "@/components/Pagination/Pagination_index";
export const SelectType = {
    components: { SelectComponent, Pagination },
    props: {
        searchMoreFlag: {
            type: Boolean,
        },
        keyWords: {
            type: String
        }
    },
    data() {
        return {
            allReadySelectArr: [], // 所有选中数组,显示使用
            renderEntity: [], // 渲染实体
            total: 8, // 数据总条数
            listQuery: {
                page: 1, // 当前页
                limit: 20, // 每页条数
            }
        }
    },
    methods: {
        // 分页查询方法
        getList(obj) {
            this.listQuery.page = obj.page;
            this.listQuery.limit = obj.limit;
            this.searchData();
        },
        // 修改关键字
        changeKeyWords(val) {
            this.$emit("changeKeyWords", val)
        },
        // 将数组中的isSelect置为false
        resetIsSelect(arr) {
            arr.forEach(item => {
                item.isSelect = false;
            })
            return arr;
        },
        // 查询条件
        handleSelectType(type, key, text, id, list) {
            this[list].some((item) => {
                if (item.key == key) {
                    this.changeSelectItemState(item.isSelect, key, type, id, list, text);
                    item.isSelect = !item.isSelect;
                    return true;
                }
            });
        },
        // 根据查询条件当前选中状态动态新增/删除显示选中数组和提交显示数组中的数据
        // 如果原来是选中状态,则点击后为非选中状态,需要在所有选中数组中删除
        // 如果原来是非选中状态,则点击后为选中状态,需要在所有选中数组中添加
        changeSelectItemState(isSelect, key, type, id, list, text) {
            if (isSelect) {
                // 删除已选数组中的数组
                this.delFromAllReadyArr(key);
                // 删除提交数组中的数据
                this.delFromSubmitReadySelectArr(list, id);
            } else {
                // 新增已选显示数组中的数据
                this.addToAllReadyArr(key, text, list, id);
                // 新增提交数组中的数据
                this.addToSubmitReadySelectArr(type, id, text, list);
            }
        },
        // 添加到显示选中数组
        addToAllReadyArr(key, text, list, id) {
            this.allReadySelectArr.push({ key: key, text: text, list: list, id: id });
        },
        // 添加到提交选中数组中
        addToSubmitReadySelectArr(type, id, text, list) {
            let obj = { key: id, value: text, type: type };
            this.submitReadySelectObj[list].push(obj);
        },
        // 从显示选中数组中删除
        delFromAllReadyArr(key) {
            let flag = false;
            let index = 0;
            this.allReadySelectArr.some((item) => {
                if (item.key == key) {
                    flag = true;
                    return true;
                }
                index++;
            });
            flag && this.allReadySelectArr.splice(index, 1);
        },
        // 删除提交数组中的数据
        delFromSubmitReadySelectArr(list, id) {
            let flag = false,
                index = 0;
            this.submitReadySelectObj[list].some((item) => {
                if (item.key == id) {
                    flag = true;
                    return true;
                }
                index++;
            });
            flag && this.submitReadySelectObj[list].splice(index, 1);
        },
        // 删除所选选项
        delReadySelectItem(key, list, id) {
            // 删除显示选中数组中的对应数据
            this.delFromAllReadyArr(key);
            // 删除提交选中数组中的对应数据
            this.delFromSubmitReadySelectArr(list, id);
            // 取消查询条件的选中样式
            this.cancelIsSelect(this[list], key);
            // 查询数据
            this.searchData();
        },
        // 取消查询条件选中状态
        cancelIsSelect(arr, key) {
            arr.some((item) => {
                if (item.key == key) {
                    item.isSelect = false;
                    return true;
                }
            });
        },
        // 点击全部按钮
        handleAllSelect(list) {
            // 判断提交选中数组中的个数是否等于list数组的个数
            // 如果是则删除显示数组中所有该类型数据,提交数组置空,然后将所有该类型数据select置为false
            // 如果否则说明存在所有或部分数据未被选中,这时候删除显示数组中所有该类型数据,并新增数据;提交选中数组中将该类型所有数据填充,然后将所有该类型数据select置为true
            if (!this.submitReadySelectObj[list] || !this.matchRelation[list]) return;
            // 循环删除显示数组中所有该类型数据
            this.delSpecTypeFromAllReadySelelctArr(list);
            if (this.submitReadySelectObj[list].length === this[list].length) {
                // 提交数组置空
                this.submitReadySelectObj[list] = [];
                this[list].forEach((item) => {
                    // 将所有选项改为非选中状态
                    item.isSelect = false;
                });
            } else {
                // 提交数组置空
                this.submitReadySelectObj[list] = [];
                this[list].forEach((item) => {
                    // push到显示选中数组的对象
                    let obj1 = {
                        key: item.key,
                        text: item.value,
                        list: list,
                        id: item.id,
                    };
                    // push到提交选中数组的对象
                    let obj2 = {
                        key: item.id,
                        value: item.value,
                        type: this.matchRelation[list],
                    };
                    this.allReadySelectArr.push(obj1);
                    this.submitReadySelectObj[list].push(obj2);
                    // 将所有选项改为选中状态
                    item.isSelect = true;
                });
            }
            this.searchData();
        },
        // 循环删除显示数组中所有该类型数据
        delSpecTypeFromAllReadySelelctArr(list) {
            for (let i = this.allReadySelectArr.length - 1; i >= 0; i--) {
                if (this.allReadySelectArr[i].list == list) {
                    this.allReadySelectArr.splice(i, 1);
                }
            }
        },
        // 跳转详情
        handleGoInfo(type, steelName) {
            switch(type) {
                case "gcss":
                    this.$router.push({ path: '/shycss/gcssMainInfo', query: { name: steelName } })
                    break;
                case "yshjsu":
                    this.$router.push({ path: '/shycss/yshjssMainInfo', query: { name: steelName } })
                    break;
                case "hcss":
                    this.$router.push({ path: '/shycss/hcssMainInfo', query: { name: steelName } })
                    break;
            }
        }
    }
}