antd vue 输入框高亮设置关键字

   <highlight-textarea
                placeholder="请输入主诉"
                type="textarea"
                v-model="formModel.mainSuit"
                :highlightKey="schema.componentProps.highlightKey"
                >
              </highlight-textarea>

参考链接原生input,textarea

demo地址

默认为团队组织高亮

效果演示
vue3相关组件修改
<template>
  <div class="highlight-box">
    <template v-if="type === 'textarea'">
      <div v-if="value"
           class="textarea-outer"
           ref="textareaOuter"
           >
        <div ref="outerInner" class="outer-inner"
             v-html="highlightHtml(value)">
        </div>
      </div>
      <a-textarea
        ref="textareaBox"
        :autoSize="true"
        :placeholder="placeholder"
        v-model:value="value">
            </a-textarea>
    </template>
    <template v-if="type === 'input'">
      <div v-if="value"
           class="input-outer"
           v-html="highlightHtml(value)">
      </div>
      <a-input type="text" class="ant-input"
             :placeholder="placeholder"
            v-model:value.trim="value"/>
    </template>
  </div>
</template>

<script >
export default {
  name: 'HighlightTextarea',
  data() {
    return {
      value: ''
    };
  },
  props: {
    placeholder: {
      type: String,
      required: false,
      default: '请输入'
    },
    text: {
      type: String,
      required: false,
      default: ''
    },
    highlightKey: {
      type: Array,
      require: false,
      default: () => [
        '团队'
      ]
    },
    type: {
      type: String,
      required: true,
      default: 'textarea'
    },
    maxHeight: {
      type: Number,
      required: false,
      default: 220
    },
    modelValue: {
      type: String,
      default: ''
    }
  },
  watch: {
    value (v) {
      console.log(v, 'value 3333')
      // this.value = this.text.replace(/(^\s*)|(\s*$)/g, '').replace(/<br \/>|<br\/>|<br>/g, '\n');

      this.$emit("update:modelValue", v);
    },
    modelValue: {
      deep: true,
      immediate: true,
      handler(v) {
        console.log(v, 'modelValue 3333')

        this.value = v ? this.modelValue : ''
      },
    },
    disabled: {
      deep: true,
      immediate: true,
      handler(v) {
        // this.editorConfig.readOnly = v
        // this.$nextTick(() => {
        //   if (this.editor) v ? this.editor.disable() : this.editor.enable();
        // })
      },
    }
  },
  created() {
    // this.value = this.text.replace(/(^\s*)|(\s*$)/g, '').replace(/<br \/>|<br\/>|<br>/g, '\n');
  },
  mounted() {
    // this.scrollMousewheel();
  },
  methods: {
    highlightHtml(str) {
      if ((!str || !this.highlightKey || this.highlightKey.length === 0) && this.type !== 'textarea') {
        return str;
      }
      let rebuild = str;
      if (this.highlightKey.filter(item => ~str.indexOf(item)).length) {
        let regStr = '';
        let regExp = null;
        this.highlightKey.forEach(list => {
          regStr = this.escapeString(list);
          regExp = new RegExp(regStr, 'g');
          rebuild = rebuild.replace(regExp, `<span>${list}</span>`);
        });
      }
      if (this.type === 'textarea') {
        rebuild = rebuild.replace(/\n/g, '<br/>').replace(/\s/g, '&nbsp;');
        // textarea有滚动条时,div底部不能和textarea重合,故加一个<br/>
        // const wrap = this.$refs.textareaBox;
        // if (wrap && wrap.scrollHeight > this.maxHeight) {
        //   rebuild = rebuild + '<br/>';
        // }
      }
      return rebuild;
    },
    syncScrollTop() {
      const wrap = this.$refs.textareaBox;
      const outerWrap = this.$refs.textareaOuter;
      const outerInner = this.$refs.outerInner;
      if (wrap.scrollHeight > this.maxHeight && outerInner.scrollHeight !== wrap.scrollHeight) {
        outerInner.style.height = `${wrap.scrollHeight}px`;
      }
      if (wrap.scrollTop !== outerWrap.scrollTop) {
        outerWrap.scrollTop = wrap.scrollTop;
      }
    },
    // scrollMousewheel() {
    //   if (this.type === 'input') {
    //     return;
    //   }
    //   this.$nextTick(() => {
    //     this.eventHandler('add');
    //   });
    // },
    // 处理字符串中可能对正则有影响的字符
    escapeString(value) {
      const characterss = ['(', ')', '[', ']', '{', '}', '^', '$', '|', '?', '*', '+', '.'];
      let str = value.replace(new RegExp('\\\\', 'g'), '\\\\');
      characterss.forEach(function (characters) {
        let r = new RegExp('\\' + characters, 'g');
        str = str.replace(r, '\\' + characters);
      });
      return str;
    },
    eventHandler(type) {
      const wrap = this.$refs.textareaBox;
      if (wrap) {
        let mousewheelevt = (/Firefox/i.test(navigator.userAgent))
          ? 'DOMMouseScroll' : 'mousewheel';
        wrap[`${type}EventListener`](mousewheelevt, this.syncScrollTop);
        wrap[`${type}EventListener`]('scroll', this.syncScrollTop);
      }
    }
  },
  destroyed() {
   // this.eventHandler('remove');
  }
};
</script>

