vue3的滑块

前言

这是复制别人的代码,源码是vue2,然后我修改成VUE3的。

代码

<template>
  <div class="jc-component__range">
    <div class="jc-range" :class="rangeStatus?'success':''" >
      <i @mousedown="rangeMove" :class="rangeStatus?successIcon:startIcon"></i>
      {{rangeStatus?successText:startText}}
    </div>
  </div>
</template>
<script>
import {defineComponent, ref, watch} from "vue";
export default defineComponent({
  props: {
    //成功图标
    successIcon: {
      type: String,
      default: 'el-icon-success'
    },
    //成功文字
    successText: {
      type: String,
      default: '验证成功'
    },
    //开始的图标
    startIcon: {
      type: String,
      default: 'el-icon-d-arrow-right'
    },
    //开始的文字
    startText: {
      type: String,
      default: '拖动滑块到最右边'
    },
  },
  setup(prop,content) {
    //滑块移动
    const disX = ref(0)
    const rangeStatus = ref(false)
    const yuansu = ref(null)
    watch(rangeStatus,(newvalue,oldvalue)=>{
      if(!newvalue){
        console.log("触发监听")
        yuansu.value.style.transition = '.5s all';
        yuansu.value.style.transform = 'translateX(0)';
      }
    })
    function rangeMove(e){
      yuansu.value = e.target;
      let ele = e.target;
      let startX = e.clientX;
      let eleWidth = ele.offsetWidth;
      let parentWidth =  ele.parentElement.offsetWidth;
      let MaxX = parentWidth - eleWidth;
      if(rangeStatus.value){//不运行
        return false;
      }
      document.onmousemove = (e) => {
        let endX = e.clientX;
        disX.value = endX - startX;
        if(disX.value<=0){
          disX.value = 0;
        }
        if(disX.value>=MaxX-eleWidth){//减去滑块的宽度,体验效果更好
          disX.value = MaxX;
        }
        ele.style.transition = '.1s all';
        ele.style.transform = 'translateX('+disX.value+'px)';
        e.preventDefault();
      }
      document.onmouseup = ()=> {
        if(disX.value !== MaxX){
          ele.style.transition = '.5s all';
          ele.style.transform = 'translateX(0)';
        }else{
          //执行成功的函数
          rangeStatus.value = true
          content.emit("get")
        }
        document.onmousemove = null;
        document.onmouseup = null;
      }
    }
    return {
      rangeMove,
      disX,
      rangeStatus,
    }
  }
});
</script>
<style lang="scss" scoped>
@mixin jc-flex{
  display: flex;
  justify-content: center;
  align-items: center;
}
.jc-component__range{
  .jc-range{
    background-color: #FFCCCC;
    position: relative;
    transition: 1s all;
    user-select: none;
    color: #333;
    @include jc-flex;
    height: 45px; /*no*/
    &.success{
      background-color: #7AC23C;
      color: #fff;
      i{
        color: #7AC23C;
      }
    }
    i{
      position: absolute;
      left: 0;
      width: 60px;/*no*/
      height: 100%;
      color: #919191;
      background-color: #fff;
      border: 1px solid #bbb;
      cursor: pointer;
      @include jc-flex;
    }
  }
}
</style>

源码地址:忘了,擦。

### 实现 Vue3 滑块验证码 #### 安装依赖库 为了在项目中集成滑块验证码功能,需先通过 npm 安装 `vue3-puzzle-vcode` 插件[^1]。 ```bash npm install vue3-puzzle-vcode --save ``` #### 引入并注册插件 完成安装之后,在项目的入口文件或者需要使用的模块内引入该插件,并按照官方文档说明进行初始化配置: ```javascript import { createApp } from &#39;vue&#39;; import App from &#39;./App.vue&#39;; // 引入滑块验证码组件 import Vcode from "vue3-puzzle-vcode"; const app = createApp(App); app.use(Vcode); // 注册全局组件 app.mount(&#39;#app&#39;); ``` #### 创建父级容器组件 定义一个包含子组件 `<imgCheck>` 的父组件来处理事件回调逻辑。这里展示了如何设置属性以及监听来自子组件的成功与错误通知[^2]。 ```html <template> <!-- 使用自定义的 imgCheck 组件 --> <div class="container"> <imgCheck :top="60" @success="handleSuccess" @error="handleError"/> </div> </template> <script setup lang="ts"> import imgCheck from &#39;./components/imgCheck.vue&#39;; function handleSuccess() { alert(&#39;验证成功!&#39;); } function handleError() { console.error(&#39;验证失败&#39;); } </script> <style scoped> .container { /* 添加样式 */ } </style> ``` #### 后端交互准备 对于实际应用场景而言,通常还需要从前端向服务器请求获取最新的图形验证码数据。这一步骤涉及到前后端之间的通信协议设计,具体实现在于发送 HTTP 请求至指定 API 接口以取得必要的参数用于渲染页面上的图片素材[^3]。 ```javascript async function requestCaptchaData() { try { let response = await fetch(&#39;/api/captcha/generate&#39;, { method: &#39;GET&#39;, headers: new Headers({ &#39;Content-Type&#39;: &#39;application/json&#39; }) }); if (!response.ok) throw Error(response.statusText); return await response.json(); } catch (err) { console.warn(err.message || err); } } ``` 上述代码片段提供了一个完整的流程指南,帮助开发者快速搭建基于 Vue3 技术栈的滑块验证码解决方案。需要注意的是,具体的业务需求可能会有所不同,因此建议根据实际情况调整相应部分的功能细节。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值