1.0.2 • Published 1 month ago

@tanzhenxing/zx-mention v1.0.2

Weekly downloads
-
License
MIT
Repository
-
Last release
1 month ago

ZxMention 提及组件

用于在输入中提及某人或某事,基于 Element Plus Mention 组件设计,适配 uni-app 平台。

功能特性

  • 🎯 支持 input 和 textarea 两种输入类型
  • 🔍 实时搜索过滤选项
  • 🎨 多种尺寸和样式配置
  • 📱 完美适配移动端和小程序
  • 🚀 高性能虚拟滚动支持
  • 🎪 丰富的自定义插槽
  • 🌍 多前缀字符支持
  • ⚡ 异步数据加载
  • 🎨 自定义标签内容渲染

基础用法

<template>
  <zx-mention
    v-model="value"
    :options="options"
    placeholder="请输入 @ 提及某人"
  />
</template>

<script setup>
import { ref } from 'vue'

const value = ref('')
const options = ref([
  { value: 'Alice', label: 'Alice' },
  { value: 'Bob', label: 'Bob' },
  { value: 'Charlie', label: 'Charlie' }
])
</script>

API

Props

参数说明类型默认值
modelValue / v-model绑定值string''
type输入框类型'input' | 'textarea''input'
options提及选项列表MentionOption[][]
prefix触发字段的前缀string | string[]'@'
split用于拆分提及的字符string' '
filter-option自定义筛选器选项逻辑boolean | Functiontrue
placement弹出位置'top' | 'bottom''bottom'
offset下拉面板偏移量number0
whole是否整体删除提及部分booleanfalse
check-is-whole自定义检查整体删除逻辑Functionnull
loading下拉面板加载状态booleanfalse
size输入框尺寸'small' | 'default' | 'large''default'
disabled是否禁用booleanfalse
placeholder占位符文本string'请输入内容'
maxlength最大输入长度number300
clearable是否可清空booleanfalse
max-height下拉面板最大高度number400

样式相关 Props

参数说明类型默认值
border-size边框大小string'1rpx'
border-color边框颜色string'#ececec'
border-active-color聚焦时边框颜色string'#2979ff'
border-radius边框圆角string'10rpx'

Events

事件名说明回调参数
input输入值改变时触发(event)
focus获取焦点时触发(event)
blur失去焦点时触发(event)
search搜索时触发(pattern: string, prefix: string)
select选择选项时触发(option: MentionOption, prefix: string)
clear清空时触发()
confirm确认时触发(仅input类型)(event)

Slots

插槽名说明参数
label自定义选项内容{ item: MentionOption, index: number }
loading自定义加载状态-
header下拉列表头部内容-
footer下拉列表底部内容-

Exposes

方法名说明参数
focus获取焦点()
blur失去焦点()
clear清空内容()
hideDropdown隐藏下拉面板()
showDropdown显示下拉面板()

类型定义

interface MentionOption {
  value: string
  label?: string
  disabled?: boolean
  [key: string]: any
}

使用示例

Textarea 类型

<zx-mention
  v-model="value"
  type="textarea"
  :options="options"
  placeholder="请输入内容"
/>

自定义标签

<zx-mention
  v-model="value"
  :options="options"
>
  <template #label="{ item }">
    <view style="display: flex; align-items: center;">
      <image :src="item.avatar" style="width: 40rpx; height: 40rpx; border-radius: 50%;" />
      <text style="margin-left: 12rpx;">{{ item.label }}</text>
    </view>
  </template>
</zx-mention>

异步加载

<template>
  <zx-mention
    v-model="value"
    :options="options"
    :loading="loading"
    @search="handleSearch"
  />
</template>

<script setup>
import { ref } from 'vue'

const value = ref('')
const options = ref([])
const loading = ref(false)

function handleSearch(pattern, prefix) {
  loading.value = true
  // 模拟异步请求
  setTimeout(() => {
    options.value = [
      { value: pattern + 'Alice', label: pattern + 'Alice' },
      { value: pattern + 'Bob', label: pattern + 'Bob' }
    ]
    loading.value = false
  }, 1000)
}
</script>

多前缀支持

<zx-mention
  v-model="value"
  :prefix="['@', '#']"
  :options="options"
  placeholder="输入 @ 提及用户,# 提及话题"
  @search="handleSearch"
/>

注意事项

  1. 组件基于 uni-app 开发,支持所有 uni-app 平台
  2. 样式单位使用 rpx,自动适配不同屏幕尺寸
  3. 下拉面板使用 position: absolute 定位,请确保父容器有正确的定位上下文
  4. 异步加载时建议使用 loading 状态提升用户体验