<style lang="less">
@width: 100%; // 500px
.highlight-box {
  font-family: 'Franklin Gothic Medium', 'Arial Narrow', Arial, sans-serif;
  position: relative;
  display: flex;
  //font-size: 12px;
  width: @width;
  //position: relative;
  //color: #333333;
  background: #ffffff;
  border-radius: 2px;
  overflow: hidden;
  .textarea-outer,
  .input-outer {
    box-sizing: border-box;
    width: @width;
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    border: 1px solid transparent;
    border-top: 0;
    // 鼠标事件失效 ie6-10不支持
    pointer-events: none;
    cursor: text;
    span {
      color: red; // #F27C49
    }
    &:hover {
      border-color: #4C84FF;
    }
  }
  .textarea-outer {
    overflow-y: auto;
    //line-height: 20px;
    word-break: break-all;
    .outer-inner {
      padding: 5px 8px;
      width: 100%;
      box-sizing: border-box;
    }
  }
  textarea {
    width: @width;
    //line-height: 20px;
    resize: none;
  }
  .input-outer,
  input {
    width: @width;
    height: 32px;
    line-height: 32px;
  }
  .input-outer {
    bottom: 0;
    padding: 0 8px;
    overflow: hidden;
    white-space: nowrap;
    text-overflow: ellipsis;
  }
  textarea,
  input {
    font-family: 'Franklin Gothic Medium', 'Arial Narrow', Arial, sans-serif;
    //font-size: 12px;
    // position: relative;
    // z-index: 2;
    // 光标的颜色
    //color: #333333;
    // 文本颜色
    text-shadow: 0 0 0 rgba(0, 0, 0, 0);
    -webkit-text-fill-color: transparent;
    background: transparent;
    border-radius: 2px;
    border: 1px solid #d9d9d9;
    padding: 4px 8px;
    box-sizing: border-box;
    //&::placeholder {
    //  -webkit-text-fill-color: #d5d5d5;
    //}
    //&:hover {
    //  border-color: #36cfc9;
    //}
    //&:focus {
    //  border-color:#36cfc9;
    //  box-shadow: 0 0 0 2px #DBE4FF;
    //  outline: none;
    //}
  }
}
</style>
 使用组件
   <highlight-textarea
                placeholder="请输入主诉"
                type="textarea"
                v-model="formModel.mainSuit"
                :highlightKey="schema.componentProps.highlightKey" 
                >
// highlightKey 高亮关键字数组 如: ['团队']
// formModel.mainSuit 绑定字段
              </highlight-textarea>
