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

news2024/11/28 4:33:28
   <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>
参考说明 

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【前端】如何制作一个自己的网站(11)

接上文。 除了前面的颜色样式外&#xff0c;字体样式和文本样式也是网页设计中的重要组成部分。 合适的字体和文本排版&#xff0c;不仅可以使页面更加美观&#xff0c;也可以提升用户体验。接下来&#xff0c;我们先来看看CSS如何设置字体样式。 字体样式 同时设置了字体样…

经典算法整理(Go语言实现)

经典算法系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 第一章 回溯算法 第二章 贪心算法 第三章 动态规划 第四章 单调栈 第五章 图论 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可…

机器学习课程学习周报十七

机器学习课程学习周报十七 文章目录 机器学习课程学习周报十七摘要Abstract一、机器学习部分1. 变分推断/推理1.1 证据下界1.2 q ( z ) {q(z)} q(z)的选取 2. VAE2.1 Auto-Encoder的简单回顾2.2 为什么提出VAE2.3 VAE的数学原理 3. Diffusion Model的数学原理3.1 Training算法…

React(五) 受控组件和非受控组件; 获取表单元素的值。高阶组件(重点),Portals; Fragment组件;严格模式StrictMode

文章目录 一、受控组件1. 什么是受控组件2. 收集input框内容3. 收集checkBox的值4. 下拉框select总结 二、非受控组件三、高阶组件1. 高阶组件的概念 (回顾高阶函数)2. 高阶组件应用&#xff1a;注入props(1) 高阶组件给---函数式组件注入props(2) 高阶组件给---类组件注入prop…

开源的存储引擎--cantian

cantian 上次稼先社会活动之后&#xff0c;在北京签售的时候见到了三位参天的核心人物。我有感于他们的热情、务实和坦诚&#xff0c;我觉得还应该在深入的做一些事情。至少可以安装体验一下&#xff0c;做做推广。毕竟现在务实的产品不多了&#xff0c;很多都是浮躁的宣传。为…

从一个事故中理解 Redis(几乎)所有知识点

作者&#xff1a;看破 一、简单回顾 事故回溯总结一句话&#xff1a; &#xff08;1&#xff09;因为大 KEY 调用量&#xff0c;随着白天自然流量趋势增长而增长&#xff0c;最终在业务高峰最高点期占满带宽使用 100%。 &#xfeff; &#xfeff; &#xff08;2&#xff…

如何安装MySql

一.卸载MySql 1.1安装版 进入“控制面板”&#xff0c;将有关“mysql”的一切都删除&#xff0c;再到“C:\ProgramData”中&#xff0c;将“mysql”文件夹删除。 1.2压缩版 先在cmd中停止mysql服务 net stop mysql8 再删除解压“mysql”文件夹即可 二.安装MySql 2.2安装版…

RabbitMQ进阶_可靠性

文章目录 一、 发送者的可靠性1.1、 生产者重试机制1.2、 生产者确认机制1.2.1、确认机制理论1.2.2、确认机制实现1.2.2.1、定义ReturnCallback1.2.2.2、定义ConfirmCallback 二、 MQ的可靠性2.1、 数据持久化2.1.1、 交换机持久化2.1.2、 队列持久化2.1.3、 消息持久化 2.2、 …

端点物联网学习资源合集

端点物联网 学习资源合集 导航 1. 物联网实战--入门篇 文章链接 简介&#xff1a;物联网是一个包罗万象的行业和方向&#xff0c;知识碎片严重&#xff0c;本系列文章通过 边学边用 的思想&#xff0c;逐步建立学习者的信心和兴趣&#xff0c;从而进行更深入透彻的学习和探索…

IDEA如何用maven打包(界面和命令两种方式)

前言 我们在使用IDEA开发时&#xff0c;如果是springboot项目的话&#xff0c;一般是用maven来管理我们的依赖的。然后&#xff0c;当我们开发完成之后&#xff0c;就需要打包部署了。 那么&#xff0c;我们应该如何打包呢&#xff1f; 如何打包&#xff08;jar包&#xff09…

scrapy案例——链家租房数据的爬取

