el-select组件封装(解决同页面中多处使用到el-select,且使用对象相同但各自id不同的情况)

 使用背景:每个装备下都有多个批次,以下拉框展示,所以要求每个下拉框里数据不一样,且其中一个下拉框数据选择发生变化时,不能影响其他的!

引用组件代码:

<Select
    :itemId="item.id"
    :options="item.children"
    @initSomeData="initSomeData"
></Select>
import Select from "./component/el-select.vue";
components: { Select }

封装的组件代码如下:

<template>
  <div class="select">
    <el-select
      v-model="curBatchNumber"
      @change="changeBatchNumber"
      placeholder="请选择装备批号"
      size="medium"
      style="width: 85%"
      :title="curBatchNumber"
    >
      <el-option
        v-for="(item, index) in options"
        :key="index"
        :label="item.equipmentBatchNumber"
        :value="item.equipmentBatchNumber"
      ></el-option>
    </el-select>
  </div>
</template>

<script>
export default {
  data() {
    return {
      curBatchNumber: "", // 当前装备批号
      equipmentNum: "", // 装备数量
      storageTime: "", // 贮存时间
    };
  },
  props: ["options", "itemId"],
  mounted() {
    this.curBatchNumber = this.options[0].equipmentBatchNumber;
    this.dealData(this.curBatchNumber);
  },
  methods: {
    // 选择的装备型号发生变化时
    changeBatchNumber(val) {
      this.dealData(val);
    },
    dealData(val) {
      this.options.forEach((item) => {
        if (item.equipmentBatchNumber == val) {
          this.equipmentNum = item.equipmentNum;
          this.storageTime = item.storageTime;
        }
      });
      this.$emit(
        "initSomeData",
        this.equipmentNum,
        this.storageTime,
        this.itemId
      );
    },
  },
};
</script>

<style lang="scss" scoped>
.select ::v-deep .el-input--medium .el-input__inner {
  height: 32px;
  line-height: 32px;
}
</style>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以将el-select和el-tree封装成一个自定义组件,例如:SelectableTree。 首先,在组件的template,可以使用el-select和el-tree的模板,并将它们放在一起。同时,在el-select添加一个v-model来绑定选的值。 ```html <template> <div class="selectable-tree"> <el-select v-model="selectedNode" placeholder="请选择" @change="handleSelectionChange"> <el-option v-for="node in nodes" :key="node.id" :label="node.label" :value="node"></el-option> </el-select> <el-tree :data="treeData" :props="treeProps" @node-click="handleNodeClick"></el-tree> </div> </template> ``` 在script,需要定义props和data,同时还需要定义computed属性来将el-tree的data转换为适合el-select使用的数据。 ```javascript <script> export default { name: 'SelectableTree', props: { nodes: { type: Array, required: true }, treeProps: { type: Object, required: true } }, data() { return { selectedNode: null, treeData: [] } }, computed: { selectData() { return this.nodes.map(node => { return { label: node.label, value: node } }) } }, methods: { handleSelectionChange(value) { this.$refs.tree.setCurrentKey(value.id) }, handleNodeClick(data, node) { this.selectedNode = data } }, created() { this.treeData = this.nodes.map(node => { return { label: node.label, id: node.id, children: node.children || [] } }) } } </script> ``` 最后,在使用组件时,只需传入el-select和el-tree的props和数据即可。 ```html <template> <div> <selectable-tree :nodes="nodes" :tree-props="treeProps"></selectable-tree> </div> </template> <script> import SelectableTree from "./SelectableTree.vue"; export default { name: "App", components: { SelectableTree, }, data() { return { nodes: [ { id: 1, label: "一级 1", children: [ { id: 4, label: "二级 1-1", children: [ { id: 9, label: "三级 1-1-1", }, { id: 10, label: "三级 1-1-2", }, ], }, ], }, { id: 2, label: "一级 2", children: [ { id: 5, label: "二级 2-1", }, { id: 6, label: "二级 2-2", }, ], }, ], treeProps: { children: "children", label: "label", }, }; }, }; </script> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值