Vue——@功能PC端实现总结

一:前言

近期需要接到一个需求,需要在输入框中实现@通知用户的功能,这个功能现在也有很多应用都有,像我们常用的QQ空间,微博这些,开始看到这个需求,心里一阵惊恐,没做过啊~~

二:思路

我们大体的思路就是:当监听到用户输入@的时候我们弹出人员选择器,这时候我们需要记住现在光标所在的位置,当用户选择人员完毕之后,我们创建一个span标签在插入到我们刚刚记录光标的位置,并且把我们输入的@删除,将光标放在这个节点的最后。

三:需求拆解

按住shift + @ 的时候,弹出人员选择器

人员选择器要跟随光标的位置出现

选择时 @的用户标签插入当前的光标位置中

生成@的用户标签的规则是:高亮、携带用户ID、一键删除信息、不可以编辑。

文本框要随内容自适应高度

用户点击生成的标签或移动键盘方向键也不能聚焦进@的标签,光标需自定移到当前标签最后

输入@后连续输入的非空内容作为搜索关键词

四:准备工作

普通文本输入框实现不了这个功能,这里利用了wangEditor的富文本编辑器功能作为基础载体,

wangeditor的官方文档:www.wangeditor.com/doc/

1:wangeditor安装:

 npm i wangeditor --save 

2:使用

 <div ref="editor"
           id="editor"
           @keyup='enterEvUp($event)'
           @keydown="enterEv($event)">
           </div> 

引入

import E from 'wangeditor' 

3:初始化编辑器

这里通过各种属性来设置编辑器的基础功能

 // 初始换编辑器
    initEditor() {
      const { placeholder, content } = this
      const editor = new E(this.$refs.editor)
      editor.config.placeholder = placeholder
      editor.config.menus = [] // 显示菜单按钮
      editor.config.showFullScreen = false // 不显示全屏按钮
      editor.config.pasteIgnoreImg = true // 如果复制的内容有图片又有文字,则只粘贴文字,不粘贴图片。
      editor.config.height = '100'
      editor.config.zIndex = 2 // 编辑器 z-index 默认为 10000
      editor.config.focus = false // 取消自动 focus
      editor.config.onchange = html => {
        this.onchange(html)
      }
      // 事件绑定
      editor.txt.eventHooks.clickEvents.push(this.clickEvents) // 点击事件
      editor.txt.eventHooks.pasteEvents.push(this.pasteEvents) // 粘贴事件
      editor.create()
      editor.txt.html(content) // 设置编辑器内容
      this.editor = editor
      // 销毁编辑器
      this.$once('hook:beforeDestroy', () => {
        this.editor.destroy()
        this.editor = null
      })
    }, 

五:@功能的实现

@基础功能实现

编辑器基本环境好了后我们正式开始实现@功能,首先我们监听键盘事件:按住shift + @ 的时候,弹出人员选择框,这里监听的触发的时候需要注意的点是不同输入模式下,键盘上@符号的keyCode数字不一样,在英文模式下keyCode的值是50,而中文输入法下标点符号keyCode都是一样的:229,这里需要注意。

 // keydown触发事件(按下键盘时候触发)
    enterEv(e) {
      const { keyCode, code } = e
      
      // 英文code是 50, 判断是否按住shift + @键
      // 中文输入法下标点符号keyCode都是一样的:229,推荐使用event.code或event.key作为@的判断。
       const isCode =
        ((keyCode === 229 && e.key === '@') ||
          (keyCode === 229 && e.code === 'Digit2') ||
          keyCode === 50) &&
      
  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值