Element中Transfer 穿梭框的应用

1、应用背景

项目中会需要对产品进行选择添加,我们可以用Transfer 穿梭框来实现这一需求。

视图:

 

2、代码实现 

<template>
  <div class="bigbox">
    <div class="topInfo">配置产品</div>
    <div class="scollbox" style="text-align: center">
      <el-transfer
        style="text-align: left; display: inline-block"
        :value="tempValue"
        filterable
        :left-default-checked="[2, 3]"
        :right-default-checked="[1]"
        :render-content="renderFunc"
        :titles="['未选产品', '已选产品']"
        :button-texts="['', '']"
        :format="{
        noChecked: '${total}',
        hasChecked: '${checked}/${total}'
      }"
        @change="handleChange"
        @right-check-change="rightcheckchange"
        :data="data"
      >
      </el-transfer>
    </div>
    <div class="product-edit-footer">
      <el-button @click="cancel()">取 消</el-button>
      <el-button type="primary" @click="saveProduct">确定</el-button>
    </div>
  </div>
</template>

<script>
import {getconfigPlanList}  from "../../../../api/http/product";
export default {
    props:{
        "value" : Array
    },
  data() {
    return {
      data: [],
      //   congfigArr:[],
      configInfomsg: "",
      isBtnAdded: false,
      page: 1,
      perPage: 100,
      value4: [1],
      tempValue:[],
      renderFunc(h, option) {
        return (
          <span>
           {option.label}
          </span>
        );
      },
    };
  },

  watch:{
      value:{
          handler(){
            this.tempValue = this.value.map(item => item.productCode) ;
          },
          immediate : true 
      }
  },

 

  methods: {
    handleChange(value) {
        this.tempValue = value ;
    },

    //    请求列表数据
    async loadPlainList(condition) {
      try {
        this.loading = true;
        let res = await getconfigPlanList(condition);
        // console.log(res);
        this.configInfomsg = res.result.productLibraryList;
        // console.log('数据信息:',this.configInfomsg);
        this.configInfomsg.forEach((item) => {
          // console.log(item.productName);
          this.data.push({
            key: item.productCode,
            label: item.productName,
            // disabled:this.i===0
          });
        });
        if (res["code"] === 0) {
          //   console.log('我是状态码0');
        } else {
          console.log("请求数据失败");
          //   this.$message.error('获取产品列表信息失败')
        }
      } catch (error) {
        this.loading = false;
        // this.$monitor.error(error, MODULE_PRODUCT, '获取产品列表信息异常')
      }
    },
    // 取消按钮
    cancel() {
        this.tempValue = this.value.map(item => item.productCode) ;
      this.$emit("change", false);
    },
    // 保存按钮
    saveProduct() {
        let datas = this.configInfomsg.filter(item => this.tempValue.includes(item.productCode)).map(({productCode,productName}) => {
            return {productCode,productName} ;
        });
        this.$emit("input" , datas) ;
        this.$emit("change", false);
    },
    // 右侧选中数组
rightcheckchange(){
    // console.log(888,arr,check);
},
  },
  mounted() {
    this.loadPlainList({
      // "isProductPlan": 1,
      page: this.page,
      perPage: this.perPage,
    });
  },
};
</script>

<style lang="scss">

.topInfo {
  font-size: 20px;
  margin: 30px 0;
}
.bigbox {
  width: 700px;
  height: 500px;
  background-color: #fff;
  position: relative;
  top: 200px;
  left: 470px;
  overflow: hidden;
}
.selectplan {
  display: flex;
  justify-content: space-between;

  span {
    flex: 1;
    margin: 10px 0px;
  }
}
.inputInfo {
  position: relative;
  margin-bottom: 15px;
  margin: 25px 0px;
  .findInfo {
    // background-color: red;
    position: relative;
    left: -140px;
  }
  .rest {
    // background-color: red;
    position: relative;
    left: -130px;
  }
}
.el-transfer-panel__item .el-checkbox__input {
  position: absolute;
  top: 8px;
  left: 10px;
}
.transfer-footer {
  margin-left: 20px;
  padding: 6px 5px;
}
.el-transfer-panel {
  width: 225px;
}
.el-transfer-panel__filter .el-input__inner {
  width: 90%;
}
.el-transfer-panel__filter {
  margin: 13px 0;
}
.product-edit-footer {
  margin: 45px 0px;
  button {
    margin: 0px 20px;
  }
}
</style>

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要使用 Element Transfer 实现 AJAX 请求数据和自定义查询,你需要进行以下步骤: 1. 使用 Element Transfer 组件,并在 data 定义左侧列表数据和右侧列表数据,如下所示: ``` <template> <el-transfer v-model="transferData" :data="transferData" :titles="['Source', 'Target']" :filterable="true" :filter-method="filterMethod" :format="format" ></el-transfer> </template> <script> export default { data() { return { transferData: { list: [], // 数据列表 total: 0, // 数据总数 loading: false, // 数据是否正在加载 }, }; }, methods: { // 自定义查询方法 filterMethod(query, item) { return item.label.indexOf(query) > -1; }, // 格式化列表项 format(item) { return item.label; }, }, }; </script> ``` 2. 在 mounted 生命周期调用 AJAX 请求,获取左侧列表的数据。在请求过程,可以使用 loading 属性控制加载状态。请求完成后,将数据赋值给 transferData.list,如下所示: ``` <template> <el-transfer v-model="transferData" :data="transferData" :titles="['Source', 'Target']" :filterable="true" :filter-method="filterMethod" :format="format" ></el-transfer> </template> <script> export default { data() { return { transferData: { list: [], // 数据列表 total: 0, // 数据总数 loading: false, // 数据是否正在加载 }, }; }, methods: { // 自定义查询方法 filterMethod(query, item) { return item.label.indexOf(query) > -1; }, // 格式化列表项 format(item) { return item.label; }, // AJAX 请求数据 async fetchData() { try { this.transferData.loading = true; const response = await axios.get('/api/data'); this.transferData.list = response.data; this.transferData.total = response.data.length; } catch (error) { console.error(error); } finally { this.transferData.loading = false; } }, }, mounted() { this.fetchData(); }, }; </script> ``` 3. 在 filterMethod ,使用查询参数来过滤左侧列表的数据。在这个例子,我们使用了 label 属性作为过滤字段。如果需要使用其他字段进行过滤,可以修改 filterMethod 方法的代码。 4. 在 format 方法,对列表项进行格式化。在这个例子,我们只是简单地返回了列表项的 label 属性,如果需要对列表项进行其他操作,可以修改 format 方法的代码。 至此,你已经成功地使用 Element Transfer 实现了 AJAX 请求数据和自定义查询。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值