vue3 引用虚拟键盘simple-keyboard

devtools/2024/10/21 5:41:45/

simple-keyboard官网地址:https://virtual-keyboard.js.org

目前实现效果图是(实现数字、大小写字母键盘):
在这里插入图片描述

1.需要先安装simple-keyboard
npm install simple-keyboard --save
2.封装sinpleKeyboard 组件
<!-- keyboard-box.vue-->
<template><div class="keyboard-box"><div :class="keyboardClass"></div></div>
</template><script setup name= "SimpleKeyboard">
//引用
import Keyboard from "simple-keyboard";
import "simple-keyboard/build/css/index.css";
import { onMounted, ref, watch } from "vue";
//自定义键盘图片
import delIcon from "../assets/del.png";
import lockIcon from "../assets/lock.png";
import bigIcon from "../assets/big.png";const emit = defineEmits(["onChange", "onKeyPress"]);
const visible = ref(true);
const props = defineProps({keyboardClass: { type: String, default: "simple-keyboard" },input: String,layout: {type: Object,default: () => {return {default: ["1 2 3 {bksp}","4 5 6 .","7 8 9 @","{close} 0 {abc} {enter}",],abc: ["q w e r t y u i o p","a s d f g h j k l","{lock} z x c v b n m {bksp}","{123} . 0 @ {close} {enter}",],lock: ["Q W E R T Y U I O P","A S D F G H J K L","{big} Z X C V B N M {bksp}","{123} . 0 @ {close} {enter}",],// default: [//     "` 1 2 3 4 5 6 7 8 9 0 - = {bksp}",//     "{tab} q w e r t y u i o p [ ] \\",//     "{lock} a s d f g h j k l ; ' {enter}",//     "{shift} z x c v b n m , . / {shift}",//     "@ {space}",//   ],//   shift: [//     "~ ! @ # $ % ^ &amp; * ( ) _ + {bksp}",//     "{tab} Q W E R T Y U I O P { } |",//     '{lock} A S D F G H J K L : " {enter}',//     "{shift} Z X C V B N M &lt; &gt; ? {shift}",//     "@ {space}",//   ],};},},
});
let keyboard = ref(null);
onMounted(() => {keyboard.value = new Keyboard(props.keyboardClass, {onChange: onChange,//这里一定要注意驼峰命名(否则会不生效)onKeyPress: onKeyPress,});keyboard.value.setOptions({layoutName: "default",layout: props.layout,display: {// 中文语言包"{enter}": "完成","{123}": "123","{tab}": "tab","{shift}": "shift","{space}": " ","{bksp}": `<img src=${delIcon} style='' width='30'>`,"{big}": `<img src=${lockIcon} style='' width='30'>`,"{lock}": `<img src=${bigIcon} style='' width='30'>`,"{close}": "关闭","{abc}": "abc",},});
});watch(()=>props.input, (newValue, oldValue) => {keyboard.value.setInput(newValue);
});const onChange = (input) => {emit("onChange", input);
};
const onKeyPress = (button) => {emit("onKeyPress", button);if (button === "{123}" || button === "{abc}") {handleShift();}if (button === "{lock}" || button === "{big}") hadleLock();// return;if (button === "{big}" ||button === "{abc}" ||button === "{lock}" ||button === "{123}") {console.log(keyboard.value.options.layoutName,"keyboard.value.options.layoutName");}
};const handleShift = () => {let currentLayout = keyboard.value.options.layoutName;let shiftToggle = currentLayout === "default" ? "abc" : "default";keyboard.value.setOptions({layoutName: shiftToggle,});
};
const hadleLock = () => {let currentLayout = keyboard.value.options.layoutName;let shiftToggle = currentLayout === "abc" ? "lock" : "abc";keyboard.value.setOptions({layoutName: shiftToggle,});
};
</script><style  scoped>
.keyboard-box{width: 40%;margin: auto;
}
.simple-keyboard {background: none !important;font-size: 20px;
}::v-deep(.hg-button:nth-of-type(4)),
::v-deep(.hg-button-close),
::v-deep(.hg-button-abc) {box-sizing: border-box;width: 20px;max-width: none !important;
}
.hg-button {/* width: calc(100% / 4); */
}
</style>
3.引用组件
<template>
<el-inputsize="large"class="text"v-model="mobile"clearable@focus="focusMobile"@blur="blurMobile"></el-input><!-- 键盘 --><div class="el-drawer keyboard"><number-keyboardv-if="isKeyboard"@onChange="onChange"@onKeyPress="onkeyPress":input="model"></number-keyboard></div>
</template>
<script setup>
import numberKeyboard from "../components/numberKeyboard.vue";let mobile=ref('')
let isKeyboard=ref(false)
// 键盘按键的值const onChange = (e) => {console.log(state.currentProp, "23423423");model.value= e;};// 键盘按键为完成和关闭时隐藏键盘const onkeyPress = (button) => {if (button === "{enter}" || button === "{close}") {isKeyboard.value = false;model.value = "";}};const focusMobile = (e) => {nextTick(() => {isKeyboard.value = true;model.value  =  model.value });console.log(e, "23424聚焦点");};const blurMobile = (e) => {console.log(e, "失去焦点");};
</script>

http://www.ppmy.cn/devtools/27462.html

相关文章

k8s pod 镜像拉取策略

在 Kubernetes (k8s) 中&#xff0c;Pod 容器镜像的拉取策略通过 imagePullPolicy 属性来控制。这一策略决定了 kubelet 如何以及何时从容器镜像仓库中拉取镜像。以下是三种主要的镜像拉取策略及其详细说明&#xff1a; Always: 说明: 这是默认的拉取策略。当设置为 Always 时&…

第72天:漏洞发现-Web框架中间件联动GobyAfrogXrayAwvsVulmap

案例一&#xff1a;某 APP-Web 扫描-常规&联动-Burp&Awvs&Xray Acunetix 一款商业的 Web 漏洞扫描程序&#xff0c;它可以检查 Web 应用程序中的漏洞&#xff0c;如 SQL 注入、跨站脚本攻击、身份验证页上的弱口令长度等。它拥有一个操作方便的图形用户界 面&#…

解锁图像新维度:剑桥联手英特尔,利用大语言模型重构逆向图形学!

DeepVisionary 每日深度学习前沿科技推送&顶会论文分享&#xff0c;与你一起了解前沿深度学习信息&#xff01; 引言&#xff1a;探索逆图形学的新视角 逆图形学&#xff08;Inverse Graphics&#xff09;是计算机视觉和图形学中的一个基本挑战&#xff0c;它涉及将图像…

LCR 150. 彩灯装饰记录 II

1.leetcode原题链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 2.题目描述 一棵圣诞树记作根节点为 root 的二叉树&#xff0c;节点值为该位置装饰彩灯的颜色编号。请按照从左到右的顺序返回每一层彩灯编号&#xff0c;每一层的结果记录于一行。 示例 1&#xff…

Python和Julia河流湖泊沿海水域特征数值算法模型

&#x1f3af;要点 一维水流场景计算和绘图&#xff1a; &#x1f3af;恒定透射率水头和流量计算&#xff1a;&#x1f58a;两条完全穿透畜水层理想河流之间 | &#x1f58a;无承压畜水层两侧及两条完全穿透畜水层的补给 | &#x1f58a;分水岭或渗透性非常低的岩体的不渗透边…

[华为OD]实现一个支持优先级的队列,高优先级先出队列 100

题目&#xff1a; 实现一个支持优先级的队列&#xff0c;高优先级先出队列&#xff1b;同优先级时先进先出。 如果两个输入数据和优先级都相同&#xff0c;则后一个数据不入队列被丢弃。 队列存储的数据内容是一个整数。 输入描述&#xff1a; 一组待存入队列的数据&#…

【ARM 裸机】BSP 工程管理

回顾一下上一节&#xff1a;【ARM 裸机】NXP 官方 SDK 使用&#xff0c;我们发现工程文件夹里面各种文件非常凌乱&#xff1b; 那么为了模块化整理代码&#xff0c;使得同一个属性的文件存放在同一个目录里面&#xff0c;所以学习 BSP 工程管理非常有必要。 1、准备工作 新建…

2024-04-30 区块链-以太坊-相关文档

摘要: 2024-04-30 区块链-以太坊-文档 以太坊-相关文档: https://github.com/ethereum/go-ethereum https://geth.ethereum.org/ https://geth.ethereum.org/docs https://ethereum.org/zh/ 以太坊开发文档 | ethereum.org 以太坊开发文档_w3cschool 以太坊开发文档 基础主题 …