vue-codemirror设置输入自定义提示效果

2023-11-07

概要

提示:通过使用"vue-codemirror": "^4.0.6",实现输入提示,类似于vscode提示效果

效果图:

实现原理

 1.得到光标位置,定义提示内容

    handleShowHint() {
      // 获取输入框实例
      const cmInstance = this.$refs.mySql.codemirror
      // 得到光标
      let cursor = cmInstance.getCursor()
      // 得到行内容
      let cursorLine = cmInstance.getLine(cursor.line)
      // 得到光标位置
      let end = cursor.ch
      this.list = []
      // 得到光标标识
      let token = cmInstance.getTokenAt(cursor)
      this.getListHint(cursorLine, end)
      return {
        list: this.list, // 自定义提示内容
        // ch:选择提示内容替换的开始位置,line: 光标所在行
        from: { ch: token.start, line: cursor.line }, 
        to: { ch: token.end, line: cursor.line }
      }
    },

2.设置分隔符,得到光标与分隔符之间的搜索内容

    getListHint(cursorLine, cursorIndex) {
      let indexList = []
      for (let i = 0; i < cursorIndex; i++) {
        // 获取所有分隔符小于当前光标的位置
        if (this.splitRules.includes(cursorLine[i])) indexList.push(i)
      }
      // 得到当前距离光标最近且小于光标位置的字符位置
      const earlayRightIndex = indexList[indexList.length - 1]
      // 截取光标与最近且位置坐标小于光标的内容
      const str = cursorLine.substring(earlayRightIndex + 1, cursorIndex)
      // 遍历自定义提示数组,得到满足条件的提示内容
      this.hintList.forEach(item => {
        if (item[this.hintLabel].indexOf(str) !== -1 && str) {
          this.list.push(item[this.hintLabel])
        }
      })
    }

核心原理:

获取当前光标与最近分隔符之间的内容

 可以设置多种分隔符,例如:,. _ ( ),空格等

通过截取到的内容来遍历数组获取符合条件的自定义提示 

     this.hintList.forEach(item => {

        if (item[this.hintLabel].indexOf(str) !== -1 && str) {

          this.list.push(item[this.hintLabel])

        }

      })

全部代码

封装好的代码

<template>
  <div class="sqlTemplate">
    <codemirror
      ref="mySql"
      v-model="sql"
      :options="sqlOptions"
    ></codemirror>
  </div>
</template>

<script>
import 'codemirror/lib/codemirror.css'
import 'codemirror/mode/sql/sql.js' // 引入mode
import 'codemirror/theme/solarized.css' // 引入theme
import { codemirror } from 'vue-codemirror'
import 'codemirror/theme/idea.css'
import 'codemirror/mode/shell/shell'
// 代码提示功能 具体语言可以从 codemirror/addon/hint/ 下引入多个
import 'codemirror/addon/hint/show-hint.css'
import 'codemirror/addon/hint/show-hint'
// 高亮行功能
import 'codemirror/addon/selection/active-line'
import 'codemirror/addon/selection/selection-pointer'
// 全屏功能 由于项目复杂,自带的全屏功能一般不好使
import 'codemirror/addon/display/fullscreen.css'
import 'codemirror/addon/display/fullscreen'
export default {
  components: { codemirror },
  props: {
    // 回显code
    code: {
      type: String
    },
    // 自定义提示列表
    hintList: {
      type: Array
    },
    // 自定义提示列表中对应的字段标识
    hintLabel: {
      type: String
    },
    // 字段分隔符,根据字段分隔符做出截取需要提示的字段
    splitRules: {
      type: Array
    },
    // 是否开启输入提示
    isHint: {
      type: Boolean,
      default: false
    }
  },
  data() {
    return {
      sql: '',
      list: [],
      sqlOptions: {
        tabSize: 4,
        lineNumbers: true,
        line: true,
        mode: 'text/x-mssql', // SQL SERVER
        smartIndent: true,
        indentUnit: 4,
        autoRefresh: true,
        theme: 'default',
        lineWrapping: true,
        // 高亮行功能
        styleActiveLine: true,
        hintOptions: {
          completeSingle: false,
          hint: this.handleShowHint
        }
      }
    }
  },
  mounted() {
    this.sql = this.code
    // 代码提示功能 当用户有输入时,显示提示信息
    this.$refs.mySql.codemirror.on('inputRead', (mySql) => {
      if (!this.isHint) return
      mySql.showHint()
    })
    // 设置输入区域高度
    this.$refs.mySql.codemirror.setSize('auto', 100 + 'px')
    // this.$nextTick(() => {
    //   window.addEventListener('resize', () => {
    //     // 监听浏览器窗口大小改变
    //     // 浏览器变化执行动作
    //     this.$refs.mySql.codemirror.setSize('auto', 100 + 'px')
    //   })
    // })
  },
  methods: {
    handleShowHint() {
      // 获取输入框实例
      const cmInstance = this.$refs.mySql.codemirror
      // 得到光标
      let cursor = cmInstance.getCursor()
      // 得到行内容
      let cursorLine = cmInstance.getLine(cursor.line)
      // 得到光标位置
      let end = cursor.ch
      this.list = []
      // 得到光标标识
      let token = cmInstance.getTokenAt(cursor)
      this.getListHint(cursorLine, end)
      return {
        list: this.list, // 自定义提示内容
      // ch:选择提示内容替换的开始位置,line: 光标所在行
        from: { ch: token.start, line: cursor.line }, 
        to: { ch: token.end, line: cursor.line }
      }
    },
    getListHint(cursorLine, cursorIndex) {
      let indexList = []
      for (let i = 0; i < cursorIndex; i++) {
        // 获取所有分隔符小于当前光标的位置
        if (this.splitRules.includes(cursorLine[i])) indexList.push(i)
      }
      // 得到当前距离光标最近且小于光标位置的字符位置
      const earlayRightIndex = indexList[indexList.length - 1]
      // 截取光标与最近且位置坐标小于光标的内容
      const str = cursorLine.substring(earlayRightIndex + 1, cursorIndex)
      // 遍历自定义提示数组,得到满足条件的提示内容
      this.hintList.forEach(item => {
        if (item[this.hintLabel].indexOf(str) !== -1 && str) {
          this.list.push(item[this.hintLabel])
        }
      })
    }
  }
}
</script>

