当前位置:首页 > VUE

vue的艾特功能实现

2026-03-06 18:41:34VUE

Vue 中实现 @ 提及功能

在 Vue 中实现 @ 提及功能通常需要结合文本输入框、事件监听和用户列表展示。以下是实现步骤:

1. 监听输入框内容变化

使用 v-model 绑定输入框内容,并监听输入事件。当用户输入 @ 时,触发用户列表显示。

<template>
  <div>
    <textarea v-model="content" @input="handleInput"></textarea>
    <div v-if="showUserList">
      <ul>
        <li v-for="user in filteredUsers" @click="selectUser(user)">
          {{ user.name }}
        </li>
      </ul>
    </div>
  </div>
</template>

2. 检测 @ 符号并过滤用户列表

vue的艾特功能实现

handleInput 方法中检测 @ 符号,并根据输入内容过滤用户列表。

<script>
export default {
  data() {
    return {
      content: '',
      showUserList: false,
      users: [
        { id: 1, name: '张三' },
        { id: 2, name: '李四' },
      ],
      filteredUsers: [],
    };
  },
  methods: {
    handleInput() {
      const cursorPos = this.$refs.textarea.selectionStart;
      const textBeforeCursor = this.content.substring(0, cursorPos);
      const atIndex = textBeforeCursor.lastIndexOf('@');

      if (atIndex !== -1) {
        const query = textBeforeCursor.substring(atIndex + 1);
        this.filteredUsers = this.users.filter(user =>
          user.name.includes(query)
        );
        this.showUserList = this.filteredUsers.length > 0;
      } else {
        this.showUserList = false;
      }
    },
    selectUser(user) {
      const cursorPos = this.$refs.textarea.selectionStart;
      const textBeforeCursor = this.content.substring(0, cursorPos);
      const atIndex = textBeforeCursor.lastIndexOf('@');

      this.content =
        this.content.substring(0, atIndex) +
        `@${user.name}` +
        this.content.substring(cursorPos);

      this.showUserList = false;
    },
  },
};
</script>

3. 添加样式和优化体验

vue的艾特功能实现

为下拉列表添加样式,并在点击外部时关闭列表。

<style>
ul {
  list-style: none;
  padding: 0;
  margin: 0;
  border: 1px solid #ccc;
  max-height: 150px;
  overflow-y: auto;
}
li {
  padding: 5px 10px;
  cursor: pointer;
}
li:hover {
  background-color: #f0f0f0;
}
</style>

4. 处理多行文本和复杂场景

如果需要支持多行文本或更复杂的场景,可以使用第三方库如 tributejsmention-vue。以下是使用 mention-vue 的示例:

import Vue from 'vue';
import Mentionable from 'mention-vue';
import 'mention-vue/dist/mention-vue.css';

Vue.use(Mentionable);
<template>
  <mentionable
    :items="users"
    :insert-space="false"
    @open="onOpen"
    @search="onSearch"
    @close="onClose"
  >
    <textarea v-model="content"></textarea>
  </mentionable>
</template>

通过以上方法,可以在 Vue 中实现基本的 @ 提及功能。根据项目需求,可以选择原生实现或使用现有库简化开发。

标签: 功能vue
分享给朋友:

相关文章

vue弹幕实现不重叠

vue弹幕实现不重叠

实现 Vue 弹幕不重叠的方法 CSS 定位与动画控制 通过绝对定位和动态计算弹幕轨道高度,确保弹幕在不同轨道上运行。每条弹幕占据固定高度的轨道,避免重叠。 // 弹幕轨道高度计算 const tr…

vue实现安全免登录

vue实现安全免登录

Vue 实现安全免登录的方案 免登录功能通常通过持久化认证状态(如 Token)实现,但需兼顾安全性。以下是基于 Vue 的常见实现方案: 基于 Token 的免登录 登录成功后存储 Token…

vue实现绑卡的原理

vue实现绑卡的原理

Vue 实现绑卡的原理 Vue 实现绑卡功能通常涉及前端表单处理、数据绑定、验证以及和后端 API 的交互。以下是实现绑卡功能的核心原理和步骤: 数据绑定与表单处理 Vue 通过 v-model 指…

vue组件实现

vue组件实现

Vue 组件实现基础 Vue 组件是 Vue.js 的核心特性之一,允许将 UI 拆分为独立、可复用的模块。组件的实现包括定义、注册、数据传递和生命周期管理等。 定义组件 组件可以通过单文件组件(.…

vue 实现权限

vue 实现权限

Vue 实现权限控制的方法 在 Vue 项目中实现权限控制通常涉及前端路由、组件和按钮级别的权限管理。以下是几种常见的实现方式: 路由权限控制 通过路由守卫实现权限验证,过滤用户无权访问的路由:…

vue 实现闪烁

vue 实现闪烁

Vue 实现闪烁效果的方法 方法一:使用 CSS 动画 在 Vue 组件中定义一个闪烁的 CSS 动画,通过绑定 class 或 style 来控制元素的闪烁效果。 <template>…