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

7 篇文章 0 订阅
4 篇文章 0 订阅

效果

在这里插入图片描述

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>
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值