Element UI slider 输入框控制范围滑块

问题:输入框控制slider范围滑块不生效

遇到一个需求,涉及到for循环展示slider,且每一个slider支持手输值控制滑块展示。一开始的实现是这样的:

		<div
            v-for="(item, index) in dataList"
            :key="index"
          >
            <el-input-number
              v-model="item.value[0]"
              :controls="false"
              size="small"
              class="num"
            />
            <el-slider
              v-model="item.value"
              :min="item.min"
              :max="item.max"
              range
              show-tooltip
              class="slider"
            />
            <el-input-number
              v-model="item.value[1]"
              :controls="false"
              size="small"
              class="num"
            />
            <div
              class="delete-btn"
              @click="handleDelete(item)">删除</div>
         </div>

手动去拖动slider滑块,input框的值确实改变了,但是反过来,去改变input框里的值,slider却没有变化。把slider的值打印出来,发现值变了,但是视图没有更新。网上看了很多种解决方法:

通过v-if使slider视图更新

缺点:会造成画面闪动

通过计算属性使视图更新

缺点:对于这种for循环展示的数据不是很好实现

通过更新组件key使视图更新

一开始觉得对于这种存在节点更新or删除的情形不是很好实现。后来想了一下,或许可以使用symbol实现,但没有尝试。

(推荐)通过调用setValues方法使视图更新

setValues这个方法是看slider源码了解到的,调用之后确实更新了视图,而且实现起来代码改动相对较小,如下所示:

		<div
            v-for="(item, index) in dataList"
            :key="index"
          >
          	<!-- input框change时调用sliderUpdate方法,传入slider的index值 -->
            <el-input-number
              v-model="item.value[0]"
              :controls="false"
              size="small"
              class="num"
              @change="sliderUpdate(index)"
            />
            <!-- 声明slider的ref值。由于是for循环数据,传入index值用于slider索引 -->
            <el-slider
              v-model="item.value"
              :min="item.min"
              :max="item.max"
              :ref="`slider` + index"
              range
              show-tooltip
              class="slider"
            />
            <el-input-number
              v-model="item.value[1]"
              :controls="false"
              size="small"
              class="num"
              @change="sliderUpdate(index)"
            />
            <div
              class="delete-btn"
              @click="handleDelete(item)">删除</div>
         </div>
methods: {
	sliderUpdate(index) {
		// 调用setValues方法更新视图
      this.$refs['slider' + index][0].setValues();
    }
}

网上搜了一下,好像没有看到有人分享这个解决方法,于是决定简单记录一下……

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值