案例需求&#xff1a; 1.使用scrapy爬虫技术爬取链家租房网站&#xff08;成都租房信息_成都出租房源|房屋出租价格【成都贝壳租房】 &#xff09;的数据&#xff08;包括标题、价格和链接&#xff09; 2.利用XPath进行数据解析 3.保存为本地json文件 分析&#xff1a; 请…

(AtCoder Beginner Contest 375)B - Traveling Takahashi Problem

&#xff08;AtCoder Beginner Contest 375&#xff09;B - Traveling Takahashi Problem 题目大意 按顺序给定n个点 ( x i , y i ) (x_i,y_i) (xi​,yi​) 求按顺序走过这n个点并回到原点的总距离 任意两点之间的距离是欧几里得距离 思路 按照题意模拟即可&#xff0c;时间…

GPTLink 源码快速搭建 ChatGPT 商用站点

GPTLink 源码快速搭建 ChatGPT 商用站点&#xff0c;基于PHP(Hyperf) Vue开发的&#xff0c;可以通过docker轻松部署&#xff0c;并且有一个支持PC和移动端的完美UI控制台。该项目提供了许多强大的功能&#xff0c;包括自定义付费套餐、一键导出对话、任务拉客和用户管理等等。…

NeRF三维重建—神经辐射场Neural Radiance Field(二)体渲染相关

NeRF三维重建—神经辐射场Neural Radiance Field&#xff08;二&#xff09;体渲染相关 粒子采集部分 粒子采集的部分我们可以理解为&#xff0c;在已知粒子的情况下&#xff0c;对图片进行渲染的一个正向的过程。 空间坐标(x,y,z&#xff09;发射的光线通过相机模型成为图片上…

分布式篇(分布式事务)(持续更新迭代)

一、事务 1. 什么是事务 2. 事务目的 3. 事务的流程 4. 事务四大特性 原子性&#xff08;Atomicity&#xff09; 一致性&#xff08;Consistency&#xff09; 持久性&#xff08;Durability&#xff09; 隔离性&#xff08;Isolation&#xff09; 5. MySQL VS Oracle …

云黑系统全解无后门 +搭建教程

这套系统呢是玖逸之前南逸写的一套云黑系统&#xff0c;功能带有卡密生成和添加黑名单等&#xff0c;源码放在我的网盘里已经两年之久&#xff0c;由于玖逸现在已经跑路了所以现在发出来分享给大家&#xff0c;需要的可以自己拿去而开&#xff0c;反正功能也不是很多具体的自己…

免费字体二次贩卖;刮刮乐模拟器;小报童 | 生活周刊 #4

Raycast 的两款在线工具 Raycast 公司出品&#xff0c;必属精品&#xff0c;之前的代码转图片工具&#xff0c;交互和颜值都做得很漂亮 现在又新出了一个 图标制作器&#xff0c;一键制作美观好看的图标 猫啃网 没想到像【汇文明朝体】这样免费的字体都被人拿来当成【打字机字…

C# WinForm 用名字name字符串查找子控件

工作上遇到界面控件太多&#xff0c;需要对一些控件批量处理。虽然可以用代码批量控制&#xff0c;但要么是建立数组集合把所有要处理的控件放进去循环处理&#xff0c;要么是一个一个列出来修改属性。 但我大多数要求改的控件命名上是有规律的&#xff0c;所有只需要循环拼接字…

使用 MongoDB 构建 AI:利用实时客户数据优化产品生命周期

在《使用 MongoDB 构建 AI》系列博文中&#xff0c;我们看到越来越多的企业正在利用 AI 技术优化产品研发和用户支持流程。例如&#xff0c;我们介绍了以下案例&#xff1a; Ventecon 的 AI 助手帮助产品经理生成和优化新产品规范 Cognigy 的对话式 AI 帮助企业使用任意语言&a…

卸载 Git

目录 打开 Geek找到 Git右键卸载 Git卸载完成等待扫描注册表点击完成清除Git在本地的配置文件 打开 Geek 找到 Git 右键卸载 Git 卸载完成 等待扫描注册表 点击完成 已经删除完毕 清除Git在本地的配置文件 进入 C:\Users\用户名 删除框起来的配置文件 &#x1f447; 源码资料…