vue组件 下拉框分页

上图 👇
下拉框分页.png

和公司签了保密协议啊哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈所以我把数据全部马赛克了哈哈哈哈哈哈哈哈哈哈哈尼萌就当有就成~~
输入框前面有个label,和页面中的其他label保持一致;分页的组件是vue-element-admin中自带的pagination,用elementui的el-pagination也可~~一样的道理反正就是各种传值

组件内容 ↓

<template>
  <div class="container-select">
    <!-- 这部分是label -->
    <span class="title-label" :style="{ width: labelWidth }">{{ label }}</span>
    <!-- 这部分是点击输入框跳出来的分页小弹窗 -->
    <el-popover placement="bottom" trigger="click" v-model="visible">
      <el-table
        size="mini"
        :data="list"
        highlight-current-row
        @row-click="changeTableRow"
        v-loading="listLoading"
      >
        <el-table-column
          :prop="nameProp"
          :label="nameLabel"
          align="center"
          show-overflow-tooltip
        ></el-table-column>
        <el-table-column
          v-if="other"
          :prop="otherProp"
          :label="otherLabel"
          align="center"
        ></el-table-column>
      </el-table>
      <small-pagination
        :total="total"
        :page.sync="params.pageNum"
        :limit.sync="params.pageSize"
        @pagination="getList"
      />
      <el-input
        v-model="inputValue"
        :placeholder="placeholder"
        clearable
        slot="reference"
        @input="onChange"
      ></el-input>
    </el-popover>
  </div>
</template>

<script>
// 这是分页组件。。用el-pagination也可以
import smallPagination from "@/components/Pagination/withoutNumber.vue";

export default {
  components: {
    smallPagination,
  },
  props: {
    labelWidth: {
      type: String,
      default: "70px",
    },
    label: {
      type: String,
      default: "机构名称:",
    },
    // 控制popover显隐的属性
    visible: {
      type: Boolean,
      default: false,
    },
    // 列表数据
    list: {
      type: Array,
      default: () => {
        return [];
      },
    },
    // 列表loading
    listLoading: {
      type: Boolean,
      default: false,
    },
    // 列表属性1
    nameProp: {
      type: String,
      default: "",
    },
    // 列表label 1
    nameLabel: {
      type: String,
      default: "机构名称",
    },
    // 另一个属性。有就为true,妹有就false
    // 这页只显示一列机构名儿,别的页面有时会要求显示电话啊啥的
    other: {
      type: Boolean,
      default: false,
    },
    otherProp: {
      type: String,
      default: "",
    },
    otherLabel: {
      type: String,
      default: "机构联系电话",
    },
    // 分页所需参数
    params: {
      type: Object,
      default: () => {},
    },
    // 输入框内容
    inputValue: {
      type: String,
      default: "",
    },
    placeholder: {
      type: String,
      default: "请选择机构",
    },
    total: {
      type: Number,
      default: 0,
    },
  },
  methods: {
    // 点击行
    changeTableRow(row) {
      this.inputValue = row[this.nameProp];  // input中显示列表中选择的数据
      this.code = row[this.otherProp];  // 保存选中行的code
      this.visible = false;  // 选中行则popover消失
    },
    // 获取数据
    getList() {
      this.$emit("getList", this.params);
    },
    // 改变input值
    onChange(value) {
      if (value == "") {
        this.code = "";
      }
      this.$emit("onChangeOrganizeValue", value);
    },
  },
};
</script>

<style lang="scss" scoped>
.el-input {
  width: 140px;
}
.title-label {
  display: inline-block;
  text-align: right;
  color: #606266;
  font-size: 14px;
  font-weight: bold;
}
.popover {
  background: red;
}
</style>

父组件 👇
template 中 ↓

        <el-form-item>
          <select-pagination
            :list="agencyList"
            :listLoading="agencyLoading"
            :nameProp="'name'"
            :params="agency"
            :other="false"
            :total="totalAgency"
            @getList="getAgency"
            @onChangeOrganizeValue="changeAgencyInput"
          ></select-pagination>
        </el-form-item>

script 中 ↓

<script>
import SelectPagination from "@/components/selectPagination/selectPagination";

export default {
  data() {
    return {
      agencyList: [], // 放数据的数组儿
      // 请求参数
      agency: {
        pageNum: 1,
        pageSize: 8,
        condition: "",  // 输入框儿输入申请符合条件的数据
      },
      totalAgency: 0, // 分页的总数儿
      agencyLoading: false,  // 列表儿的loading圈儿~
    };
  },
  methods: {
    getAgency() {
      this.agencyLoading = true;
      //  getAgencyList 为接口名儿
      // this.agency是请求参数的对象儿
      getAgencyList(this.agency).then((res) => {
        if (res.code == 200 && res.success) {
          this.agencyList = res.content;
          this.totalAgency = res.totalCount;
          this.agencyLoading = false;
        } else {
          this.$message("暂无机构");
          this.agencyList = [];
          this.totalAgency = 0;
          this.agencyLoading = false;
        }
      });
    },
    changeAgencyInput(value) {
      if (value == "") { 
        // 如果输入框儿为空则清空之前选中机构后赋值的参数
        this.listQuery.code = "";
        this.agency.condition = "";
        this.getAgency();
      } else {
        // 赋值
        this.agency.condition = value;
        this.getAgency();
      }
    },
  },
  mounted() {
    this.getAgency();
  },
  components: { SelectPagination },
};
</script>

最后叮嘱一句,最好不要直接在父组件中控制子组件的inputValue。会有很多问题都是血的教训哈哈哈哈哈哈哈

如果现在有二级联动的需求,选择左边的数据,更改右边的数据。
那么点击左侧的列表选定一个值,右侧才可以进行操作。左侧换值,右侧清空。
这个时候,我们不要直接用inputValue来操纵输入框的值。最好再设置一个其他的变量,比如flag。

如果左边传的值发生变化,父组件中的this.flag = !this.flag
在子组件中watch这个flag

watch: {
  flag(n,o) {
    if(n != o) {
      this.inputValue = '';
    }
  }
}

tada~~~一个下拉框分页的组件就完成啦~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,039评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,426评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,417评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,868评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,892评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,692评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,416评论 3 419
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,326评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,782评论 1 316
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,957评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,102评论 1 350
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,790评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,442评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,996评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,113评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,332评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,044评论 2 355

推荐阅读更多精彩内容