当前位置: 首页 > article >正文

手写WBXslider 组件 (标签为微博小程序,需要改成对应的标签,或方法)

引入自己封装的组件

    <WBXslider style="width: 200px;margin-left: 20px;" 
    :value="30" 
    :radiusNum="20"
     @moveChange="move" >
     <template slot="round">
      <wbx-view style="width: 10px;height:20px;background-color: rebeccapurple;"></wbx-view>
     </template>
    </WBXslider>

组件内部 wbxslider组件也是自定义的,需要请看我主页关于wbxslider的文章

有默认模式,也可以使用插槽模式自定义

<template>
    <wbx-view ref="styleObj" >
      <wbx-view  style="display: flex;flex-direction: row;align-items: center;" :style="{height:computedHeight+'px'}">
        <wbxslider ref="slider" :radiusNum="radiusNum" :style="{color:progressColor}" :progressHeight="progressHeight" :videoProgressWidth="videoProgressWidth" :progressColor="progressColor" :ProgressWidth="moveDistanceNum" :progressBackgroundColor="progressBackgroundColor"></wbxslider>
        <wbx-view  :style="{left: moveDistanceNum+'px',position: 'absolute'}" @touchmove="handleTouchMove"@touchstart~stop="a()">
          <wbx-view v-if="isUseRoundSlot" ref="roundSlot">
            <slot name="round" ></slot>
          </wbx-view> 
          <wbx-view v-else
            :style="{ height: roundSize + 'px', width:roundSize + 'px', borderRadius:roundSize + 'px',backgroundColor:roundColor }"
            style="border: 1px solid #808080;">
          </wbx-view>
        </wbx-view> 
      </wbx-view>
      <!-- <wbx-view v-if="showValue">{{ value }}</wbx-view> -->
    </wbx-view>
  </template>
  
  <script>
  /**
   * 用法<WBXslider style="margin-left: 30px;width: 300px;"></WBXslider>
   * @moveChange() 拖动过程中触发的事件,
   * slot="round"   插槽用来自定义滑块的样式 
   * progressHeight 进度条高度
   * roundSize  圆圈的大小
   * roundColor 圆圈的颜色
   * progressColor 进度条的选中颜色
   * progressBackgroundColor 进度条未选中的颜色
   * step  步长
   * value  当前取值
   * disabled  是否禁用
   * max  最大值
   * 
   * @type WBXAppOption
   */
  import wbxslider from "./wbxslider.vue";
  const pageOptions = {
    data() {
      return {
        roundSize:0,//圆的大小
        moveDistanceNum:0,//移动距离
        percent:0,
        marginLeftNum:0,//左边距
        videoProgressWidth:0,//进度条宽
        percentValue:0,//展示的值百分比
        roundHeightSize:0 //插槽高
      };
    },
    props: {
      roundSize: {
      type: Number,
      default: 15,
    },
    progressHeight:{
      type: Number,
      default: 5,
    },
    roundColor:{
      type:String,
        default:'#fff'
    },
    value:{
      type: Number,
      default: 0,
    },
    disabled:{
      type: Boolean,
      default: false,
    },
    max:{
      type: Number,
      default: 100,
    },
    radiusNum:{
      type: Number,
      default: 0,
    },
    progressBackgroundColor:{
      type:String,
      default:'#e6e6e6'
    },
    progressColor:{
      type:String,
      default:'#bfbfbf'
    },
    step:{
      type: Number,
      default: 0,
    }
  },
    mounted() {   
      this.$nextTick(() => {
        this.progressStyleObject = this.$refs.styleObj.styleObject;
        // console.log(this.progressStyleObject ,"this.$refs.styleObj33333333333333")
        this.videoProgressWidth=parseFloat(this.progressStyleObject.width)?parseFloat(this.progressStyleObject.width):300
        this.marginLeftNum=parseFloat(this.progressStyleObject.marginLeft)?parseFloat(this.progressStyleObject.marginLeft):0
        if(this.value>0){
            this.moveDistanceNum=((this.videoProgressWidth-this.roundSize)/this.max)*this.value
          }
        if(this.isUseRoundSlot){
            this.roundHeightSize=parseFloat(this.$refs.roundSlot.childNodes[0].styleObject.height)
            this.roundSize=parseFloat(this.$refs.roundSlot.childNodes[0].styleObject.width)
          }
    });
  },
    components: {
      wbxslider
    },
    computed: {
      // 是否使用插槽
      isUseRoundSlot() {
        console.log(11111111,!!this.$slots.round)
      return !!this.$slots.round;
    },
    computedHeight() {
      return  this.isUseRoundSlot?this.roundHeightSize:this.roundSize
    }
  },
    methods: {
      a(){},
      handleTouchMove(e) {
        if(this.disabled==true){
          return
        }
      let minx = e.touches[0].clientX-this.marginLeftNum;
      if (minx >= this.videoProgressWidth-this.roundSize) {
        this.percent = this.videoProgressWidth-this.roundSize;
      } else if (minx <= 0) {
        this.percent = 0;
      } else {
        this.percent = minx;
      }
      if(this.step>0){
        this.percentValue =parseInt(this.percent/((this.videoProgressWidth-this.roundSize)/this.max))
        if(this.percentValue%this.step==0){
          this.moveDistanceNum=this.percentValue*((this.videoProgressWidth-this.roundSize)/this.max)
          this.percentValue =this.moveDistanceNum/((this.videoProgressWidth-this.roundSize)/this.max)
          this.$emit('moveChange',{value:this.percentValue})

        }
      }else{
        this.moveDistanceNum = this.percent;
        this.percentValue =this.moveDistanceNum/((this.videoProgressWidth-this.roundSize)/this.max)
        this.$emit('moveChange',{value:this.percentValue})

      }
      
    },},
    wbox: {
      onLoad() { 
      },
      onShow() {
        // 页面显示/切入前台时触发
      },
      onHide() {
        // 页面隐藏时触发
      },
      onUnload() {
        // 页面退出时触发
      },
    },
  };
  export default pageOptions;
  </script>
  
  <style></style>
  

http://www.kler.cn/a/321767.html

相关文章:

  • 跟我学C++中级篇——Design Patterns的通俗说法
  • vue3: ref, reactive, readonly, shallowReactive
  • 数据结构小项目
  • 使用热冻结数据层生命周期优化在 Elastic Cloud 中存储日志的成本
  • 【Linux】Linux 权限的理解
  • Redis知识点整理 - 脑图
  • 80%的程序员当不了架构师?那考软考作用在哪?
  • AI驱动TDSQL-C Serverless 数据库技术实战营-融合智能体与TDSQL-C技术,高效实现二手房数据查询与分析应用
  • python中ocr图片文字识别样例(一)
  • 5. 高阶函数
  • 使用Postman搞定各种接口token实战
  • 3ds Max建模方式介绍
  • AOT源码解析4.5-AOT整体结构
  • UE学习篇ContentExample解读-----------Blueprint_Mouse_Interaction
  • postman发送与返回,GET与POST使用
  • 【架构】NewSQL
  • 初识C#(三)- 数组
  • 实战篇 | Homebrew 安装使用(Ubuntu 完整实操版)
  • Vue2配置环境变量的注意事项
  • SpringCloud Gateway 打印请求响应日志、跨域全局配置
  • LASSO回归(L1回归L1正则化)举例说明:正则化项使不重要的特征系数逐渐为零0的过程
  • 住宅ip有什么特殊点
  • 移动技术开发:HandlerAsyncTask
  • Java Stream流编程入门
  • CMMI认证的好处主要体现在以下这些方面
  • MYSQL SWAP 内存 vm.swappiness