首页 > 编程语言 >【微信小程序-组件】仪表盘样式的滑动组件(不卡顿)

【微信小程序-组件】仪表盘样式的滑动组件(不卡顿)

时间:2023-09-08 12:24:59浏览次数:48  
标签:val default 微信 valueForLabel value stepScale 不卡顿 组件 type

滑动组件,选中后手机会振动

 

<template>
    <view class="gear-select">
        <view class="scale-mark-container">
            <view class="every-scale-mark" v-for="(gear, index) of gearList" :key="gear.num">
                <view class="scale-line"></view>
                <view class="scale-text">{{ gear.num + ((index === 0 || index === gearList.length - 1) ? unit : '') }}</view>
            </view>
        </view>
        <view class="new-slider-component">
            <label :style="{ left: `calc(${style} - 12px)` }">{{ valueForLabel }}</label>
            <view class="combine-mine_slider-and-u_slider">
                <view class="show-slider">
                    <view class="back-track">
                        <view class="front-track" :style="{width: `${style}`}"></view>
                        <view class="slider-block" :style="{left: `calc(${style} - 12px)`}">
                            <view class="silder-block_center"></view>
                        </view>
                    </view>
                </view>
                <u-slider
                    v-model="valueForSlider"
                    :min="gearMinForSlider"
                    :max="gearMaxForSlider"
                    height="20"
                    block-size="32"
                    blockColor="#161514"
                    :step="stepScale"
                    :blockStyle="{border: '8rpx solid #fff5de'}"
                    @changing="sliderChange"
					@change="moveEnd"
                />
            </view>
        </view>
    </view>
</template>

  

<script>
export default {
    name: "GearSelect",

    props: {
        gearList: { // 组件刻度背景(即虚线下方的文字集合)
            type: Array,
            default: () => []
        },
        unit: {
            type: String,
            default: ''
        },
        value: {
            type: Number,
            default: 0
        },
        gearMin: {
            type: Number,
            default: 0
        },
        gearMax: {
            type: Number,
            default: 0
        },
        sliderStep: {
            type: Number,
            default: 1
        },
        sliderBase: {
            type: Number,
            default: 0
        },
		labelIsNum: { // 滑动组件上方显示的标签是否为数字
			type: Boolean,
			default: true
		}
    },

    data() {
        return {
            valueForSlider: 0,
            gearMinForSlider: 0,
            gearMaxForSlider: 0,
            stepScale: 5,
            valueForLabel: 0,
        }
    },

    watch: {
        value(val) {
			console.log('value')
			console.log(val)
            this.valueForSlider = val * this.stepScale
        },
        gearMin(val) {
          this.gearMinForSlider = val * this.stepScale
        },
        gearMax(val) {
            this.gearMaxForSlider = val * this.stepScale
        },
    },

    computed: {
        style() {
            return `${((this.valueForSlider - this.gearMinForSlider) / (this.gearMaxForSlider - this.gearMinForSlider)) * 100}%`
        }
    },

    created() {
        this.valueForSlider = this.value * this.stepScale
        this.gearMinForSlider = this.gearMin * this.stepScale
        this.gearMaxForSlider = this.gearMax * this.stepScale
        this.sliderChange(this.valueForSlider)
    },

    methods: {
        sliderChange(val) {
            let value = val / this.stepScale
			let label = value * this.sliderStep + this.sliderBase
			if (this.labelIsNum) {
				this.valueForLabel = label + this.unit
			} else {
				let index = value / this.sliderStep
				this.valueForLabel = this.gearList[index].num
			}
            this.$emit('input', value)
        },
		
		moveEnd(val) {
			let value = val / this.stepScale
			let label = value * this.sliderStep + this.sliderBase
			if (this.labelIsNum) {
				this.valueForLabel = label + this.unit
			} else {
				let index = value / this.sliderStep
				this.valueForLabel = this.gearList[index].num
			}
			this.$emit('valueChange', value)
			this.$emit('labelChange', this.valueForLabel)
		}
    }
}
</script>

  

关键代码已贴出,css代码可以私聊我

  

