当前位置:首页 > VUE

vue实现手势签到

2026-01-17 17:41:53VUE

Vue 实现手势签到的方案

手势签到功能通常涉及绘制签名并保存为图片或数据。以下是基于 Vue 的实现方法:

使用 canvas 绘制签名

安装依赖库 vue-signature-pad

npm install vue-signature-pad --save

在组件中引入并使用:

vue实现手势签到

<template>
  <div>
    <vue-signature-pad 
      ref="signaturePad" 
      :options="{ penColor: '#000' }"
    />
    <button @click="clear">清除</button>
    <button @click="save">保存</button>
  </div>
</template>

<script>
import VueSignaturePad from 'vue-signature-pad';

export default {
  components: { VueSignaturePad },
  methods: {
    clear() {
      this.$refs.signaturePad.clearSignature();
    },
    async save() {
      const { data } = await this.$refs.signaturePad.saveSignature();
      console.log(data); // 获取 base64 格式的签名图片
    }
  }
};
</script>

自定义 canvas 实现

手动实现 canvas 绘制逻辑:

<template>
  <div>
    <canvas 
      ref="canvas"
      @mousedown="startDrawing"
      @mousemove="draw"
      @mouseup="stopDrawing"
    ></canvas>
    <button @click="clearCanvas">清除</button>
    <button @click="saveCanvas">保存</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      isDrawing: false,
      canvas: null,
      ctx: null
    };
  },
  mounted() {
    this.canvas = this.$refs.canvas;
    this.ctx = this.canvas.getContext('2d');
    this.resizeCanvas();
  },
  methods: {
    resizeCanvas() {
      this.canvas.width = this.canvas.offsetWidth;
      this.canvas.height = this.canvas.offsetHeight;
    },
    startDrawing(e) {
      this.isDrawing = true;
      this.ctx.beginPath();
      this.ctx.moveTo(e.offsetX, e.offsetY);
    },
    draw(e) {
      if (!this.isDrawing) return;
      this.ctx.lineTo(e.offsetX, e.offsetY);
      this.ctx.stroke();
    },
    stopDrawing() {
      this.isDrawing = false;
    },
    clearCanvas() {
      this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);
    },
    saveCanvas() {
      const image = this.canvas.toDataURL('image/png');
      console.log(image); // 获取 base64 图片数据
    }
  }
};
</script>

移动端触摸支持

为移动端添加触摸事件处理:

vue实现手势签到

<template>
  <canvas 
    ref="canvas"
    @touchstart="handleTouchStart"
    @touchmove="handleTouchMove"
    @touchend="handleTouchEnd"
  ></canvas>
</template>

<script>
export default {
  methods: {
    handleTouchStart(e) {
      e.preventDefault();
      const touch = e.touches[0];
      const mouseEvent = new MouseEvent('mousedown', {
        clientX: touch.clientX,
        clientY: touch.clientY
      });
      this.$refs.canvas.dispatchEvent(mouseEvent);
    },
    handleTouchMove(e) {
      e.preventDefault();
      const touch = e.touches[0];
      const mouseEvent = new MouseEvent('mousemove', {
        clientX: touch.clientX,
        clientY: touch.clientY
      });
      this.$refs.canvas.dispatchEvent(mouseEvent);
    },
    handleTouchEnd() {
      const mouseEvent = new MouseEvent('mouseup');
      this.$refs.canvas.dispatchEvent(mouseEvent);
    }
  }
};
</script>

保存签名数据

将签名数据上传至服务器:

async uploadSignature(imageData) {
  try {
    const response = await axios.post('/api/signature', {
      image: imageData
    });
    console.log('上传成功', response.data);
  } catch (error) {
    console.error('上传失败', error);
  }
}

优化用户体验

添加样式和交互优化:

canvas {
  border: 1px solid #ddd;
  background-color: #f9f9f9;
  touch-action: none; /* 禁用默认触摸行为 */
}
button {
  margin-top: 10px;
  padding: 8px 16px;
  background: #42b983;
  color: white;
  border: none;
  border-radius: 4px;
}

通过以上方法,可以实现在 Vue 中完整的手势签到功能,支持 PC 和移动端,并能保存签名数据。

标签: 手势vue
分享给朋友:

相关文章

vue实现流程

vue实现流程

Vue 实现流程的基本步骤 安装 Vue.js 可以通过 CDN 引入或使用 npm/yarn 安装。 CDN 方式: <script src="https://cdn.jsdelivr.…

jq 实现 vue

jq 实现 vue

jq 实现 Vue 的核心功能 jq 是一个轻量级的 JavaScript 库,主要用于 DOM 操作和事件处理。虽然它不能完全替代 Vue,但可以通过一些技巧模拟 Vue 的核心功能,如数据绑定、事…

vue实现同步

vue实现同步

Vue 实现同步的方法 在 Vue 中实现同步操作通常涉及数据绑定、状态管理和异步操作的处理。以下是几种常见的方法: 使用计算属性(Computed Properties) 计算属性基于响应式依赖进…

vue实现频道

vue实现频道

Vue实现频道功能的方法 使用Vue Router动态路由 通过Vue Router的动态路由功能可以轻松实现频道切换。在路由配置中定义动态参数,组件内通过this.$route.params获取当前…

vue实现datalist

vue实现datalist

使用 Vue 实现 HTML5 的 datalist 功能 HTML5 的 <datalist> 元素提供了一种自动完成输入框的功能,允许用户在输入时从预定义的选项列表中选择。以下是几种在…

vue 实现折叠

vue 实现折叠

Vue 实现折叠功能的方法 在 Vue 中实现折叠功能可以通过多种方式完成,以下是几种常见的实现方法: 使用 v-if 或 v-show 控制显示隐藏 通过绑定一个布尔值变量,结合 v-if 或 v…