VUE3+ts实现滑块验证

VUE3+ts实现滑块验证

示例(图):
在这里插入图片描述

需求

账号密码输入完成点击登录时需要把滑块拖到最右边完成验证才可以登录
在这里插入图片描述

在这里插入图片描述

实现思路

1.设置 可以拖动的区域
2.设置 拖动的滑块
3.使用mousedown方法进行获取鼠标事件
4.计算出滑块滑动比例
5.滑动到最右边 提示验证成功

代码

<div class="huakuia">
      <div ref="dragDiv" class="drag" v-if="!data.confirmSuccess">
        <!-- 拖动区域 -->
        <div class="handler" :style="{ left: dragLeft + 'px' }" @mousedown="mousedownFn">>></div>
        <!-- 拖动背景 -->
        <div class="drag_bg" :style="{ width: dragLeft + 'px' }"></div>
        <div class="drag_text" :style="{ color: confirmColor }">
          {{ confirmWords }}
        </div>
      </div>
    </div>
    <div class="drag_text" v-if="data.confirmSuccess">验证通过</div>
// 滑块验证
import { ref, reactive, onMounted, onUnmounted } from "vue";

const dragDiv = ref({ clientWidth: "" as any });
console.log(dragDiv);
const moveDiv = ref({ clientWidth: "" as any });
console.log(moveDiv);

let data = reactive({
  beginClientX: 0,
  mouseMoveState: false,
  maxwidth: 0,
  confirmWords: "拖动滑块验证",
  confirmSuccess: false
});
function mousedownFn(e: MouseEvent) {
  if (!data.confirmSuccess) {
    e.preventDefault && e.preventDefault();
    data.mouseMoveState = true;
    data.beginClientX = e.clientX;
  }
}
function successFunction() {
  data.confirmSuccess = true;
  data.confirmWords = "验证通过";

  document.getElementsByTagName("html")[0].removeEventListener("mousemove", mouseMoveFn);
  document.getElementsByTagName("html")[0].removeEventListener("mouseup", mouseUpFn);
}

function mouseMoveFn(e: MouseEvent) {
  if (data.mouseMoveState) {
    const width = e.clientX - data.beginClientX;
    console.log(width, data.maxwidth);
    if (width > 0 && width <= data.maxwidth) {
      document.getElementsByClassName("handler")[0].style.left = width + "px";
      document.getElementsByClassName("drag_bg")[0].style.width = width + "px";
    } else if (width > data.maxwidth) {
      successFunction();
    }
  }
}

function mouseUpFn(e: MouseEvent) {
  data.mouseMoveState = false;
  const width = e.clientX - data.beginClientX;
  if (width < data.maxwidth) {
    document.getElementsByClassName("handler")[0].style.left = "0px";
    document.getElementsByClassName("drag_bg")[0].style.width = "0px";
  }
}

onMounted(() => {
  data.maxwidth = dragDiv.value.clientWidth - moveDiv.value.clientWidth - 40;
  if (data.maxwidth <= 0) {
    data.maxwidth = 2;
  }
  document.getElementsByTagName("html")[0].addEventListener("mousemove", mouseMoveFn);
  document.getElementsByTagName("html")[0].addEventListener("mouseup", mouseUpFn);
});

onUnmounted(() => {
  document.getElementsByTagName("html")[0].removeEventListener("mousemove", mouseMoveFn);
  document.getElementsByTagName("html")[0].removeEventListener("mouseup", mouseUpFn);
});
const dragLeft = data.confirmSuccess ? data.maxwidth : 2;

const confirmColor = data.confirmSuccess ? "#fff" : "";
let confirmWords = data.confirmWords;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在Vue 3和TypeScript中实现单个删除功能,你可以按照以下步骤进行操作: 1. 首先,确保你已经安装了VueVue Router,并且在项目中引入了它们。 2. 在你的页面组件中,创建一个方法来处理删除操作。该方法将接收一个唯一的标识符(例如ID)作为参数,并根据该标识符执行删除操作。你可以使用`splice`方法从数组中删除指定位置的元素。 3. 在模板中,为每个需要删除的元素添加一个按钮或链接,并将删除方法与该按钮或链接的点击事件绑定。使用`:key`属性来确保每个元素都有唯一的标识符。 4. 在组件的计算属性中,获取要显示的数据列表。这可以是从API获取的数据,也可以是在组件中定义的静态数组。 下面是一个示例代码,展示了如何在Vue 3和TypeScript中实现单个删除功能: ```vue <template> <div> <h2>List Page</h2> <ul> <li v-for="item in items" :key="item.id"> {{ item.name }} <button @click="deleteItem(item.id)">Delete</button> </li> </ul> </div> </template> <script lang="ts"> import { defineComponent } from 'vue'; export default defineComponent({ data() { return { items: [ { id: 1, name: 'Item 1' }, { id: 2, name: 'Item 2' }, { id: 3, name: 'Item 3' }, ], }; }, methods: { deleteItem(id: number) { const index = this.items.findIndex((item) => item.id === id); if (index !== -1) { this.items.splice(index, 1); } }, }, }); </script> ``` 在上面的示例中,我们假设`items`是从API获取的数据列表,每个项目都有一个唯一的`id`。我们使用`v-for`指令将每个项目渲染为`li`元素,并为每个项目添加一个“Delete”按钮。当点击按钮时,将调用`deleteItem`方法,并传递项目的`id`作为参数。在`deleteItem`方法中,我们使用`splice`方法从`items`数组中删除具有匹配`id`的项目。 请注意,这只是一个简单的示例,用于说明如何在Vue 3和TypeScript中实现单个删除功能。具体实现方式可能因你的项目需求而有所不同。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [利用vue3+ts实现管理后台(增删改查)](https://blog.csdn.net/u013060778/article/details/120977211)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值