<style>

</style>

具体使用

<template>
  <div class="databaseModelingOnLogic">
    <span class="mt10 mb10">聚合逻辑:</span>
    <div class="main">
      <sql-template
        ref="cm"
        :hintList="hintList"
        :code="code"
        :hintLabel="label"
        :splitRules="splitRules"
        :isHint="true"
      ></sql-template>
    </div>
  </div>
</template>

<script>
import SqlTemplate from '@/components/page/sql_template'

export default {
  components: {
    SqlTemplate
  },
  data() {
    return {
      code: '',
      source_table: '',
      label: 'name',
      list: [],
      selectData: [],
      splitRules: ['(', ')', '.', ' '],
      hintList: [
        {
          name: 'xiaohong'
        },
        {
          name: 'count'
        },
        {
          name: 'select'
        },
        {
          name: 'from'
        }
      ]
    }
  }
}
</script>

<style lang="scss">
.databaseModelingOnLogic {
  display: flex;
  flex-direction: column;
  justify-content: space-between;
}
.CodeMirror-hints{
  z-index: 3000 !important;
}
</style>

小结

这就是vue-codemirror设置自定义提示功能的全部内容了,欢迎大家讨论。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue-codemirror设置输入自定义提示效果 的相关文章

  • 浏览器视口大小(以设备像素为单位)

    Goal 我希望 Flash 能够获得有关浏览器视口宽度和高度 以设备像素为单位 的准确信息初始化 调整大小或浏览器缩放事件时 规格 我需要将 flash 嵌入到在 chrome safari firefox 等中运行的 html 页面中
  • 在特定页面上执行 javascript 的正确“Rails”方式

    我试图在特定页面上运行 javascript 而我唯一的解决方案似乎是反模式 我有controller js内部生成的assets javascripts 我在用着gem jquery turbolinks 我的代码类似于以下内容 docu
  • Firebase,只得到新的孩子[重复]

    这个问题在这里已经有答案了 var firebase new Firebase firebaseRef on child added function snapshot 这将接收所有元素 有没有办法在创建新的 Firebase 引用时不接收
  • 如何在没有 jQuery 的情况下删除 Javascript 中的元素

    我试图通过以下方式从 DOM 中删除 Div a 标签嵌套在其中 我想我正在寻找的是 jQuery 的纯 Javascript 版本 div remove 这是html设置 div a href Click me to remove the
  • 如何正确清理来自 AngularJS 控制器的无效输入的表单?

    我有一个 AngularJS 表单 其中包含 除其他字段之外 类型之一url 后者很重要 因为这会强制相应的输入成为有效的 URL 在某些条件下 例如 要关闭具有此类表单的模式对话框 我想以编程方式清除该表单 为此 我实现了方法reset基
  • VueJS 中数据无法正确显示

    我的 VueJS 代码有一个小问题 在 输出 压缩的 GS1 数字链接 URI 部分中 When there is no result it should have nothing display like this I have remo
  • 使用 Angular 指令禁用文本选择

    我正在学习 JavaScript 和 AngularJS 我想使用 Angular Directive 禁用文本选择 我有该函数的 JavaScript 代码 function clearSelection if document sele
  • jQuery .push 到 .get 调用中的数组给出空结果

    谁能告诉我为什么下面给我一个空字符串 当我console log contentArray in the get 回调函数它显示数据 但是当我尝试在下面的代码中执行它时 结果为空 sectionArray contentArray func
  • 为什么 window 与 Internet Explorer 中的 window.self 不同?

    关于我如何遇到这个问题有一个复杂的背景故事 但为什么self属性不完全等于窗口本身 在 Safari 和 Firefox 及其朋友中 结果如我所料 gt window window self true gt window window se
  • 如何在网站上使用 svg 元素制作块的屏幕截图?

    我在网站上创建了一个构造函数 其本质是将所选元素及其颜色 svg中的元素 添加到访问者选择的背景和背景颜色 png中的背景 中 然后必须单击 保存 结果 按钮并仅执行工作区的屏幕截图 我写了这个脚本 但它需要屏幕截图 但只有背景 并忽略选定
  • 为什么 setTimeout 在 Chrome 中触发两次,而在 IE 或 Firefox 中则不然?

    有人能告诉我为什么 javascript 函数 生成新号码 在 Chrome 中触发两次 但在 IE 或 Firefox 中则不会 使用 Chrome 20 0 1132 57 IE9 和 Firefox 13
  • 按下回车键时不刷新页面

    我遇到了一些问题 只要表单中有输入 回车键就会触发页面刷新 下面的代码 如果按下回车并且文本区域 input 中没有输入任何文本 则不会刷新页面 但是如果按下回车并且 input中有输入或者光标位于文本区域 我不确定是什么触发了它 因为 s
  • 如何通过单击链接来更改 div 的内容?

    这是我的网页的 修改后的 jsfiddle 它还有很多 而且定位是正确的 与此相反 http jsfiddle net ry0tec3p 1 http jsfiddle net ry0tec3p 1 a href class btn1 st
  • 计算三次贝塞尔曲线的弧长、曲线长度。为什么不工作?

    我正在用这个算法计算弧长 三次贝塞尔曲线的长度 function getArcLength path var STEPS 1000 gt precision var t 1 STEPS var aX 0 var aY 0 var bX 0
  • 如何正确取消引用然后删除 JavaScript 对象?

    我想知道从内存中完全取消引用 JavaScript 对象的正确方法 确保删除时不会在内存中悬空 并且垃圾收集器会删除该对象 当我看这个问题时在 JavaScript 中删除对象 https stackoverflow com questio
  • 如何计算特定字符在字符串中出现的次数

    我正在尝试创建一个函数来查看数组中的任何字符是否在字符串中 如果是 有多少个 我尝试计算每一种模式 但是太多了 我尝试使用 Python 中的 in 运算符的替代方案 但效果不佳 function calc fit element var
  • 使用javascript动态更新css内容

    需要将 css 更新为动态值 我不确定最好的方法是什么 div style zoom 1 div 缩放级别将根据窗口大小调整触发 应用程序将相应缩放 我将此应用程序加载到 cordova 中并让它在 iPAD 中运行 然后我意识到需要使用
  • 主页(网格)上的缩略图现在显得模糊。如何纠正?

    我不知道这看起来是否愚蠢 但从早上开始我就无法纠正这个突然出现在我的博客网站上的错误www candidopinions in http www candidopinions in 我有一个网格视图模板 其中博客文章中的特色图像作为调整大小
  • react-native - 图像需要来自 JSON 的本地路径

    你好社区 我正在react native中开发一个测试应用程序 并尝试从本地存储位置获取图像 我实际在做什么 我将图像直接链接源提供给 var 并在渲染函数中调用此方法 react 0 14 8 react native 0 23 1 np
  • 测量窗口偏移

    有没有一种方法可以测量 jQuery 中窗口的偏移量 以便我可以比较 固定 元素和相对定位元素的位置 我需要能够知道窗口滚动了多远 以便我可以使用该图来计算固定元素的高度 相对于视口顶部 和相对对象的高度 相对于顶部 之间的差异文件的内容

