Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

hi-mention

Package Overview
Dependencies
Maintainers
0
Versions
10
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

hi-mention

纯JS聊天框,兼容原生HTML/React/Vue等各种框架;支持@提及功能、插入富文本等多功能编辑器;内置H5和PC的交互样式

  • 2.2.0
  • npm
  • Socket score

Version published
Weekly downloads
3
decreased by-75%
Maintainers
0
Weekly downloads
 
Created
Source

Mention 提及

纯 JS 插件,无依任何赖,兼容原生 HTML 及各大前端框架,提供高自由度接口

  • 查看 demo 示例
  • QQ 群

安装

npm install hi-mention --save

引入

import HiMention from "hi-mention";

使用

// options非必要参数,可根据需要自行调整
new HiMention(element, options);

VUE 使用示例

<template>
  <div class="editor-content"></div>
</template>

<script lang="ts" setup>
  import { onMounted } from "vue";
  // 引入插件
  import HiMention from "hi-mention";
  // 引入插件样式
  import "hi-mention/index.css";

  onMounted(() => {
    new HiMention(".editor-content", {
      users: [
        { name: "张三", id: 1 },
        { name: "李四", id: 2 },
        { name: "王五", id: 3 },
        { name: "赵六", id: 4 },
        { name: "钱七", id: 5 },
        { name: "孙八", id: 6 },
        { name: "周九", id: 7 },
        { name: "吴十", id: 8 },
      ],
    })
      .on("focus", (e) => {
        console.log("focus", e);
      })
      .on("blur", (e) => {
        console.log("blur", e);
      })
      .on("change", (d) => {
        console.log("change", d?.html);
        msg.value = d?.html || "";
      });
  });
</script>

<style>
  .editor-content {
    width: 500px;
    height: 200px;
    border: 1px solid #ccc;
    padding: 5px 10px;
  }
</style>

Options 属性

属性名说明类型默认值
trigger触发字符string@
placeholder占位符string请输入
placeholderColor占位符颜色string#aaa
mentionColor提及用户颜色string#0090FF
users用户列表Array<User>[]
media媒体类型(PCH5 的用户列表展示有差异)PC/H5PC
idKeyUser对象id字段(该字段支持@搜索)stringid
nameKeyUser对象name字段(该字段支持@搜索)stringname
pingyinKeyUser对象pingyin字段(该字段支持@搜索)stringpingyin
avatarKeyUser对象avatar字段stringavatar
usersWdith用户列表宽度(media=PC时有效)string200px
usersHeight用户列表最大高度string200px

API

方法说明类型备注
setOptions设置options属性(options: Partial<MentionOptions>)=>this-
getOptions获取options属性()=>MentionOptions-
on监听事件(key:EventType,fn:(data?:any)=>void)=>this-
mentionUser提及用户(user:User)=>this-
clear清空输入框()=>this-
insertText在光标位置插入文本内容(text:string)=>this-
insertHtml在光标位置插入 HTML 内容(html:Element)=>this-
focus获取焦点、将光标移动到输入框末尾()=>this-
getData获取输入框内容()=>{html:string,text:string}-
getMentions获取输入框内提及的用户对象列表()=>Array<User>-

EventType

类型说明备注
input输入事件-
focus获取焦点-
blur失去焦点-
keydown键盘按下-
keyup键盘抬起-
change内容改变-
mention-user提及用户-

User 类型

  • 以下字段为推荐字段,若字段不存在,请使用idKeynameKeypingyinKeyavatarKey字段进行配置
字段名必须说明类型
id键(该字段支持@查询)string
name名字(该字段支持@查询)string
pingyin拼音(该字段支持@查询)string
avatar头像string
element用户列表中展示的元素,若不提供该字段,则使用默认样式Element

自定义

  • 如果内置功能如无法满足需求,可以通过继承 HiMention 组件,以下方法来实现自定义用户列表