标签:val,default,微信,valueForLabel,value,stepScale,不卡顿,组件,type
From: https://www.cnblogs.com/abby-lrwei/p/17687246.html

相关文章

  • springboot实现 伪微信登录
    众所周知,微信扫码登陆的功能,个人网站是无法申请的,我们想在本地测一下微信登录也是无法实现。要实现微信登录,首先你得是一个企业单位,有公章才能申请,申请还要花费300块大洋。如果我们只是想学习和体验一下微信登录,可以自己本地搭建个微型服务模拟一下,过一把瘾也是可以的。如果你是企......
  • 界面控件DevExpress WinForms工具栏菜单组件,模拟流行办公软件!
    DevExpressWinForms的工具栏和菜单组件灵感来自于MicrosoftOffice,并针对WinForms开发人员进行了优化,可以帮助开发者快速模拟当下流行的办公软件应用程序。DevExpressWinForms有180+组件和UI库,能为WindowsForms平台创建具有影响力的业务解决方案。同时能完美构建流畅、美观且......
  • vue组件级别的权限控制
    核心思想:尽量减少对组件的侵入性,也就是权限控制的代码剔除出来实现authority.vue<template><div>//将用户权限通过作用域插槽传递出去<slotv-if="showSlot":permissions="rights"></slot></div></template><scriptsetuplang="ts&......
  • VueJS 处理表单组件上 api 调用的错误
    问题出在可组合项中对errors的处理上。在register函数中,你将errors重新赋值为空对象{},而应该将其赋值给errors.value来保持响应式。修改useAuth可组合项的代码如下:exportdefaultfunctionuseAuth(){leterrors=ref({});constregister=(request)=>{errors.val......
  • 父组件可以监听到子组件的生命周期吗?
    在Vue中,父组件是可以监听到子组件的生命周期的。Vue提供了一些特殊的钩子函数,可以在父组件中监听子组件的生命周期事件。以下是一些常用的方法来监听子组件的生命周期:#####1:使用$emit:在子组件的生命周期钩子函数中,使用$emit方法触发自定义事件,向父组件发送通知。在父组件中,使......
  • 在 Vue 中,子组件如何向父组件传递数据?
    在Vue中,子组件向父组件传递数据可以通过自定义事件来实现。下面是一种常见的方法:在子组件中,使用$emit方法触发一个自定义事件,并传递要传递给父组件的数据作为参数。<template><button@click="sendDataToParent">传递数据给父组件</button></template><script>exportde......
  • Vue 拖拽组件(Draggable)
    简介及使用教程Vue拖拽组件(Draggable)是一个允许与View-Model同步进行拖放排序的Vue组件。这是基于Sortable.js并提供它的所有功能。特点完全支持Sortable.js特性:支持触摸设备支持拖动句柄和可选择的文本智能自动滚动支持在不同列表之间拖放,没有jQuery依赖项保持......
  • 【Jetpack】Navigation 导航组件 ⑤ ( NavigationUI 类使用 )
    文章目录一、NavigationUI类简介二、NavigationUI类使用流程1、创建Fragment2、创建NavigationGraph3、Activity导入NavHostFragment4、创建菜单5、Activity界面开发NavigationUI的主要逻辑(重点)a、添加Fragment布局b、处理Navigation导航逻辑(重点)c、启用菜......
  • Vue2 中每个组件实例都对应一个 watcher 实例? .
    Vue2中每个组件实例对应一个渲染Watcher实例,用于监听组件的响应式数据变化并更新视图。除了渲染Watcher,还可以通过watch属性来创建额外的Watcher实例,用于监听特定的数据变化。在Vue2中,每个组件实例都有一个$watch方法,可以用于创建Watcher实例。......
  • 百度上传下载组件视频
    ​ IE的自带下载功能中没有断点续传功能,要实现断点续传功能,需要用到HTTP协议中鲜为人知的几个响应头和请求头。 一. 两个必要响应头Accept-Ranges、ETag        客户端每次提交下载请求时,服务端都要添加这两个响应头,以保证客户端和服务端将此下载识别为可以断点续......