elementUI_select_渲染小现象

本文探讨了在Vue.js中使用el-select组件时遇到的问题:当数据源切换时,已选择的选项无法正确回显。通过案例分析了key值设置为元素value和索引时的不同行为,解释了DOM更新时key值影响组件复用的原理,并展示了两种情况下的实际效果。解决此问题对于优化用户界面和提高应用性能至关重要。
摘要由CSDN通过智能技术生成

需求描述
  • select下拉框列表中的数据是通过后端接口返回的;
  • 由于数据量过大,因此拉去500条数据(非全量),其余数据通过模糊搜索获取;
  • 当下拉框关闭时–清空关键字,重新获取下拉列表;
问题
  • 通过模糊搜索获取500条以外的数据—选择;
  • 当下拉框关闭时,重新获取列表,列表中不包含该条选中的数据,但是依旧能够显示选择的元素文本而非id;
通过以下案例复现

下拉框默认选中人员1,当点击change按钮时,下拉框列表会改变(选中值不变);

key值为元素value
  • <template>
      <div style="margin-top:20px">
        <el-select v-model="value" placeholder="请选择">
        <el-option
          v-for="item in dataList"
          :key="item.value"
          :label="item.label"
          :value="item.value">
        </el-option>
      </el-select>
      <el-button @click='listChenge' size='mini'>change</el-button>
      </div>
    </template>
    
    <script>
    export default {
      data(){
        return{
          listObj:{
            1:[
              {label:'人员1', value:111},
              {label:'人员2', value:222},
              {label:'人员3', value:333}
            ],
            2:[
              {label:'人员4', value:444},
              {label:'人员5', value:555},
              {label:'人员6', value:666}
            ],
            3:[
              {label:'人员7', value:777},
              {label:'人员8', value:888},
              {label:'人员9', value:999}
            ],
          },
          index:1,
          dataList:[],
          value:111
        }
      },
      created(){
        this.listChenge()
      },
      methods:{
        listChenge(){
          this.index = this.index<=3 ? this.index : 1
          this.dataList = this.listObj[this.index]
          this.index++
        }
      }
    }
    </script>
    
    
  • 过程

    • [1]默认选择人选1 ,下拉框列表为listObj的第一个元素列表;

      • 在这里插入图片描述
    • [2]点击change按钮,下拉框列表改变,但是选中值依旧能正常回显

      • 在这里插入图片描述
key值为索引
  • <template>
      <div style="margin-top:20px">
        <el-select v-model="value" placeholder="请选择">
        <el-option
          v-for="(item,index) in dataList"
          :key="index"
          :label="item.label"
          :value="item.value">
        </el-option>
      </el-select>
      <el-button @click='listChenge' size='mini'>change</el-button>
      </div>
    </template>
    
  • 过程

    • [1]默认选择人选1 ,下拉框列表为listObj的第一个元素列表;

      • 在这里插入图片描述
    • [2]点击change按钮,下拉框列表改变,但是选中值不能正常回显,回显值为value而非label

      • 在这里插入图片描述
原因
  • 当dom更新时,key值为value时
    • [1]进行path,通过sameVnode方法进行比较会被判断为同一元素;
    • [2]pathVnode比较 oldVnode==vnode,直接复用;
    • 因此没有重新渲染
  • 当dom更新时,key值为index时
    • 进行path,由于key值不相同,sameVnode方法进行比较会被判断为非同一元素,直接替换;
    • 渲染真实dom进行更新
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值