HiMention 接口

接口名说明类型备注
initUserSelector方法:初始化用户选择器()=>void-
closeUserSelector方法:关闭用户选择器()=>void-
openUserSelector方法:打开用户列表(query:User)=>voidquery:为用户输入@时后面跟的查询字符串
onWordDelete方法:删除/退格(e: KeyboardEvent)=> boolean返回 true 阻止默认事件和触发其他事件
onMoveCursor方法:光标移动(e: KeyboardEvent)=> boolean返回 true 阻止默认事件和触发其他事件
onWordWrap方法:换行(e: KeyboardEvent)=> boolean返回 true 阻止默认事件和触发其他事件

HiUserSelector 接口

接口名说明类型备注
element属性:用户列表根元素HTMLElement-
open方法:打开用户列表(query:string)=>void-
close方法:关闭用户列表()=>void-
createUserItem方法:创建用户选项Element(user:User)=>Element-
  • 继承示例
// 引入插件
import HiMention, { HiUserSelector } from "hi-mention";
// 引入插件样式
import "hi-mention/index.css";

// 创建自定义用户选择器
class MyHiUserSelector extends HiUserSelector {
  element: HTMLElement = document.createElement("div"); // 这是用户列表的根元素
  constructor(props) {
    super(props);
  }

  open(query: string) {
    // 自定义打开列表逻辑
  }

  close() {
    // 自定义关闭列表逻辑
  }

  // 该方法返回的元素将被展示在默认用户列表中
  createUserItem(user) {
    const { name, avatar } = user;
    const img = document.createElement("img");
    img.src = avatar;
    img.style.width = "20px";
    img.style.height = "20px";
    img.style.marginRight = "5px";
    const span = document.createElement("span");
    span.innerText = name;
    const div = document.createElement("div");
    div.appendChild(img);
    div.appendChild(span);
    // 该元素将被当成选项展示在用户列表中
    return div;
  }
}

// 使用自定义选择器
class MyHiMention extends HiMention {
  constructor(props) {
    super(props);
  }

  // 初始化用户选择器
  initUserSelector() {
    this.userSelector = new MyHiUserSelector();
    // 监听鼠标在用户列表中按下事件,防止鼠标点击用户列表时,触发编辑器失去焦点事件
    this.userSelector.element.onmousedown = () => setTimeout(() => clearTimeout(this.blurtimeout), 100);
    // 监听选择用户事件
    this.userSelector.onSelectUser((user) => {
      this.mentionUser(user);
    });
  }

  // 打开用户选择器
  openUserSelector(query) {
    this.userSelector.open(query);
  }

  // 关闭用户选择器
  closeUserSelector() {
    this.userSelector.close();
  }
}

自定义换行示例

// 引入插件
import HiMention from "hi-mention";
// 引入插件样式
import "hi-mention/index.css";

// 使用自定义选择器
class MyHiMention extends HiMention {
  constructor(props) {
    super(props);
  }

  // 监听用户按下换行按键
  onWordWrap(e: KeyboardEvent): boolean {
    if (["Enter", "NumpadEnter"].includes(e.code)) {
      // 可重新设置快捷键
      // 调用内置换行方法
      this.wordWrap(); // 可重新设置换行逻辑
      // 返回true阻止默认事件和触发其他事件
      return true;
    }
    return false; // 没有自行换行,返回false
  }
}

更新日志

v2.2.0 2024-10-27
- 对v2.1.0版本BUG继续修复

v2.1.0 2024-10-26
- 修复剪切、复制、粘贴
- 修复移动光标
- 修复换行
- 修复删除
- 修复焦点
- 修复占位符展示异常
- 针对火狐浏览器做兼容处理

v2.0.1 2024-10-25
- 修复默认用户选择器切换用户异常

v2.0.0 2024-10-25
- 初始版本

Keywords

FAQs

Package last updated on 27 Oct 2024

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc