vue3中实现点击ctrl+enter换行,enter发送

效果

在这里插入图片描述

TS部分:

<script lang="ts" setup>
import { Promotion } from '@element-plus/icons-vue'
import { ref } from 'vue';

const question = ref('')
const keyDownCode = ref(0)

// 键盘按下事件处理函数
const keyDownEnter = (e: any) => {
    console.log(e.keyCode)  // 打印按键代码
    keyDownCode.value = e.keyCode  // 将按键代码赋值给 keyDownCode
    e.preventDefault()  // 阻止默认行为
}

// 键盘抬起事件处理函数
const keyUpEnter = (e: any) => {
    if (keyDownCode.value === 229) {  // 如果 keyDownCode 的值为 229,则说明输入法正在处理输入
        return
    }
    e.preventDefault()  // 阻止默认行为
    console.log(e.keyCode)  // 打印按键代码
    send()  // 调用 send 函数
}

// 处理 Shift + Enter 的函数
const keyEnterShift = () => {
    console.log('shift,enter')  // 打印 'shift,enter'
}

// 发送消息的函数
const send = () => {
    question.value = ''  // 清空 question 的值
}
</script>

模板部分:

<template>
    <div class="chat-input">
        <div class="chat-inputcontainer">
            <div class="input-inner">
                <div class="editor">
                    <el-input class="editor-textarea" v-model="question" autosize type="textarea"
                        placeholder="在这里输入你的问题" @keydown.enter.exact="keyDownEnter" @keyup.enter.exact="keyUpEnter"
                        @keydown.enter.shift="keyEnterShift" />
                </div>
                <div class="toolbar">
                    <el-tooltip class="box-item" effect="dark" content="请输入你的问题" placement="top">
                        <el-button class="send" size="large" type="info" text>
                            <el-icon size="26">
                                <Promotion />
                            </el-icon>
                        </el-button>
                    </el-tooltip>
                </div>
            </div>
        </div>
    </div>
</template>

样式部分

<style lang="scss" scoped>
.chat-input {
    position: relative;

    .chat-inputcontainer {
        position: relative;
        background-color: #E5E7ED;
        border: 1px solid #E5E5E5;
        border-radius: 16px;
        box-shadow: 0px 8px 25px 0px #0000000D;
        overflow: hidden;

        .input-inner {
            display: flex;
            flex-wrap: wrap;
            background-color: #ffffff;
            padding: 8px 16px;

            .editor {
                word-break: break-all;
                flex-grow: 1;
                color: #060607;
                margin-right: -12px;

                .editor-textarea:deep(.el-textarea__inner) {
                    width: 100%;
                    resize: none;
                    font-variation-settings: inherit;
                    font-weight: inherit;
                    letter-spacing: inherit;
                    font-family: inherit;
                    font-feature-settings: inherit;
                    font-size: 1rem;
                    line-height: 1.5rem;
                    padding: .5rem .75rem;
                    border-radius: 0;
                    appearance: none;
                    --tw-shadow: 0 0 transparent;
                    margin: 0;
                    max-height: 25dvh;
                    border-width: 0;
                    background-color: transparent;
                    padding-left: 0;
                    padding-right: 0;
                    color: #0d0d0d;
                    outline: none;
                    box-shadow: none;

                    :focus {
                        --tw-ring-inset: var(--tw-empty,
                                /*!*/
                                /*!*/
                            );
                        --tw-ring-offset-width: 0px;
                        --tw-ring-offset-color: #fff;
                        --tw-ring-color: #2563eb;
                        outline-offset: 2px;
                        outline: none;
                        border-color: inherit;
                    }
                }
            }

            .toolbar {
                display: flex;
                gap: 4px;
                color: #5E6772;
                align-items: flex-end;
                margin-left: auto;

                .send {
                    border: none;
                }
            }
        }
    }
}
</style>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI魔法相机:实时3D重建与场景魔法化

