vue-signature-pad pc电子签名
- 实例

- 下载依赖
npm install --save vue-signature-pad@2.0.5
npm install --save vue-signature-pad
import { createApp } from 'vue'
const app = createApp(App)
import { VueSignaturePad } from 'vue-signature-pad';
app.component("VueSignaturePad", VueSignaturePad);
<template>
<div>
<el-space class="mb10" size="large">
<div>
<el-text>画笔粗细</el-text>
<el-input-number v-model="state.size" :min="2" :max="10" :step="1" @change="onChange" />
</div>
<div>
<el-text>画笔颜色</el-text>
<el-color-picker v-model="state.color" color-format="hex" @change="onChange"> </el-color-picker>
</div>
</el-space>
<VueSignaturePad v-if="show1" class="line" ref="signaturePad" :options="signOptions" :images="images" :customStyle="customStyle"
width="100%" height="200px" />
<el-space class="mt10">
<el-button @click="unDoSign">撤销</el-button>
<el-button @click="clearSign">清屏</el-button>
<el-button type="primary" @click="saveUploadSign">保存下载</el-button>
</el-space>
</div>
</template>
<script setup>
import { nextTick, ref, watch } from "vue";
const signaturePad = ref();
const show1 = ref(false)
nextTick(() => { show1.value = true })
const signOptions = ref({
minWidth: 2,
maxWidth: 5,
throttle: 5,
minDistance: 5,
backgroundColor: "rgba(218, 215, 215, 0.829)",
penColor: "black",
velocityFilterWeight: 0.7,
onBegin: () => {
console.log('=== Begin ===');
},
onEnd: () => {
console.log('=== End ===');
},
})
const customStyle = ref({
signatureCanvas: {
border: "1px solid #ccc",
borderRadius: "5px",
}
}
)
const images = ref([])
const state = ref({
color: "#000",
size: 1
})
const onChange = () => {
signOptions.value = {
penColor: state.value.color,
maxWidth: state.value.size
}
}
const unDoSign = () => {
signaturePad.value.undoSignature();
};
const clearSign = () => {
signaturePad.value.clearSignature();
};
const emit = defineEmits(['setsignin'])
const saveUploadSign = async () => {
console.log('检查签名板实例是否有效', signaturePad.value);
const { isEmpty, data } = signaturePad.value.saveSignature();
if (isEmpty) return;
console.log("picture url:", data);
if (data) {
emit('setsignin',data)
const link = document.createElement('a');
link.href = data;
link.download = 'signature.png';
setTimeout(() => {
link.click();
}, 100);
}
};
</script>
<template>
<div class="app-container">
<el-image v-if="setsignin" @click="handlePreview()" :src="form.electronicSignature" :zoom-rate="1.2"
:max-scale="7" :min-scale="0.2" fit="cover" placeholder="点击生成" error="点击签字">
</el-image>
<span v-else style="color: steelblue;cursor: pointer;" @click="handlePreview()">点击签名</span>
<!--电子签名弹框 -->
<el-dialog title="电子签名" v-model="signinVisible" width="700px" :close-on-click-modal="false" append-to-body
@close="signinVisible = false">
<signinDia @setsignin="setsignin"></signinDia>
</el-dialog>
</div>
</template>
<script setup name="User">
import signinDia from "./compent/signinDia.vue"
const signinVisible=ref(false)
const setsignin=ref('')
function setsignin(img) {
setsignin.value = img
signinVisible.value=false
}
function handlePreview () {
console.log('点击签字');
signinVisible.value=true
}
</script>