参考说明 

 

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

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

相关文章

网站建设为什么要选择国内服务器

选择国内服务器进行网站建设&#xff0c;对于面向国内用户的企业来说&#xff0c;是一个明智的决策。以下是一些选择国内服务器的主要原因&#xff1a; 提升用户体验&#xff1a; 网站访问速度是用户体验的关键因素之一。由于物理距离较近&#xff0c;国内服务器通常能提供更快…

Linux_进程概念详解(续)_命令行参数_环境变量_进程地址空间

本篇文章是Linux_进程概念详解的续篇&#xff0c;请先阅读Linux_进程概念详解再来阅读本篇。 命令行参数 在C / C中&#xff0c;每个程序都必须有一个main函数&#xff0c;该函数有很多的版本&#xff0c;我们最常用的就是不带参数的版本&#xff0c;也就是下面第一条语句 i…

关于 文件操作详解 笔记 (含代码解析)

文件 磁盘&#xff08;硬盘&#xff09;上的⽂件是⽂件。 程序设计中&#xff0c;我们⼀般谈的⽂件有两种&#xff1a;程序⽂件、数据⽂件&#xff08;从⽂件功能的⻆度来分类 &#xff09; 程序⽂件 程序⽂件包括源程序⽂件&#xff08;后缀为.c&#xff09;,⽬标⽂件&#…

【测试】BUG篇——BUG

bug的概念 定义&#xff1a;⼀个计算机bug指在计算机程序中存在的⼀个错误(error)、缺陷(flaw)、疏忽(mistake)或者故障(fault)&#xff0c;这些bug使程序⽆法正确的运⾏。Bug产⽣于程序的源代码或者程序设计阶段的疏忽或者错误。 准确的来说&#xff1a; 当且仅当规格说明&am…

项目_C_Ncurses_Flappy bird小游戏

Ncurses库 概述 什么是Ncurses库&#xff1a; Ncurses是一个管理应用程序在字符终端显示的函数库&#xff0c;库中提供了创建窗口界面、移动光标、产生颜色、处理键盘按键等功能。 安装Ncurses库&#xff1a; sudo apt-get install libncurses5-dev 头文件与编译&#xf…

老人桌面 1.3.5|专为老人设计的便捷实用桌面应用

老人桌面是一款专为老人设计的便捷实用桌面应用&#xff0c;具有超大字体设计&#xff0c;符合老人视力水平&#xff0c;撞色简洁的应用界面&#xff0c;拯救老人视觉体验。此外&#xff0c;还提供了常用的实用小工具&#xff0c;让老人能够轻松使用手机。 大小&#xff1a;5.…

Oracle-19g数据库的安装

简介 Oracle是一家全球领先的数据库和云解决方案提供商。他们提供了一套完整的技术和产品&#xff0c;包括数据库管理系统、企业级应用程序、人工智能和机器学习工具等。Oracle的数据库管理系统是业界最受欢迎和广泛使用的数据库之一&#xff0c;它可以管理和存储大量结构化和…

界面耻辱纪念堂--可视元素03

更多的迹象表明&#xff0c;关于在程序里使用新的动态界面元素&#xff0c;微软的态度是不确定的&#xff0c;其中一个是仅仅需要对比一下Office97 里的“Coolbars”和“标准工具条”。Coolbar 按钮直到用户指针通过的时候才成为按钮&#xff08;否则是平的&#xff09;。 工具…

SpringBoot Data JPA基本使用

一、项目起步 1.1 pom配置 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependency><dependency><groupId>org.springframework.boot</groupId><…

Android终端GB28181音视频实时回传设计探讨

技术背景 好多开发者&#xff0c;在调研Android平台GB28181实时回传的时候&#xff0c;对这块整体的流程&#xff0c;没有个整体的了解&#xff0c;本文以大牛直播SDK的SmartGBD设计开发为例&#xff0c;聊下如何在Android终端实现GB28181音视频数据实时回传。 技术实现 Andr…