一、产品概述 AI魔法相机是一款创新的硬件产品,它结合了AI技术和3D重建扫描技术,能够实时捕捉并重建3D场景和物理世界。用户只需通过简单的点击操作,即可捕捉现实物体或环境,并将其无缝融合到任何场景中,创造出全新的想象现实。 二、核心功能 实时捕捉:一键式操作,迅速…

CV每日论文--2024.6.6

1、Dealing with All-stage Missing Modality: Towards A Universal Model with Robust Reconstruction and Personalization 中文标题&#xff1a;处理全阶段缺失模态&#xff1a;迈向具有鲁棒重建和个性化的通用模型 简介&#xff1a;这篇论文提出了一种具有模态重建和模型个…

QT漂亮QSS样式模仿流行VUE Element UI ,QSS漂亮大方美观样式 QSS样式 QTableWidget 漂亮样式QSS 快速开发QSS漂亮界面

在现代应用程序开发中&#xff0c;用户界面&#xff08;UI&#xff09;的设计与用户体验&#xff08;UX&#xff09;占据了至关重要的位置。Vue.js框架因其灵活性和丰富的生态系统而广受欢迎&#xff0c;其中Element UI作为一套为Vue设计的桌面端组件库&#xff0c;以其清晰的视…

红海云入选《2024中国数据智能产业图谱1.0》

近日&#xff0c;国内知名大数据产业创新服务媒体数据猿携手上海大数据联盟重磅发布了《2024中国数据智能产业图谱1.0》。红海云凭借在人力资源数字化应用领域的卓越产品创新与服务&#xff0c;成功入选图谱「 企业应用-人力资源」板块。 《2024中国数据智能产业图谱1.0》由数…

视频直播点播EasyDSS平台授权时,出现授权时间即将到期的提示是什么原因?

视频直播点播EasyDSS平台具备灵活的视频能力&#xff0c;包括直播、点播、转码、管理、录像、检索、时移回看等&#xff0c;平台支持音视频采集、视频推拉流、播放H.265编码视频、存储、分发等能力服务&#xff0c;可应用在无人机推流、在线直播、虚拟直播、远程培训等场景中。…

快递一键查询,只需快递单号,轻松掌握全程物流信息,让您的包裹追踪无忧!

在快节奏的现代生活中&#xff0c;快递已经成为我们生活中不可或缺的一部分。无论是网购的宝贝、亲朋好友寄来的礼物&#xff0c;还是工作中的紧急文件&#xff0c;快递都承载着我们的期待和需要。然而&#xff0c;面对众多的快递公司和复杂的查询流程&#xff0c;如何快速、准…

css图片适配,不随屏幕的大小变化

.carimg {width: 100%;height: 100%;max-width: 100%;max-height: 100%;object-fit: cover; } <img class"carimg" :src"item.imageUrl" alt"" /> 效果&#xff1a; 全屏时 屏幕变小时

【Three.js】知识梳理三:Three.js几何体Geometry

1.什么是几何体Geometry&#xff1f; 在 Three.js 中&#xff0c;几何体&#xff08;Geometry&#xff09;是一个数据结构&#xff0c;包含了用于描述三维物体的基本信息&#xff0c;如顶点&#xff08;vertices&#xff09;、面&#xff08;faces&#xff09;和它们的关联属性…

关于会议论文/CPCI/ISTP会议论文

关于会议论文 会议论文是公开发表的学术论文&#xff0c;一般正式的国际学术会议都会公开征稿&#xff0c;并要求录用的论文在会议上进行宣读、交流&#xff0c;然后集结出版&#xff0c;这就是我们常说的会议论文集&#xff0c;而这些发表的论文也可用于硕博毕业、项目结题、…

1 c++多线程创建和传参

什么是进程&#xff1f; 系统资源分配的最小单位。 什么是线程&#xff1f; 操作系统调度的最小单位&#xff0c;即程序执行的最小单位。 为什么需要多线程&#xff1f; &#xff08;1&#xff09;加快程序执行速度和响应速度, 使得程序充分利用CPU资源。 &#xff08;2&…

Python中columns()函数