随机推荐

  • Linux期末复习总结

    目录 Linux 系统的结构 shell Linux用户类型及其用户主目录 shell提示符 输入输出重定向 标准输入 输出设备 Linux文件的类型 Linux 的目录结构 基本操作命令 链接命令 ln 链接的特点 tar命令举例 vi
  • 求一批整数中出现最多的各位数字

    描述 给定一批整数 分析每个整数的每一位数字 求出现次数最多的各 位数字 例如给定3个整数1234 2345 3456 其中出现最多次数的数字是3和4 均出现了3次 输入 输入在第1行中给出正整数N 1000 在第二行中给出N个不超过整型范
  • QT QLinearGradient (颜色渐变---应用控件背景渐变)

    示例 frame gt setStyleSheet background color qlineargradient spread pad x1 0 y1 0 x2 1 y2 0 stop 0 030303 stop 0 5 030303
  • 多线程及多进程的选择

    我的理解是进程是指在系统中正在运行的一个应用程序 程序一旦运行就是进程 或者更专业化来说 进程是指程序执行时的一个实例 线程是进程的一个实体 进程 资源分配的最小单位 线程 程序执行的最小单位 线程进程的区别体现在几个方面 0 因为进程拥有
  • 【手撕代码系列】JS手写实现bind方法

    公众号 Code程序人生 分享前端所见所闻 在JavaScript中 bind方法允许我们绑定函数的上下文并返回一个新的函数 在这篇文章中 我们将手写实现bind方法 以更好地了解它的内部工作原理 bind方法的语法 bind方法的语法如下
  • 整数转化为罗马数字

    1 问题描述 罗马数字包含以下七种字符 I V X L C D 和 M 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如 罗马数字 2 写做 II 即为两个并列的 1 12 写做 XII 即为 X
  • 多线程互斥锁 pthread_mutex 的使用及初始化问题

    一 互斥锁pthread mutex的使用 1 初始化锁 有两种方法初始化互斥锁 静态方式和动态方式 静态方式 pthread mutex t mutex lock PTHREAD MUTEX INITIALIZER 在LinuxThrea
  • 软件测试流程/需求分析之软件需求概述

    今天重点从四个方面来和大家对需求阶段需求分析做一个讲解 阅读测试文档 参与需求评审 测试需求分析 提取功能点 去做这些对应的事情之前 我们要先了解到底什么是需求 需求评审我们要从哪些点去评审 我们要去提取功能点要怎么样去进行提取 回忆测试流
  • 使用ffmpeg将mkv,rmvb转换成mp4

    cmd输入ffmpeg version 检查ffmpeg安装版本 1 进入mkv rmvb所在的文件夹 2 转换mkv ffmpeg i inputname mkv c v copy c a copy outputname mp4 转换rm
  • 几种优化算法(求最优解)

    几种优化算法 先简单备注下 今后接触到再看 参考资料 http blog sina com cn s blog 6a1bf1310101hhta html
  • SpringBean管理

    一 什么是SpringBean 在Spring中将管理对象称为 Bean Bean是由一个SpringIOC容器实例化 组装和管理的对象 也就是说 Bean并不是由我们程序员编写的 而是在程序运行过程中 由Spring通过反射机制生成的 S
  • 串口通信开发

    一开始做串口通信开发时 觉得并不难 无非就是发送 然后等一会 再接收就完事了 其实里面的水很深 特别是在各种设备都有的情况下 我们在整个开发过程中 遇到了以下的几个主要问题 1 设备出现严重的延迟 2 接收过程出现数据粘包或截断 3 多设备
  • 华为OD机试-目录删除

    Online C compiler to run C program online include
  • 解决错误:Plugin with id 'com.android.application' not found

    本文转载地址 https blog csdn net qq 26819733 article details 50935632 Error 1 0 Plugin with id com android application not fou
  • C++中的转移字符

    C 中转移字符 顺序 描述 表示 单引号 字节0x27 ASCII编码 双引号 字节0x22 ASCII编码 问号 字节0x3f ASCII编码 反斜线 字节0x5c ASCII编码 a 可听见钟 字节0x07 ASCII编码 b 退格 字
  • 深度学习方法在道路提取、图像检索上的几篇文章阅读笔记

    关于全卷积神经网络的upsampling还没有搞清楚 如果你有合适的资料或者好方法 欢迎评论交流 深度学习方法在道路提取上的应用1 传统方法 A review of road extraction from remote sensing i
  • Siebel Open UI

    阅读原文 http blog sina com cn s blog 70ea5c9101017qi4 html Open UI最常提到的特性是 W3C标准兼容 可在任何符合标准的浏览器上使用 可跨多种形式的因素 客户端JavaScript框
  • ESP32上实现LVGL的界面显示

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 元器件 二 导入库 三 调试TFT eSPI 四 调试LVGL 总结 前言 基于Vscode中的 PlatformIO平台arduino框架 使用1 8
  • nrm安装报错,解决方案

    nrm安装报错 下方为错误信息 C Users kefu gt nrm version internal validators js 124 throw new ERR INVALID ARG TYPE name string value
  • vue-codemirror设置输入自定义提示效果

    概要 提示 通过使用 vue codemirror 4 0 6 实现输入提示 类似于vscode提示效果 效果图 实现原理 1 得到光标位置 定义提示内容 handleShowHint 获取输入框实例 const cmInstance th