vue+element,让下拉框选择渲染数据变得更加简单

前言

vue 作为一款优秀的前端框架,被越来越多的开发者所熟知和应用。而基于 element 实现根据下拉框选择渲染不同数据的功能,更是 vue 框架的一个重要应用场景。本文将带您深入了解这一功能的实现原理和代码实现,让你在开发过程中能够更加得心应手,同时也能够为更多的开发者提供帮助和借鉴。


需求

后台只提供一个接口,其中包含下拉框的数据和列表的数据,要求实现根据下拉框的选择渲染不同的列表数据。


实现效果:

在这里插入图片描述


实现思路

  1. 既然是同一个接口,那么下拉框的数据就是从 list 中拿取其中的某些字段,我们需要做的是将返回的 list 循环遍历取其值将其 return 出去赋值给下拉框的数组;
  2. 第一次进入页面的时候可以给它一个默认展示的列表数据和下拉框中的默认赋值;
  3. 下拉框绑定 change 事件,当我们选择某一项时,循环遍历初始的 list 数组,判断我们选中项的 value 与遍历 list 数组中拿取的那个字段是否相等,若相等,将 list 数据动态赋值给列表绑定的对象。

话不多说,下面直接看代码实例


完整源码

html

<template>
  <div class="outerBox">
    <el-card class="box-card">
      <div class="selectBox">
        <div>编号:</div>
        <el-select v-model="dzbhModel" @change="choiceOn">
          <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value">
          </el-option>
        </el-select>
      </div>
      <div class="descriptionsBox">
        <el-descriptions class="margin-top" :column="1" size="medium" border>
          <el-descriptions-item>
            <template slot="label">名称</template>
            <span>{{particularsDAta.name}}</span>
          </el-descriptions-item>
          <el-descriptions-item>
            <template slot="label">编号</template>
            <span>{{particularsDAta.dzbh}}</span>
          </el-descriptions-item>
          <el-descriptions-item>
            <template slot="label">经度</template>
            <span>{{particularsDAta.latitude}}</span>
          </el-descriptions-item>
          <el-descriptions-item>
            <template slot="label">维度</template>
            <span>{{particularsDAta.longitude}}</span>
          </el-descriptions-item>
          <el-descriptions-item>
            <template slot="label">质量</template>
            <span>{{particularsDAta.jgds}}</span>
          </el-descriptions-item>
        </el-descriptions>
      </div>
    </el-card>
  </div>
</template>

js

<script>
export default {
  data() {
    return {
      // 模拟数据
      dataList: [
        {
          name: "测试一",
          dzbh: "01202205",
          latitude: "142.84",
          longitude: "23.745",
          jgds: "178575.32",
        },
        {
          name: "测试二",
          dzbh: "01202206",
          latitude: "125.326",
          longitude: "33.56",
          jgds: "412412.25",
        },
        {
          name: "测试三",
          dzbh: "01202207",
          latitude: "132.454",
          longitude: "26.74",
          jgds: "421535.98",
        },
      ],
      dzbhModel: "", //下拉框绑定的model
      options: [], //下拉框数据
      particularsDAta: {}, //展示的数据
    };
  },
  mounted() {
    this.portData(); //模拟调用接口
  },
  methods: {
    // change事件匹配对应数据
    choiceOn(value) {
      let idx = "";
      this.dataList.map((item, index) => {
        if (item.dzbh == value) {
          idx = index;
        }
      });
      this.particularsDAta = this.dataList[idx];
    },
    // 模拟接口
    portData() {
      // 循环取下拉框的数据
      this.options = this.dataList.map((item) => {
        return { value: item.dzbh, label: item.dzbh };
      });
      // 默认展示数据和下拉框中的默认赋值
      this.particularsDAta = this.dataList[0];
      this.dzbhModel = this.dataList[0].dzbh;
    },
  },
};
</script>

style

<style scoped>
.outerBox {
  width: 30%;
}
.selectBox {
  display: flex;
  align-items: center;
  margin-bottom: 20px;
}
.selectBox div:first-child {
  font-weight: bold;
}
::v-deep .el-descriptions--medium.is-bordered .el-descriptions-item__cell {
  width: 50%;
  text-align: center;
}
</style>
  • 8
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
这是一个基于VueElement组件库的虚拟列表下拉框实现。在这个下拉框中,当列表项数量非常多时,只会渲染可视区域的部分,从而提高性能。 ```html <template> <el-select v-model="selected" placeholder="请选择" filterable remote :remote-method="loadOptions"> <template v-slot:default> <el-option v-for="item in visibleOptions" :key="item.value" :label="item.label" :value="item.value"></el-option> <el-option v-if="isLastPage" :key="'loading'" :label="'加载中...'" disabled></el-option> </template> </el-select> </template> <script> export default { data() { return { options: [], // 所有选项 visibleOptions: [], // 可见选项 selected: undefined, // 当前选中的值 pageSize: 10, // 每页显示的选项数量 currentPage: 1, // 当前页码 isLastPage: false // 是否已经加载完所有选项 }; }, methods: { async loadOptions(query) { // 模拟异步加载数据 await new Promise(resolve => setTimeout(resolve, 1000)); // 这里可以根据query参数从服务器获取数据 const data = Array.from({ length: 10000 }, (_, i) => ({ label: `选项${i + 1}`, value: i + 1 })); // 如果没有更多数据了,则标记为最后一页 if (data.length < this.pageSize) { this.isLastPage = true; } // 将新数据合并到原有数据中 this.options = this.options.concat(data); // 更新可见选项 this.updateVisibleOptions(query); }, updateVisibleOptions(query) { const start = (this.currentPage - 1) * this.pageSize; const end = start + this.pageSize; this.visibleOptions = this.options.slice(start, end); // 如果没有匹配的选项,则跳转到第一页 if (query && this.visibleOptions.every(item => !item.label.includes(query))) { this.currentPage = 1; this.updateVisibleOptions(query); } } }, watch: { currentPage() { // 每次切换页码时更新可见选项 this.updateVisibleOptions(); } } }; </script> ``` 在这个实现中,我们使用了`el-select`组件来实现下拉框,设置了`filterable`和`remote`属性来启用搜索和异步加载功能。每当用户输入查询关键字时,`loadOptions`方法就会被调用,该方法会模拟异步加载数据,并将新数据合并到`options`列表中。同时,根据当前页码和每页显示的选项数量,计算出可见选项的范围,并将其赋值给`visibleOptions`属性。如果没有匹配的选项,则跳转到第一页。如果已经加载完所有选项,则将`isLastPage`属性标记为`true`,以便在可见选项列表中显示“加载中...”的提示。用户每次滚动列表时,会触发`loadOptions`方法,从而实现虚拟滚动的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水星记_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值