1. columns的概念 在数据分析和处理中,columns是指数据表中的列,也称为字段。每一列代表了特定类型的数据,在一个数据表中,每一行代表了一个数据实例,而每一列则代表了一个特定的特征或属性。 可以直接定义和更改列标题,也可以直接读取某列的数据,或者对某列进行运算。…

Java:双色球案例

文章目录 题目最终代码及运行结果过程中出现的问题判断选取的小球数字是否满足条件获奖多少没输出其他问题 学到的东西 题目 最终代码及运行结果 package com.zhang; /* 双色球案例: 投注号码由6个红球和1个蓝球号码组成。红色球号码从1——33中选择&#xff0c;蓝色球号码从1…

不定时更新 解决无法访问GitHub github.com 打不开 访问加速

1 修改hosts Windows 10为例,‪文件C:\Windows\System32\drivers\etc\hosts 管理员打开记事本来修改 文件-打开-“C:\Windows\System32\drivers\etc\hosts” 20.205.243.168 api.github.com 185.199.108.154 github.githubassets.com 185.199.108.133 raw.githubusercontent.…

Linux:桌面系统中的文件后缀和类型

相关阅读 Linuxhttps://blog.csdn.net/weixin_45791458/category_12234591.html?spm1001.2014.3001.5482 Linux中的文件后缀与Windows系统有些不同&#xff0c;因为其似乎没有很重要&#xff0c;一个文件是否可执行对后缀没有要求。但是&#xff0c;后缀依然可以用于表示文件…

企业成功实施MES管理系统的七个建议

在当今数字化浪潮下&#xff0c;企业为实现生产过程的智能化、高效化&#xff0c;越来越多地选择实施MES管理系统。MES管理系统不仅上承公司级的ERP系统&#xff0c;获取计划、资源等数据&#xff0c;还与PLM、PDM等系统集成&#xff0c;获取BOM及工艺等数据&#xff1b;同时&a…

SpringBoot高手之路jdk动态代理

文章目录 JDK动态代理基于jdk的动态代理Aop底层就是基于动态代理实现的实现代码先写代理对象工具 JDK动态代理 基于jdk的动态代理 业务需求 通过动态代理技术,对service层的方法统计执行时间–创建代理对象 Aop底层就是基于动态代理实现的 jdk动态代理技术是基于接口做的代理…

计算机专业是否仍是“万金油”?—2024高考生的思考

随着2024年高考落幕&#xff0c;数百万高三学生将面对人生中的重要抉择&#xff1a;选择大学专业。在这个关键节点上&#xff0c;计算机相关专业是否仍是“万金油”的选择&#xff1f;让我们从多个角度来探讨这个问题。 本人985高校计算机类专业毕业&#xff0c;从事IT和互联网…

超详解——python函数定义和调用——小白篇

目录 1. 函数的参数 位置参数&#xff1a; 关键字参数&#xff1a; 默认参数&#xff1a; 2. 关键字参数 3. 参数组 4. 函数重载 5. 函数的返回值 单个返回值&#xff1a; 多个返回值&#xff1a; 6. 函数的内置属性 __name__&#xff1a; __doc__&#xff1a; 7…

【ATU Book-i.MX8系列 - TFLite 进阶】 NXP i.MX8M Plus 实现高效 Mobilenet SSD 物体检测

NXP i.MX8M Plus 实现高效 Mobilenet SSD 物体检测 一、概述 在 边缘运算(Edge Computing) 领域中&#xff0c;轻量级的模型扮演着举足轻重的角色。因此&#xff0c;如何在有限硬体资源下实现电脑视觉&#xff08;Computer vision&#xff09; 应用是个极具挑战性的课题。特别…

安享智慧理财金融测试项目

1. 项目介绍 安享智慧理财金融系统是基于 Java 语言开发&#xff0c;集 PC 端、APP 端、WAP 端为一体的 P2P&#xff08;个人对个人&#xff09;的借贷系统&#xff0c;提供了完整的借款和投资功能。 web用户端 说明&#xff1a;PC 网站&#xff0c;供借款人和投资人使用功能…