vue3 中组合键实现换行

vue3 中组合键实现换行

需求背景

  • 有一个聊天室功能,采用输入框的形式,输入完毕使用Enter可以直接进行发送。使用一些组合键 比如 command+Enter / shift+Enter / alt + Enter … 可以实现换行操作。但现实的情况是,原生 Enter 天然支持换行,但是我们需要阻止掉。但是组合键又需要自己去实现换行

效果图

  • 原生使用Enter 换行

Jan-23-2024 14-52-58.gif

  • 实现自定义组合键换行效果图

Jan-23-2024 14-55-40.gif

实现过程分析

  1. 根据需求定义组合键 Map
  2. 换行是根据光标位置进行换行,所以首先要获取到光标的位置
  3. 根据光标的位置,拆分成两段文本
  4. 合并两端文本为带有换行符的新文本
  5. 重新设置光标位置

代码实现

  • template模版
<el-inputref="editorRef"v-model="valueHtml"type="textarea":rows="4"placeholder="请输入内容"@keydown="handleKeyDown"></el-input>

js逻辑

import { ref, nextTick } from 'vue'
const currentEvent = ref()
const valueHtml = ref('')
const editorRef = ref()const handleKeyDown = ($event: Event) => {const event = $event as KeyboardEventcurrentEvent.value = event.target as HTMLInputElement// 定义组合键 Mapconst shortCutKeys: (keyof KeyboardEvent)[] = ['metaKey', 'altKey', 'ctrlKey', 'shiftKey']const isEnterKey = event.key === 'Enter'const isShortcutKeys = shortCutKeys.some((item) => event[item])if (isEnterKey && isShortcutKeys) {// 获取光标位置const cursorPosition = currentEvent.value.selectionStart// 拆分成两段文本const textBeforeCursor = valueHtml.value.slice(0, cursorPosition)const textAfterCursor = valueHtml.value.slice(cursorPosition)// 合并为带有换行符的新文本const newText = textBeforeCursor + '\n' + textAfterCursor// 更新输入框的值valueHtml.value = newText// 文本编辑器的高度发生变化后nextTick(() => {// 高度变化 自动滚动到底部const editor = editorRef.value.textareaeditorRef.value.textarea.scrollTop = editor.scrollHeight// 设置光标位置为: start 和 end 相同,光标会移动到换行符后面的新行首currentEvent.value.setSelectionRange(cursorPosition + 1, cursorPosition + 1)})} else if (event.key === 'Enter') {// 阻止掉 Enter 的默认换行行为event.preventDefault()// do yourself things for example  send}
}

细节优化

  1. 组合键实现了换行,但是按下Enter 也会触发换行,要阻止掉他的默认行为
else if (event.key === 'Enter') {// 阻止掉 Enter 的默认换行行为event.preventDefault()
}
  1. 文本内容换行后,高度有限,需要自动滚动到最下面,保证内容始终可见
const editor = editorRef.value.textarea
editorRef.value.textarea.scrollTop = editor.scrollHeight

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/641905.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JavaEE Spring】MyBatis 操作数据库(基础操作)

MyBatis 操作数据库 本节目标前⾔JDBC 操作⽰例回顾1. 什么是MyBatis?2. MyBatis⼊⻔2.1 准备⼯作2.1.1 创建⼯程2.1.2 数据准备 2.2 配置数据库连接字符串2.3 写持久层代码2.4 单元测试 3. MyBatis的基础操作3.1 打印⽇志3.2 参数传递3.3 增(Insert)3.4 删(Delete)3.5 改(Upd…

Matlab 将工作区变量保存到文件中(save)

语法 1、save(filename) 2、save(filename,variables) 3、save(filename,variables,fmt) 4、save(filename,variables,version) 5、save(filename,variables,version,-nocompression) 6、save(filename,variables,-append) 7、save(filename,variables,-append,-nocompression…

太赞了!微信自动回复法宝,让沟通更高效!

如今&#xff0c;微信已成为人们生活和工作中不可或缺的一部分。然而&#xff0c;对于一些有多个微信账号的人说&#xff0c;常常会因为微信号太多&#xff0c;消息太多没能及时回复&#xff0c;或是客户咨询的问题很多都差不多&#xff0c;每次都要复制粘贴很是麻烦。 要想一…

记录yolov8_obb训练自己的数据集

一.数据集制作 1.标注软件&#xff1a;roLabelImg roLabelImg是基于labelImg改进的&#xff0c;是用来标注为VOC格式的数据&#xff0c;但是在labelImg的基础上增加了能够使标注的框进行旋转的功能。 2.数据格式转换 2.1 xml转txt # 文件名称 &#xff1a;roxml_to_dota.p…

Leetcode—40.组合总和II【中等】

2023每日刷题&#xff08;七十七&#xff09; Leetcode—40.组合总和II 算法思想 实现代码 class Solution { public:vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {vector<vector<int>> ans;vector<int…

【漏洞修复】Apache Log4j 远程代码执行漏洞(CVE-2021-44228、CVE-2021-45046)

摘要 本文档适用于OpenEuler20、OpenEuler21、OpenEuler22、麒麟V10 SP3、统信V10操作系统&#xff0c;修复Log4漏洞。 问题描述 Apache Log4j是一个功能强大的日志组件&#xff0c;提供方便的日志记录。Apache Log4j2存在远程代码执行漏洞&#xff0c;由于Apache Log4j2某些…

[UEFI]ROM镜像的备份与还原

ROM镜像的备份与还原 实现Setup下面BIOS的备份还原 该功能实现两个方面&#xff0c;备份到U盘、从U盘还原 1、备份到U盘 把&#xff52;&#xff4f;&#xff4d;里的数据复制到盘中 1&#xff09;找到FAT32的文件系统 每个UEFI系统至少有一个ESP(EFI System Partition)分区…

深度解析SD-WAN和混合WAN的网络方案区别

在企业网络的不断发展中&#xff0c;根据业务需要选择不同的广域网&#xff08;WAN&#xff09;解决方案显得至关重要。传统的基于传输控制协议/因特网协议&#xff08;TCP/IP&#xff09;的WAN是一种私有广域网&#xff0c;由企业网络和互联网服务提供商&#xff08;ISP&#…

python222网站实战(SpringBoot+SpringSecurity+MybatisPlus+thymeleaf+layui)-热门标签推荐显示实现

锋哥原创的SpringbootLayui python222网站实战&#xff1a; python222网站实战课程视频教程&#xff08;SpringBootPython爬虫实战&#xff09; ( 火爆连载更新中... )_哔哩哔哩_bilibilipython222网站实战课程视频教程&#xff08;SpringBootPython爬虫实战&#xff09; ( 火…

【PyTorch】6.Learn about the optimization loop 了解优化循环

Learn about the optimization loop 了解优化循环 Optimizing Model Parameters 优化模型参数 现在我们有了模型和数据&#xff0c;是时候通过优化数据上的参数来训练、验证和测试我们的模型了。训练模型是一个迭代过程&#xff1b;在每次迭代中&#xff0c;模型都会对输出进…

Vue 动态组件与异步组件:深入理解与全面应用

聚沙成塔每天进步一点点 本文内容 ⭐ 专栏简介1. 动态组件实现原理&#xff1a;用法示例&#xff1a; 2. 异步组件实现原理&#xff1a;用法示例&#xff1a; 3. 异步组件的高级应用a. 异步组件的命名&#xff1a;b. 异步组件的加载状态管理&#xff1a; ⭐ 写在最后 ⭐ 专栏简…

element plus表格的表头和内容居中

文章目录 需求分析 需求 对于 element-plus 中的 table 进行表头和内容的居中显示 分析 单列的表头和内容居中 &#xff1a; 在对应的那一列加上align“center” 即可 <el-table-column prop"name" label"商品名称" align"center" />…

c++QT文件IO

1、QFileDialog文件对话框 与QMessageBox一样&#xff0c;QFileDialog也继承了QDialog类&#xff0c;直接使用静态成员函数弹窗。弹出的结果&#xff08;选择文件的路径&#xff09;通过返回值获取。 1&#xff09;获取一个打开或保存的文件路径 // 获取一个打开或保存的文件路…

WEB前端IDE的使用以及CSS的应用

IDE的使用 <!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-width, i…

Unity3D控制人物移动的多种方法

系列文章目录 unity知识点 文章目录 系列文章目录前言一、人物移动之键盘移动1-1、代码如下1-2、效果 二、人物移动之跟随鼠标点击移动2-1、代码如下2-2、效果 三、人物移动之刚体移动3-1、代码如下3-2、效果 四、人物移动之第一人称控制器移动4-1、代码如下4-2、效果 五、And…

从编程中思考:大脑的局部与全局模式(一)

郭靖正在帐篷中用Unity写代码&#xff0c;刚写完一段代码。欧阳锋从帐篷外走进来&#xff0c;正要说点什么&#xff0c;郭靖反应敏捷&#xff0c;转身反手一招神龙摆尾击出&#xff0c;将欧阳锋震出帐篷&#xff0c;灰溜溜逃跑。 using UnityEngine;public class LocalGlobalD…

Maven 综合案例

1. 项目需求和结构分析 需求案例&#xff1a;搭建一个电商平台项目&#xff0c;该平台包括用户服务、订单服务、通用工具模块等。 项目架构&#xff1a; 用户服务&#xff1a;负责处理用户相关的逻辑&#xff0c;例如用户信息的管理、用户注册、登录等。 spring-context 6.0.…

P1320 压缩技术(续集版)(C语言)

基本思路是&#xff1a; 1.读入字符串并计算n值 2.字符串连接&#xff08;要用到strcat&#xff09; 3.输出n值 4.计算字符数并输出 其中输出时第一个数字是0的个数&#xff0c;这个很容易被遗漏。 #include<stdio.h> #include<string.h> int main() {char a[…

centos 7.6 进入单用户模式

1、重启服务器&#xff0c;在选择内核界面使用上下箭头移动 2、选择内核并按“e” 将“RO”改成 rw ,删除 rhgb quiet 添加 init/bin/bash Ctrl X 进入单用户模式 为防止乱码&#xff0c;修改语言为英语 修改完密码建议输入&#xff1a;touch /.autorelabel 更新系统信…

imgaug库图像增强指南(34):揭秘【iaa.Clouds】——打造梦幻般的云朵效果

引言 在深度学习和计算机视觉的世界里&#xff0c;数据是模型训练的基石&#xff0c;其质量与数量直接影响着模型的性能。然而&#xff0c;获取大量高质量的标注数据往往需要耗费大量的时间和资源。正因如此&#xff0c;数据增强技术应运而生&#xff0c;成为了解决这一问题的…