光伏仿真系统在光伏项目开发中有哪些应用场景?

光伏仿真系统在光伏项目开发中的应用场景广泛&#xff0c;涵盖了从项目规划、设计优化到运维管理的全过程。 一、项目规划与选址 1、气象模拟与评估 光伏仿真系统能够基于历史气象数据和先进的预测模型&#xff0c;模拟不同地理位置、不同季节和时间段的光照强度、温度、湿度…

【学术论文投稿】Java入门:零基础小白也能轻松掌握的全攻略

【IEEE | 往届见刊1个月检索 | 国际双会场】第四届智能电力与系统国际学术会议(ICIPS 2024)_艾思科蓝_学术一站式服务平台 更多学术论文投稿请看&#xff1a;https://ais.cn/u/nuyAF3 目录 【IEEE | 往届见刊1个月检索 | 国际双会场】第四届智能电力与系统国际学术会议(ICIPS…

『网络游戏』三端增加数据.dll替换【32】三端

修改服务器脚本&#xff1a;DBMgr 增加数据库 修改客户端脚本&#xff1a;MainCityWnd.cs 拖拽绑定 查看服务端PlayerData调用的协议位置 在客户端中替换 之后客户端就可以调用服务端新增的数据了

Elasticsearch Ingest Pipelines

1. 前言 在将第三方数据源的数据导入到Elasticsearch中时&#xff0c;原始数据长什么样&#xff0c;索引后的文档就是什么样。文档数据结构不统一&#xff0c;导致后续数据分析时变得麻烦&#xff0c;以往需要额外写一个中间程序来读取原始数据&#xff0c;转换加工后再写入到…

Linux下Docker方式Jenkins安装和配置

一、下载&安装 Jenkins官方Docker仓库地址&#xff1a;https://hub.docker.com/r/jenkins/jenkins 从官网上可以看到&#xff0c;当前最新的稳定版本是 jenkins/jenkins:lts-jdk17。建议下在新的&#xff0c;后面依赖下不来 所以&#xff0c;我们这里&#xff0c;执行doc…

智绘城市地图:使用百度地图 API 实现智能定位

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

测网速小程序,纯前端

搜索&#xff1a;证寸照制作 源码介绍: 测网速小程序源码&#xff0c;是一款纯前端无需服务器的测网速小程序&#xff0c;依赖百度开发者中心js接口&#xff0c;真正的永久使用的小工具源码&#xff0c;很实用&#xff0c;可以单独运行&#xff0c;测网速很流畅~ 合法域名: ht…

深入理解 pnpm(Performant NPM) 的实现原理及其与 npm 的区别

深入理解 pnpm 的实现原理及其与 npm 的区别 在 JavaScript 生态系统中&#xff0c;包管理器是开发者日常工作中不可或缺的工具。npm&#xff08;Node Package Manager&#xff09;作为 Node.js 的默认包管理器&#xff0c;已经广泛应用于各种项目中。然而&#xff0c;随着项目…

力扣之接雨水(42)

刷题不在多&#xff0c;而在精。 这道题号称字节的保洁阿姨都能做出的。 方法一&#xff1a;动态规划 下面这幅图简直封神&#xff0c;看了下图我才做出来的。 两个方向遍历&#xff0c;然后取相同覆盖值-原始值&#xff08;heigth数组&#xff09; 这种方法更好理解。但是也有…

厨房老鼠数据集:掀起餐饮卫生监测的科技浪潮

厨房老鼠数据集&#xff1a;掀起餐饮卫生监测的科技浪潮 摘要&#xff1a;本文深入探讨了厨房老鼠数据集在餐饮行业卫生管理中的重要性及其相关技术应用。厨房老鼠数据集通过收集夜间厨房图像、老鼠标注信息以及环境数据&#xff0c;为深度学习模型提供了丰富的训练样本。基于…